Sql查询只打印第一行

时间:2009-06-15 18:44:56

标签: php sql mysql

我在php中编码,代码从数组中获取数据以从mysql数据库中获取其他数据。因为我需要来自两个不同表的数据,所以我使用嵌套的while循环。但是下面的代码总是只打印出来(echo“a:”。$ data3 [2];或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];
            }
        }
    }
}

2 个答案:

答案 0 :(得分:3)

首先,改进您的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时,您可能只会撤回一行。话虽这么说,我不知道有多少$ key在$ stuff中,但如果它旋转一次,那么它将是一个。

你可能最好迭代$ 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)

这将为您提供一个包含完整列表的结果集,而不是向DB发送一堆SELECT查询。善待您的数据库,请尽可能使用基于集合的操作。 MySQL会很感激。

我还要指出,好像你正在使用文本主键。整数,增量键最适合作为PK,我强烈建议你使用它们!

答案 1 :(得分:2)

您应该在这两个表之间使用JOIN。它是使用SQL的正确方法,它可以更快地工作。在循环中执行额外的查询是不好的做法,比如将循环不变代码放在循环中。