2013-04-30 97 views
0

我有一个PHP中的数组,循环一组名称(和一个相应的数量)。我想打印在MYSQL数据库表(我已成功连接)中找到的那些表。我目前使用的代码是:MySQL包含变量

foreach ($arr as $name => $quan) { 
$query = "SELECT * FROM table WHERE name='$name'"; 
$result = mysql_query($query) or die(mysql_error()); 
if (mysql_num_rows($result) > 0) { 
    $row = mysql_fetch_array($result); 
    echo $quan." ".$row['name']. "\n"; 
} 
} 

由于某些原因,这只会打印数组中的最后一个数量和名称。帮帮我? 例如,如果数组的键值对为{A-4,B-2,C-3},并且表中包含{A,B,D}作为名称...它将只打印“2 B ”。

+2

停止使用'mysql_query()'!改用MySQLi或PDO。 – Raptor 2013-04-30 07:26:40

+0

是指你的编辑,只有那些不存在的数据库才会打印出来? – Raptor 2013-04-30 07:42:23

+0

哎呀,不好的例子,没有注意。固定。 – user1535846 2013-04-30 07:46:43

回答

4

更改代码如下:

foreach ($arr as $name => $quan) { 
    $query = "SELECT * FROM table WHERE name='$name'"; 
    $result = mysql_query($query) or die(mysql_error()); 
    if (mysql_num_rows($result) > 0) { 
    while($row = mysql_fetch_array($result)) { 
     echo $quan." ".$row['name']. "\n"; 
    } 
    } 
} 

你必须通过结果循环。顺便说一句,停止使用mysql_query()!改用MySQLi或PDO(并注意SQL注入;您可以使用mysqli_real_escape_string()来处理输入参数)。对于库MySQLi实现,那就是:

foreach ($arr as $name => $quan) { 
    $query = "SELECT * FROM table WHERE name='$name'"; 
    $result = mysqli_query($query) or die(mysqli_error()); 
    if (mysqli_num_rows($result) > 0) { 
    while($row = mysqli_fetch_array($result)) { 
     echo $quan." ".$row['name']. PHP_EOL; 
    } 
    } 
} 

而且相当"\n",我更喜欢使用PHP_EOL(如上图所示)


而作为意见认为,该SQL语句可以执行一次,如如下:

$flipped_array = array_flip($arr); // flip the array to make "name" as values" 
for($i = 0; $i < count($flipped_array); $i++) { 
    $flipped_array[$i] = '\'' . $flipped_array[$i] . '\''; // add surrounding single quotes 
} 
$name_list = implode(',', $arr); 
$query = "SELECT * FROM table WHERE name IN ($name_list)"; 
// ... omit the followings 

eg在$ ARR包含 “彼得”, “玛丽”, “肯”,查询将是:

SELECT * FROM table WHERE name IN ('peter','mary','ken') 

旁注:但我不明白您的查询。您只能从查询中获取名称?你可以检查行数,或者你甚至可以按名称分组,例如:

SELECT name, COUNT(*) AS cnt FROM table GROUP BY name ORDER BY name 

得到你想要的。


UPDATE(再次):基于OP的评论,这里是解决方案:

$flipped_array = array_flip($arr); // flip the array to make "name" as values" 
for($i = 0; $i < count($flipped_array); $i++) { 
    $flipped_array[$i] = '\'' . $flipped_array[$i] . '\''; // add surrounding single quotes 
} 
$name_list = implode(',', $arr); 
$query = "SELECT name, COUNT(*) AS cnt FROM table WHERE name IN ($name_list) GROUP BY name HAVING COUNT(*) > 0 ORDER BY name"; 
$result = mysqli_query($query) or die(mysqli_error()); 
if (mysqli_num_rows($result) > 0) { 
    while($row = mysqli_fetch_array($result)) { 
    echo $quan." ".$row['name']. ": " . $row['cnt'] . PHP_EOL; 
    } 
} 

上面的查询将显示出现在仅表名。不在表中的名字将不会显示。现在完整的代码(再次注意SQL注入)

+3

+1但也许提供一个示例,将结果分组,而不是每次迭代数组都执行SQL查询? – webnoob 2013-04-30 07:29:03

+0

是&同意,将其添加。 – Raptor 2013-04-30 07:30:23

+0

我不明白。问题不在于它不循环结果。应该有0或1个结果。问题是,arr中的每个名称都不会被打印。只打印arr中的姓氏(或者没有,如果最后一个不在表格中)。 – user1535846 2013-04-30 07:36:22