【问题标题】:Exploding in php在php中爆炸
【发布时间】:2013-01-22 10:15:11
【问题描述】:

在我的“用户”表中有“朋友”,

像这样:

+----+------+---------+
| id | name | friends |
+----+------+---------+
|  1 | a    | 0,1,2   |
|  2 | b    | 0,1,3   |
|  3 | c    | 0,1     |
+----+------+---------+

如何使用explode函数逐一获取好友id(不是0,1,2),用逗号(,)隔开;

如何选择 ID? (示例):

$sql = Select id from users where id = (exploded)

if (mysql_num_rows($sql) > 0 ) {
  $TPL->addbutton('Unfriend');
}else{
  $TPL->addbutton('Add as Friend')
}

【问题讨论】:

  • 一一是什么意思?
  • Nooooooooooo!!!!正确规范您的数据库....否则您将保证自己和其他任何需要查看您的系统的人一生都会遭受痛苦和痛苦....更不用说小猫在您制作的那一刻就死了决定将所有朋友数据存储在用户表的列中
  • 另外,请注意mysql_xxx() 函数已过时且不安全。已弃用,不推荐使用。您应该尽快更改代码以使用 mysqli 或 PDO。

标签: php mysql explode


【解决方案1】:

这里的解决方案实际上是对您的数据库结构稍作改动。我建议您创建一个“多对多”关系表,其中包含用户引用的所有用户朋友。

+---------+-----------+
| user_id | firend_id |
+---------+-----------+
|       1 |         2 |
|       1 |         3 |
|       1 |         4 |
|       2 |         1 |
|       2 |         5 |
+---------+-----------+

如果您在一个字段中存储值列表,那么这是您的数据库设计不是很优化的第一个迹象。如果您需要搜索数值,最好在该字段上放置索引以提高效率并使数据库为您工作,而不是相反:)

然后要确定用户是否是某人的朋友,您将查询此表 -

SELECT * FROM users_friends WHERE 
  `user_id` = CURRENT_USER AND `friend_id` = OTHER_USER

要获得某个用户的所有朋友,您可以这样做 -

SELECT * FROM users_friends WHERE `user_id` = CURRENT_USER

【讨论】:

  • +1 虽然我建议也为该表设置一个唯一的 ID 字段以及两个链接 ID 字段。
  • @SDC - id 字段在这里有点多余。你永远不会真正将它用于任何事情。您所要做的就是确保这两个字段是唯一的,以防止重复。
  • @muh - 很高兴为您提供帮助!编码愉快!
【解决方案2】:

只是一个简单的例子,让您清楚如何进行:

// Obtain an array of single values from data like "1,2,3"...
$friends = explode(',', $row['friends']);

然后,回到您的查询中:

// Obtain back data like "1,2,3" from an array of single values...
$frieldslist = implode(',', $friends);
$sql = "SELECT * FROM users WHERE id IN ('" . $frieldslist . "')";

【讨论】:

  • 我们可以内爆(分离)一个已经爆炸的东西(去掉逗号)
【解决方案3】:

要从你的字符串explode 中获取一个 if id 数组,可以像这样使用

$my_array = explode("," , $friends);

但您可能会更好地使用 mysql IN 子句

$sql = "Select id from users where id in (".$row['friends'].")";

【讨论】:

  • IN 子句很好,只要friends 字段的内容保证只包含逗号分隔的数值。如果有最轻微的污染可能性,那么像这样的 SQL 字符串可能会成为 SQL 注入攻击的机会。即使您认为它是安全的,您也会造成一种情况,即如果攻击者可以将不安全的值放入其中,您就会面临进一步的攻击。因此,我会说最好不要直接在现场使用IN。最好进行防御性编码,甚至避免潜在的攻击。
  • 当然,you are correct;我真的只是将 op 指向 in 子句以让 mysql 完成一些工作。保持警惕的孩子!
【解决方案4】:

只是一个快速的想法。更改数据库的表。过一段时间肯定会出现很多问题。

你可以有这样的东西。

    id      hasfriend
    1          2
    1          3
    2          1 no need to be here (You have this already) 
    2          4 
       .....

您可以通过使用索引来实现唯一性或编程。你可能会想到更好的东西。将您解决问题的方法改为这样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-13
    • 2017-02-18
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    相关资源
    最近更新 更多