为什么我收到错误:绑定变量的数量与预准备语句中的字段数量不匹配



我收到一个错误,说绑定变量的数量与此行准备好的语句中的字段数量不匹配

$query1->bind_result($book_id, $title, $isbn, $isbn13, $pubyear, $pubname);

除了我知道100%,因为这个过程按顺序返回字段:book_id、book_title、isbn、isbn13、pubyear、pubname。

为什么我会出现这个错误
这是我的完整代码

<?php
declare(strict_types=1);
if(basename($_SERVER['SCRIPT_NAME']) == basename(__FILE__)) {
header('Location: /spabsa/phprouter');
}
function showBooksByTitle()
{
include_once '../../blurg.inc';
# VALIDATE THIS YOU MORON!!
$title = $_POST['title'];

$db1 = new mysqli('localhost', 'spabsa', $password, 'STUspabsa');
if($db1->connect_errno > 0)
{
die('Unable to connect to database [' . $db1->connect_error . ']');
}

$query1 = $db1->prepare("call getbooksbytitle(?)");
$query1->bind_param('s', $title);
$query1->execute();
$query1->bind_result($book_id, $title, $isbn, $isbn13, $pubyear, $pubname);
while($query1->fetch()) {
echo '<a href="searh/bookinfo/' . $book_id . '">' . $title . '</a><br />';
echo $pubyear . '<br />';
echo $pubname . '<br />';
echo $isbn . '<br />';
echo $isbn13 . '<br />';
}
$query1->free_result();
$db1->close();
}
showBooksByTitle();
?>

这是的程序

delimiter $
create procedure getbooksbytitle(booktitle char(200))
BEGIN
DECLARE searchterm CHAR(201);
set searchterm = "%";
IF CHAR_LENGTH(booktitle) > 0 THEN
set searchterm = concat(booktitle,'%');
SELECT gb.book_id, gb.title,gb.isbn,gb.isbn13,gb.pubyear,gp.pubname
FROM grbooks gb
JOIN grpublishers gp ON (gp.publisher_id=gb.publisher_id)
WHERE gb.title LIKE searchterm;    
END IF;
END $
delimiter ;

存储过程中存在逻辑缺陷。当booktitle为空时,其长度将为0,并且永远不会执行SELECT。即使不执行SELECT,存储过程也总是返回一个空结果。但是,空结果没有列,因此您无法绑定到它

从PHP调用SP非常麻烦。你应该尽量避免它。在您的情况下,SP除了SELECT之外没有其他逻辑,这意味着您可以去掉SP,并使用普通的准备语句调用SELECT。但是,如果您想解决空结果集的问题,那么我可能会建议使用get_result()而不是绑定。

$stmt->execute();
if ($result = $stmt->get_result()) {
foreach ($result as $row) {
echo '<a href="searh/bookinfo/' . $row['book_id'] . '">' . $row['title'] . '</a><br />';
echo $row['pubyear'] . '<br />';
echo $row['pubname'] . '<br />';
echo $row['isbn'] . '<br />';
echo $row['isbn13'] . '<br />';
}
$stmt->next_result(); // To consume the empty result
}

但我强烈建议重新设计SP或将其完全删除。

最新更新