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查询只打印第一行的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL 查询中使用 avg() 函数只返回一行?

SQL 在 select 子查询中只返回一行或 null

tcpdf sql 查询只检索一行

当多个 SQL 键时,来自实体框架的循环 SQL 查询返回第一行

如何在 SQL 查询中选择每个组的第一行?

有重复行,查询时只保留最新一行的sql