Php 为什么会出现错误:绑定变量的数量与prepared语句中的字段数量不匹配

Php 为什么会出现错误:绑定变量的数量与prepared语句中的字段数量不匹配,php,stored-procedures,mysqli,prepared-statement,Php,Stored Procedures,Mysqli,Prepared Statement,我得到一个错误,它说绑定变量的数量和这一行的prepared语句中的字段数量不匹配 $query1->bind_result($book_id, $title, $isbn, $isbn13, $pubyear, $pubname); 除了我知道100%,因为这个过程按顺序返回字段:book_id,book_title,isbn,isbn13,pubyear,pubname 为什么我会出现这个错误? 这是我的全部代码 <?php declare(strict_types=1); i

我得到一个错误,它说绑定变量的数量和这一行的prepared语句中的字段数量不匹配

$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();
?>

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

从PHP调用SP非常麻烦。你应该尽可能地避免它。在您的情况下,SP除了SELECT之外没有其他逻辑,这意味着您可以摆脱SP并使用普通的prepared语句调用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或完全摆脱它。

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

从PHP调用SP非常麻烦。你应该尽可能地避免它。在您的情况下,SP除了SELECT之外没有其他逻辑,这意味着您可以摆脱SP并使用普通的prepared语句调用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或完全删除它。

您可以添加存储过程吗?是啊,抱歉,看起来您只绑定了一个$query1->bind_参数',$title您可以添加存储过程吗?是啊,抱歉,看起来您只绑定了一个$query1->bind_参数',$title