sql查询只打印第一行
Posted
技术标签:
【中文标题】sql查询只打印第一行【英文标题】:Sql query only printing first row 【发布时间】:2009-06-15 18:44:55 【问题描述】:我在 php 中编码,代码从数组中获取数据以从 mysql 数据库中获取附加数据。因为我需要来自两个不同表的数据,所以我使用嵌套的 while 循环。但是下面的代码总是只打印一次 (echo "a: " . $data3[2]; or echo "b: " . $data3[2];) 一次:
foreach($stuff as $key)
$query3 = "SELECT * FROM foobar WHERE id='$key'";
$result3 = MySQL_query($query3, $link_id);
while ($data3 = mysql_fetch_array($result3))
$query4 = "SELECT * FROM foobar_img WHERE id='$data3[0]'";
$result4 = MySQL_query($query4, $link_id);
while ($data4 = mysql_fetch_array($result4))
$x += 1;
if ($x % 3 == 0)
echo "a: " . $data3[2];
else
echo "b: " . $data3[2];
【问题讨论】:
这看起来确实是 sql 注入的主要候选者。啧啧。啧啧。 【参考方案1】:首先,改进你的 SQL:
SELECT
img.*
FROM
foobar foo
INNER JOIN foobar_img img ON
foo.id = img.id
WHERE
foo.id = $key
您只需遍历一个数组。
此外,您实际上只选择了一行,因此吐出一行是预期的行为。
另外,请使用mysql_real_escape_string()防止SQL注入:
$query3 = "SELECT * FROM foobar WHERE id='" .
mysql_real_escape_string($key) . "'";
更新:正如 Dan 所暗示的,请在您的 MySQL 控制台中运行此查询以获取结果集,这样您就知道自己在玩什么。当您将查询限制为一个 ID 时,您可能只会拉回一行。话虽如此,我不知道 $stuff 中有多少个 $key,但如果它旋转一次,那么它将是一个。
您最好遍历 $stuff 并为您的 SQL 构建一个 IN 子句:
$key_array = "";
foreach($stuff as $key)
$key_array .= ",'" . mysql_real_escape_string($key) . "'";
$key_array = substr($key_array, 1);
...
WHERE foo.id IN ($key_array)
这将为您提供一个包含完整列表的结果集,而不是向数据库发送一堆 SELECT 查询。善待您的数据库,并尽可能使用基于集合的操作。 MySQL 将不胜感激。
我还要指出,它看起来好像您正在使用文本主键。整数、增量密钥最适合用作 PK,我强烈建议您使用它们!
【讨论】:
为了更清楚一点,"SELECT * FROM foobar WHERE id='$key'" 只选择 $key 设置为的行 我需要使用两个表中的数据!您的示例有效,但我无法使用 foo 访问数据,可以吗? @Hadorkugh:如果您打算在您的应用程序中使用 SQL,那么您非常需要熟悉 SQL。这就是所谓的内连接,它结合了两个表的结果,而且非常普遍。 SQL 的强大之处在于它能够非常有效地连接和操作数据集。您需要以基于集合的方式开始思考,然后才能了解 SQL。请参阅此站点以获取帮助您了解 SQL 的教程:sqlcourse.com/intro.html 是的,我需要阅读 sql。但现在我需要继续努力,按时完成并交付。 @Hadorkugh:那你就任由互联网摆布了。以上是克服这一障碍所需的代码。请在某个时候查看并理解它,因为它充满了 Web 开发的重要和基本概念。【参考方案2】:您应该在这两个表之间使用 JOIN。它是使用 SQL 的正确方法,而且运行速度会更快。在循环中执行额外查询是不好的做法,例如将循环不变代码放在循环中。
【讨论】:
以上是关于sql查询只打印第一行的主要内容,如果未能解决你的问题,请参考以下文章