【问题标题】:How to display results from mysqli prepared statement?如何显示mysqli准备好的语句的结果?
【发布时间】:2020-06-19 17:30:55
【问题描述】:

正在研究这一点 PHP(刚刚开始并一直在查看文档)。我在另一个页面上有一个表单,一切都正确传递,查询正在返回结果(它旨在搜索并返回用户搜索的结果)。行数显示正确,因此结果正确,但我尝试过的几个选项未能显示结果。我只想显示返回行的结果。此外,如果有任何关于如何简化准备语句和绑定的建议,我还没有找到大量使用 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>";
?>

【问题讨论】:

    标签: php mysqli


    【解决方案1】:

    我同意尼克所说的。您的主要错误是混淆了 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 子句中有两次名字

    【讨论】:

      【解决方案2】:

      您有几个问题。第一个是您正在绑定 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 中将% 添加到参数once 的任一侧(即$keywords = "%$keywords%";)并且只使用LIKE ? 而不是5 个LIKE CONCAT('%',?,'%')查询。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-01
        • 2012-12-01
        • 2021-11-20
        • 2011-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多