【问题标题】:Getting multiple rows from a mysql query with prepared statements?使用准备好的语句从 mysql 查询中获取多行?
【发布时间】:2014-02-16 02:43:12
【问题描述】:

我在准备好的语句上浏览了一些tutorials,但我不知道如何循环遍历包含多行的结果。我习惯了

的程序风格
while($row = mysqli_fetch_array($result))

但是,我终其一生都无法弄清楚如何使用准备好的语句格式来做到这一点。

if($stmt = $mysqli->prepare("SELECT * FROM `Products` WHERE name LIKE '%?%'")){

        $stmt->bind_param("s", $query); //query is $_GET['query'], user input

        $stmt->execute();
        $result = null;
        $stmt->bind_result($result);

        while($stmt->fetch()){ //problematic code...
            echo $result;
        }

        $stmt->close();
}

我如何遍历 PHP 中准备好的语句 SQL 查询产生的多行?

编辑(根据要求的新代码):

/* Create a prepared statement */
    if($stmt = $mysqli->prepare("SELECT name, price, description, file FROM `Products` WHERE name LIKE '%?%'")){

        $stmt->bind_param("s", $query) or die('bind_param');
        $query = trim(htmlspecialchars($_GET['query']));
        $stmt->execute() or die('execute');
        $stmt->bind_result($name, $price, $description, $file) or die('bind_result');


        while($stmt->fetch()){
            echo $name;
        }

        $stmt->close();
    }

【问题讨论】:

  • 您必须定义所有要返回的字段,然后您需要为$stmt->bind_result($result); 处的每个字段分配一个变量,例如,如果您想检索产品名称、年龄,您会这样做$stmt->bind_result($name,$age); 然后你可以echo $name, " - ", $age, "\n; 并且在你的查询中它们必须像SELECT name, age FROM 一样存在。有一种替代方法可以返回所有内容,但它不仅过于复杂而且在大多数情况下很少需要,并且如果您只想返回 1 或 2 个字段,则会给您带来不必要的开销。
  • @Prix 我将语句更改为“SELECT name, price, description, file FROM ...”并绑定到 $stmt->bind_result($name, $price, $description, $file)但是当我尝试回显 $name 时,在 while 循环中,没有任何反应。我在 phpmyadmin 中运行此查询以进行双重检查,它返回行。
  • 您能否使用您正在使用的新代码更新您的问题,以便我查看?还要为您的其他事情使用错误处理程序,例如 bindparam、execute,因为它们也可能会失败。也像这样将 % 移动到 bindparam:$stmt->bind_param("s", '%'.$query.'%');
  • @Prix - 添加了新的错误处理程序,它们表明我在 bind_param 快要死了
  • 按原样发布错误消息,以便我们知道问题所在,or die('Bind param failed: (' . $stmt->errno . ') ' . $stmt->error);。另外,如果您在 bindparam 之后声明 $query,您如何期望 bindparam 使用 $query?它应该在它之前。而且您还没有将LIKE '%?%' 更改为LIKE ?$stmt->bind_param("s", $query) 更改为$stmt->bind_param("s", '%'.$query.'%');

标签: php mysql sql mysqli prepared-statement


【解决方案1】:

你的问题不在于while,而在于LIKE。您的 SELECT 应该是:

"SELECT * FROM `Products` WHERE name LIKE ?"

还有你的 $query 变量:

$query = '%'.$_GET['query'].'%';

【讨论】:

  • 哇——这一直是秘密的答案。显然 PHP 中准备好的语句无法处理?在 %'s 内,这导致 bind_param 方法失败。感谢 Prix 和 Robert 帮助我找到了这个,很抱歉 leonardo 没有早点注意到这一点。
  • 欢迎您!发生的情况是“bind_param”为您的变量添加了引号,因此在您原来的 SELECT 中,您的 LIKE 是这样的'%'word'%'(在 % 中带有引号)。
【解决方案2】:

替换这个

if($stmt = $mysqli->prepare("SELECT * FROM `Products` WHERE name LIKE '%?%'")){

有了这个

if($stmt = $mysqli->prepare("SELECT * FROM `Products` WHERE name LIKE ?")){

那么一切都会好起来的:)

原因是当你使用'%?%' php 不懂?喜欢这里需要参数

【讨论】:

  • 抱怨 msqli_stmt 没有 fetch_assoc() 方法
  • 我需要问一下你什么时候只使用 fetch 而不使用 while 循环来做代码工作
  • 在不使用 while 循环的情况下使用 fetch 时,代码不会打印任何内容。虽然我确实知道该查询有效,因为我在 phpmyadmin 中尝试过。
  • 类似'%?%'的问题
猜你喜欢
  • 2016-09-11
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多