使用预准备语句插入数据失败并显示警告“绑定变量数与预准备语句中的字段数不匹配”

时间:2013-02-19 05:50:50

标签: php mysqli

我正在学习如何正确编写预处理语句的脚本,而且我卡住了,无法插入数据条目。我花了几个小时,看了各种教程和示例代码,但我无法弄清楚为什么以下不起作用:

$data1 = 0;
$data2 = "pumpkin";
$data3 = "cake";
$data4 = "orange";
$data5 = "sweet";
$stmt = $mysqli->stmt_init();
// Here I have a few SELECT queries that checks if $data2 and/or $data3 is already taken
$query = "INSERT INTO ". $mytable . " SET data1=?, data2=?, data3=?, data4=?, data5=?";
if ($stmt->prepare($query)) {
    $stmt->bind_param("issss", $data1, $data2, $data3, $data4, $data5);
    $stmt->execute() or trigger_error($mysqli->error); // added per Your Common Sense's suggestion
    //$stmt->bind_result($data1, $data2, $data3, $data4, $data5);
    $stmt->close();
    $mysqli->close();
} else {
    echo $mysqli->error; // edited per Yogesh Suthar's suggestion
    $stmt->close();
    $mysqli->close();
}

我得到警告:mysqli_stmt :: bind_result():绑定变量数与$ stmt-> bind_result行上预准备语句中的字段数不匹配。

我做错了什么?我非常感谢任何帮助。

编辑:我在$ db_user,$ db_password,$ db_dbname中正确定义了以下内容:

$mysqli = new mysqli('localhost', $db_user, $db_password, $db_dbname);

解决:

使用Yogesh Suthar和Your Common Sense提供的错误检查代码,我得知我没有提供关键数据。 $ data2和$ data3是唯一且必需的数据,我以为我提供它们是因为我有一些准备好的语句来查询这些数据字段并检查是否已经获取了$ data2和/或$ data3。编写脚本时,如果已经采用$ data2和/或$ data3,则不会触发INSERT语句。事实证明,我正在进行的SELECT查询消除了变量$ data2和$ data3,当INSERT语句出现时,它们为空。编辑SELECT语句以便$ data2和$ data3保持不变后,它解决了问题。 INSERT语句现在已成功执行。 (并且上面的代码执行完全没有任何错误。)

2 个答案:

答案 0 :(得分:0)

删除此行,因为您正在触发INSERT查询并返回受影响的行数。您必须仅对bind_result查询使用SELECT

$stmt->bind_result($data1, $data2, $data3, $data4, $data5);

使用此

echo $mysqli->error;

而不是

echo "failed";

答案 1 :(得分:0)

如果未插入数据则出现错误 所以你必须向mysql询问此错误

$stmt->execute() or trigger_error($mysqli->error);

因此,您将收到有关某个错误的通知,并且不需要猜测。