PHP警告:mysqli_stmt :: bind_param():变量数与预准备语句中的参数数量不匹配

时间:2013-05-31 20:09:07

标签: php mysqli prepared-statement

不知道为什么我收到此PHP警告消息。看来准备好的语句中有四个参数,bind_param()中还有四个变量。谢谢你的帮助!

  if($stmt = $mysqli -> prepare("SELECT url, month, year, cover_image FROM back_issues ORDER BY year DESC, month DESC")) {
   $stmt -> bind_param("ssis", $url, $month, $year, $cover_image);

   $stmt -> execute();

   $stmt -> bind_result($url, $month, $year, $cover_image);

   $stmt -> fetch();

   while ($stmt->fetch()) {
     echo "<li class='item'><a href='$url'><img src='$cover_image' alt='$cover_image' width='' height='' /></a><br /><span class='monthIssue'>$month $year</span></li>";
   }

   $stmt -> close();
   $mysqli -> close();

 }

2 个答案:

答案 0 :(得分:8)

if($stmt = $mysqli -> prepare("SELECT url, month, year, cover_image FROM back_issues ORDER BY year DESC, month DESC")) {
   $stmt -> bind_param("ssis", $url, $month, $year, $cover_image);
   [...]
}

这些线条没有任何意义!如果您想使用参数,则必须将它们用于where条件或类似条件,非常类似:

$mysqli->prepare("SELECT * FROM back_issues WHERE url =? AND month =? AND year =? and cover_image = ?");
$stmt->bind_param("ssis", $url, $month, $year, $cover_image);

如果您没有任何占位符与参数绑定,bind_param()方法将产生您正在运行的错误。那么,IF声明应该做什么? 如果要验证该查询是否产生任何结果,则首先运行它,然后验证。

答案 1 :(得分:3)

在这种情况下,您不需要绑定参数。占位符用于INSERT语句或WHERE子句中的值。 (请注意,不允许使用占位符作为标识符,例如语句中的列名。)带有占位符的有效简化语句如下所示:

"SELECT url, cover_image FROM back_issues WHERE month = ? and year = ?"