0

出于某种原因,当我通过 PHP 运行此查询时,它返回 8 行,而实际上我的数据库中只有 2 行,而当我通过 phpmyadmin 运行它时,它显然返回 2。

 $sql = "SELECT url FROM bookmarks,users WHERE bookmarks.user_id = {$session->user_id}";
 $resultado = $db->query($sql);

 echo mysql_num_rows($resultado);

我要打破我的头了!

4

2 回答 2

7

您的查询产生cartesian product是因为您没有提供两个表之间的关系:bookmarks并且users

SELECT url 
FROM   bookmarks 
       INNER JOIN users 
          ON bookmarks.COLNAME = users.COLNAME
WHERE  bookmarks.user_id = '$session->user_id'

whereCOLNAME是定义表如何相互关联或表应如何链接的列。

要进一步了解有关联接的更多信息,请访问以下链接:

作为旁注,SQL Injection如果变量的值(s)来自外部,则查询很容易受到攻击。请看下面的文章,了解如何预防。通过使用PreparedStatements,您可以摆脱在值周围使用单引号。

于 2013-02-15T05:32:53.240 回答
3

正如 JW 指出的那样,您正在生产笛卡尔积——您没有加入针对用户的书签。这就是为什么你要复制行。

话虽如此,您根本不需要在上述查询中加入用户:

"SELECT url FROM bookmarks WHERE bookmarks.user_id = {$session->user_id}"

祝你好运。

于 2013-02-15T05:37:55.013 回答