【问题标题】:MySQL contains variableMySQL 包含变量
【发布时间】:2013-04-30 07:25:54
【问题描述】:

我在 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” .

【问题讨论】:

  • 停止使用mysql_query()!请改用 MySQLi 或 PDO。
  • 参考您的编辑,只有那些在数据库中不存在的才会打印出来?
  • 哎呀,不好的例子,没有注意。固定。
  • 并停止生产注射。使用已弃用的mysql_*()(在适当的情况下使用mysql_real_escape_string())甚至可以实现这一点,而使用其他两个非弃用的扩展(例如)更简单。 G。带有准备好的语句。

标签: php mysql loops foreach


【解决方案1】:

将代码改成如下:

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

例如在 $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 注入)

【讨论】:

  • +1 但也许可以提供一个对结果进行分组的示例,而不是在每次数组迭代时执行 SQL 查询?
  • 我不明白。问题不在于它没有遍历结果。应该有 0 或 1 个结果。问题是没有打印 arr 中的每个名称。仅打印 arr 中的姓氏(如果最后一个不在表格中,则不打印)。
  • 查看我的编辑。你不是在查询01。 0 或 1 是什么意思?
  • 从给定名称查询的行数,如果该数字为 0,则不应打印任何内容。如果行数为 1,则应打印名称。
  • 再次根据您的评论修改了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
相关资源
最近更新 更多