【发布时间】: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