我想显示来自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>";
}
答案 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)
答案 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>";
}
这样您就不必继续向数据库发送查询。