MySQL包含变量

时间:2013-04-30 07:25:55

标签: php mysql loops foreach

我在PHP中有一个循环遍历一组名称(和相应数量)的数组。我想打印在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”

1 个答案:

答案 0 :(得分: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

e.g。在$ arr中包含“peter”,“mary”,“ken”,查询将是:

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

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

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

得到你想要的东西。


更新(再次):根据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注入)