foreach循环中的MySQL查询

时间:2011-08-30 09:06:36

标签: php mysql foreach

我想显示来自db的所有短信id=$e$err是一个数组)。
将查询插入foreach循环,它运行良好,但它做了额外的工作(查询数组的每个值) 有没有其他方法可以做到这一点(我的意思是从foreach循环中提取查询)? 我的代码看起来像这样。

foreach ($err as $e) 
{
$result = $db -> query("SELECT * from err_msgs WHERE id='$e'");
$row = $result -> fetch_array(MYSQLI_BOTH);
echo "<li><span>".$row[1]."</span></li>";
}

4 个答案:

答案 0 :(得分:4)

使用implode()执行此操作会更有效率,因为它只会导致一次数据库查询。

if (!$result = $db->query("SELECT * FROM `err_msgs` WHERE `id`='".implode("' OR `id`='",$err)."'")) {
  echo "Error during database query<br />\n";
  // echo $db->error(); // Only uncomment this line in development environments. Don't show the error message to your users!
}
while ($row = $result->fetch_array(MYSQLI_BOTH)) {
  echo "<li><span>".$row[1]."</span></li>\n";
}

答案 1 :(得分:1)

检查SQL IN clause

答案 2 :(得分:1)

首先,一些讲座:将字符串直接嵌入到查询中会导致您在某些时候出现问题(SQL注入相关的问题要准确),尽可能避免这种情况。就个人而言,我使用PDO PHP库,它允许您绑定参数而不是构建字符串。

关于你的问题,我不确定我是否理解过。你说它做了额外的工作,你的意思是它以低效的方式返回正确的结果吗?如果是这样,那么PDO也可以解决这个问题。这是想法。

第1步:准备好您的陈述,将占位符放在您当前拥有'$ e'的位置 第2步:循环遍历$ err,在循环体中,您将占位符设置为$ e的当前值

通过执行此操作,您不仅可以解决SQL注入问题,还可以避免每次执行时必须解析和优化查询的开销(尽管请记住,这可能不是特定的开销)情况)。

一些实际代码如下所示:

// Assume that $dbdriver, $dbhost and $dbname have been initialised
// somewhere. For a mysql database, the value for $dbdriver should be
// "mysql".

$dsn = "$dbdriver:host=$dbhost;dbname=$dbname";
$dbh = new PDO($dsn, $dbuser, $dbpassword); 

$qry = "SELECT * from err_msgs WHERE id = :e"
$sth = $dbh->prepare($qry);

foreach ($err as $e) {
    $sth->bindParam(":e", $e);
    $sth->execute();
    $row = $sth->fetch();

    // Prints out the *second* field of the record
    // Note that $row is also an associative array so if we
    // have a field called id, we could use $row["id"] to 
    // get its value
    echo "<li><span>".$row[1]."</span></li>";
}

最后一点,如果你想简单地执行一次查询,而不是在循环中执行它,这是可能的,但同样可能不会产生任何性能改进。这可以使用IN语法实现。例如,如果我对集合{5,7,21,4,66,9}中id的记录感兴趣,我会这样做:

SELECT * from err_msgs WHERE id IN(5,7,21,4,76,9)

我认为没有一种使用PDO绑定列表的简洁方法,因此您将使用循环来构建字符串,然后在循环之后执行查询。请注意,以这种方式制定的查询不太可能为您提供任何明显的性能提升,但它确实取决于您的具体情况,您只需要尝试一下。

答案 3 :(得分:0)

你可以通过

更简单地做到这一点
$err_csv = implode("','",$err);
$sql = "SELECT FROM err_msgs WHERE id IN ('$err_csv')";
$result = $db -> query($sql);
while ($row = $result -> fetch_array(MYSQLI_BOTH)) 
{
   echo "<li><span>".$row[1]."</span></li>";
}

这样您就不必继续向数据库发送查询。

链接:
http://php.net/manual/en/function.implode.php