我在 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:
SELECT
img.*
FROM
foobar foo
INNER JOIN foobar_img img ON
foo.id = img.id
WHERE
foo.id = $key
您只需遍历一个数组。
此外,看起来您实际上只选择了一行,因此吐出一行是预期的行为。
此外,请使用 mysql_real_escape_string() 防止 SQL 注入(inject):
$query3 = "SELECT * FROM foobar WHERE id='" .
mysql_real_escape_string($key) . "'";
更新:正如 Dan 所暗示的那样,请在您的 MySQL 控制台中运行此查询以获取结果集,这样您就知道您在玩什么。当您将查询限制为一个 ID 时,您可能只会返回一行。也就是说,我不知道 $stuff 中有多少个 $keys,但如果它旋转一次,那么它就是一个。
您最好遍历 $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 将不胜感激。
我还要指出,它看起来好像您正在使用文本主键。整数、增量 key 最适合用作 PK,我强烈建议您使用它们!
关于php - SQL查询只打印第一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/997671/