我尝试为用户制作可编辑的个人资料。他们点击编辑按钮(form-post)返回带有可编辑信息的页面(仅当isset($ _ POST ["编辑"])在文本区域,输入和"完成编辑&#34 ;按钮。 当我点击完成编辑。它需要启动一个将新信息更新到数据库的功能。但它没有更新它的返回错误:
Call to a member function bind_param() on a non-object
我的代码:
if(isset($_POST["cedit"]) && !empty($_POST["fn"]) && !empty($_POST["ln"]) && !empty($_POST["desc"])){
if($stmtq = $mysqli->prepare("UPDATE `sites`.`accounts` SET `fullname` = ? ,`description` = ? WHERE `id` = ? ") && !empty($_POST["fn"]) && !empty($_POST["ln"]) && !empty($_POST["desc"])){
$stmtq->bind_param("ssd", $_POST["fn"]." ".$_POST["ln"], $_POST["desc"], $_SESSION["user_id"]);
$stmtq->execute();
$stmtq->close();
}
}
答案 0 :(得分:5)
操作符优先级问题导致$stmtq
成为true
或false
布尔值,而不是预期的预处理语句。
这是由于&&
条件链被包含在同一个条件中。它们发生在作业=
之前。添加一些()
。基本上它相当于:
// $x is always assigned a boolean
if ($x = (object && true && true))
而不是预期的
// $x is assigned the object
if (($x = object) && (true && true))
修复它:
// Wrap the assignment in its own () group to isolate from the && conditions
if (($stmtq = $mysqli->prepare("UPDATE `sites`.`accounts` SET `fullname` = ? ,`description` = ? WHERE `id` = ? ")) && !empty($_POST["fn"]) && !empty($_POST["ln"]) && !empty($_POST["desc"]) {
// Successful prepare() assignment and all other conditions
// Proceed with bind_param()/execute()
}
虽然它添加了几行,但是更容易阅读并且更不容易出现这些优先级问题,先执行prepare()
和赋值,然后验证其他条件,反之亦然。
if (!empty($_POST["fn"]) && !empty($_POST["ln"]) && !empty($_POST["desc"])) {
if ($stmtq = $mysqli->prepare(.....)) {
// All is well, proceed with bind_param()/execute()
}
}
有关美味的细节,here is PHP's operator precedence chart。 &&
逻辑运算符的优先级高于=
赋值。