我在互联网上看过这个问题,但其他人的解决方案都没有解决我的错误。我有以下PHP代码:
$err = false;
$mysqli = getMysqlConnection();
if ($stmt = $mysqli->prepare("INSERT INTO users (username, email, regtime, emailverified, type) values (?,?,?,?,?);"))
{
date_default_timezone_set("America/New_York");
$dateStr = date("m-d-Y h:i:s");
$emailverified = 0;
$type = 0;
$stmt->bind_param('sssii', $username, $email, $dateStr, $emailverified, $type);
$rc = $stmt->execute();
$err = $rc ? $err : true;
$userId = $stmt->insert_id;
if ($stmt = $mysqli->prepare("INSERT INTO usercreds (user_id, username, hash) VALUES (?,?,?);") && $err === false)
{
//
//right here, for some reason, $stmt is true (boolean), not an object
//
$stmt->bind_param('iss', $userId, $username, $hash);
$rc = $stmt->execute();
$err = $rc ? $err : true;
}
else {
$err = true;
}
}
第一个查询运行没有问题,但第二个查询在对bind_params的调用中断。我收到了错误
致命错误:未捕获错误:在布尔值上调用成员函数bind_param()
这意味着(我已经确认)我第二次$stmt = $mysqli->prepare()
,它返回一个布尔值而不是一个对象。此外,它回归真实,我觉得很奇怪。
我有四倍检查我的查询,它是完全正确和有效的。然而由于某种原因我第二次尝试准备一个语句,他的prepare方法返回一个布尔值而不是一个语句对象。
另一个注意事项,在第二个prepare()之后回显$ mysqli->错误。
如何解决此问题?
有感:
部分我感觉这是因为我连续两次使用相同的mysqli对象?或者因为我连续两次使用相同的语句对象?是否有某种"关闭"或者"重置"为了执行第二个查询需要进行其中一个对象?
另一个编辑:
我的第二个查询有效的其他证明。我复制并粘贴了它并用值替换了它们,在mysql工作台中执行它,它运行得非常好。
INSERT INTO usercreds (user_id, username, hash) VALUES (1234567890,'testusr','hashhashhash');
答案 0 :(得分:1)
您要将$mysqli->prepare(..) && $err === false
的结果分配给$stmt
。这是一个布尔表达式。您需要以下任何一种变体:
if (($stmt = $mysqli->prepare(...)) && $err === false)
if ($err === false && $stmt = $mysqli->prepare(...))
答案 1 :(得分:1)
您的问题是由基本上错误的错误处理方式引起的。也就是说,除了产生错误之外,还会使代码膨胀。
以下是您真正需要的唯一代码:
date_default_timezone_set("America/New_York");
// below is the only line you need for the error handling
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = getMysqlConnection();
$dateStr = date("m-d-Y h:i:s");
$emailverified = 0;
$type = 0;
$stmt = $mysqli->prepare("INSERT INTO users (username, email, regtime, emailverified, type) values (?,?,?,?,?)");
$stmt->bind_param('sssii', $username, $email, $dateStr, $emailverified, $type);
$stmt->execute();
$userId = $mysqli->insert_id;
$stmt = $mysqli->prepare("INSERT INTO usercreds (user_id, username, hash) VALUES (?,?,?)");
$stmt->bind_param('iss', $userId, $username, $hash);
$stmt->execute();
其余部分取决于您在发生错误时将采取的措施。