好吧,我已经在此工作了一段时间。似乎无法找到这个问题。我已经通过Stackoverflow搜索了类似的问题,但它们似乎都指向错别字的准备声明。
我在这里没有找到任何错别字,但我仍会收到错误
警告:mysqli_stmt_close()期望参数1为mysqli_stmt,boolean给定
$sql = "INSERT INTO users (email, password, firstname, lastname, date, position, department, manager, birthdate) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
if($stmt = mysqli_prepare($link, $sql)){
mysqli_stmt_bind_param($stmt, "sssssssss", $param_email, $param_password, $param_firstname, $param_lastname, $param_department, $param_position, $param_manager, $param_date, $param_birthdate);
$param_email = $email;
$param_password = password_hash($password, PASSWORD_DEFAULT);
$param_firstname = $firstname;
$param_lastname = $lastname;
$param_department = $department;
$param_position = $position;
$param_manager = $manager;
$param_date = $date;
$param_birthdate = $birthdate;
if(mysqli_stmt_execute($stmt)){
// Redirect to login page
header("location: index.php");
} else{
echo "Something went wrong. Please try again later.";
}
}
mysqli_stmt_close($stmt);
if($stmt = mysqli_prepare($link, $sql)){
...
}
这与
相同$stmt = mysqli_prepare($link, $sql);
if($stmt){
...
}
因此,在您的情况下,最后一行的故障意味着mysqli_prepare($link, $sql)
的结果是(boolean) false
。由于您在if
之外有最后一行,因此它将尝试关闭false
而不是准备好的查询。将其放入if
语句中,将解决您的错误,但不是为什么结果为false
。
if($stmt = mysqli_prepare($link, $sql)){
...
mysqli_stmt_close($stmt);
}
现在出于某种原因mysqli_prepare
失败。这可能是因为$link
或$sql
。给出了$sql
,似乎还不错,因此$link
必须失败。
$link = mysqli_connect("localhost", "user", "password", "db");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %sn", mysqli_connect_error());
exit();
}
if($stmt = mysqli_prepare($link, $sql)){
...
mysqli_stmt_close($stmt);
}
在70%的情况下,问题在您的查询中。MySQL给您错误的原因是因为此($stmt = mysqli_prepare($link, $sql)
有错误,并且mysqli_prepare
方法正在返回bool
。它应该是您的?
作为值的查询。尝试用null
替换它们。告诉我它是否有效。
使用此代码检查最后一个语句错误:
if(mysqli_stmt_execute($stmt)){
// Redirect to login page
header("location: index.php");
} else{
printf("Error: %s.n", mysqli_stmt_error($stmt));
echo "Something went wrong. Please try again later.";
}
http://php.net/manual/en/mysqli-stmt.error.php
变量$ stmt被声明为if($ stmt = mysqli_prepare($ sql,$ sql)){}语句。在IF-Statement之前声明$ STMT或在IF-Statement内部移动最后一行。