如何显示来自mysqli prepared语句的结果



处理这部分PHP(刚刚开始,并且已经查看了文档(。我在另一个页面上有一个表单,所有内容都正确通过,查询正在返回结果(它旨在搜索并返回用户搜索的结果(。行数显示正确,因此结果正确,但我尝试的几个选项都无法显示结果。我只想显示返回行的结果。此外,如果有任何关于如何简化prepare语句和绑定的建议,我还没有找到大量像下面这样使用LIKE和%搜索多列的例子。感谢

<?php
echo "<div class='result-count'>";
if(isset($_POST['keywords'])){
$keywords = $con->escape_string($_POST['keywords']);
#$keywords = preg_replace("#[^0-9a-z]#i","", $keywords);
$query = $con->prepare(" SELECT firstname, lastname, phone, email
FROM users
WHERE firstname LIKE CONCAT('%',?,'%')
OR lastname LIKE CONCAT('%',?,'%')
OR firstname LIKE CONCAT('%',?,'%')
OR phone LIKE CONCAT('%',?,'%')
OR email LIKE CONCAT('%',?,'%')
");
$query->bind_param("sssss", $keywords, $keywords, $keywords, $keywords, $keywords);
$query->execute();
$query->store_result();
$num_of_rows = $query->num_rows;
#WORKS ABOVE ^
$query->bind_result($id, $first_name, $last_name, $phone, $email, $address);
#  echo $keywords ;
if($num_of_rows){
while($r = $query->fetch()){
echo $r->user_id;
}
}
else {
echo $num_of_rows . ' results found.';
}
}
echo "</div>";
?>

您有几个问题。第一个是绑定了6个结果,但查询只返回4个。第二个是mysqli_stmt::fetch只是返回一个指示成功/失败的布尔值,因为所有结果数据都被提取到绑定的结果参数中。对于您的查询,您需要执行以下操作:

$query->bind_result($first_name, $last_name, $phone, $email);
while ($query->fetch()) {
echo $first_name, $last_name, $phone, $email;
}

注:

  1. 由于您使用的是参数化查询,因此不需要在输入中使用escape_string
  2. 在PHP中,将%添加到参数的任一侧一次更有效(即$keywords = "%$keywords%";(,并且在查询中只使用LIKE ?而不是LIKE CONCAT('%',?,'%')的5个实例
我同意尼克的话。您的主要错误是混淆了bind_result()/fet ch()的工作原理。因此,我建议使用fetch_all()。它将所有结果读取到PHP中的一个简单多维数组中。然后,您可以像其他任何数组一样循环它。
<?php
echo "<div class='result-count'>";
if (isset($_POST['keywords'])) {
$keywords = '%' . $_POST['keywords'] . '%';
$query = $con->prepare(" SELECT firstname, lastname, phone, email
FROM users
WHERE firstname LIKE ?
OR lastname LIKE ?
OR firstname LIKE ?
OR phone LIKE ?
OR email LIKE ?
");
$query->bind_param("sssss", $keywords, $keywords, $keywords, $keywords, $keywords);
$query->execute();
$users = $query->get_result()->fetch_all(MYSQLI_ASSOC);
#  echo $keywords ;
if ($users) {
foreach ($users as $r) {
echo $r['firstname'];
}
} else {
echo '0 results found.';
}
}
echo "</div>";

其他要点:

  • 不要使用escape_string()
  • 你不需要num_rows
  • WHERE子句中有两次名字

最新更新