PDO预处理UPDATE语句执行失败,寻求原因及解决方案
问题分析与解决
嘿,我来帮你拆解下问题根源!你碰到的Call to a member function execute() on bool错误,本质是prepare()方法执行失败返回了false(而非预期的PDOStatement对象),所以后续调用execute()自然会报错。咱们逐个看你的代码问题:
第一个写法的核心错误
看你的SQL语句:
UPDATE UsersData SET firstName = :firstName, lastName = :lastName, birthDay = :birthDay, aboutMe = :aboutMe, facebookU = :facebookU, twitterU = :twitter, githubU = :github WHERE uId =: id
注意最后一个命名参数: id——冒号和id之间多了个空格!PDO的命名参数要求冒号和参数名必须紧连,不能有空格,这个低级语法错误直接导致prepare()失败返回false。把它改成:id就能解决这个问题。
第二个写法的多重问题
这个多表UPDATE的SQL有两处致命语法错误:
- 多表UPDATE的语法逻辑错误:你用了
UPDATE UsersData AS UD, Users AS US这种旧写法,但UD.githubU=:github后面少了逗号,导致US.uEmail=:email的位置完全不符合SQL语法; - 参数缺失:SQL里定义了
:email参数,但execute()的参数数组里根本没传对应的值,这也会导致预处理失败。
如果要实现关联表更新,正确的SQL语法(以MySQL为例)应该是这样:
UPDATE UsersData AS UD JOIN Users AS US ON UD.uId = US.id SET UD.firstName=:firstName, UD.lastName=:lastName, UD.birthDay=:birthDay, UD.aboutMe=:aboutMe, UD.facebookU=:facebookU, UD.twitterU=:twitter, UD.githubU=:github, US.uEmail=:email WHERE UD.uId=:id
同时要记得在execute()的参数数组里加上:email对应的取值。
为什么问号占位符的写法可行?
因为问号占位符不需要命名,只要传入的参数顺序和SQL里的占位符顺序对应就行,你这个写法里没有任何语法错误,所以prepare()成功返回了PDOStatement对象,execute()就能正常执行了。
最后给你修正后的第一个写法代码:
$result = array(); try { // 修正了: id的空格问题 $sql = "UPDATE UsersData SET firstName = :firstName, lastName = :lastName, birthDay = :birthDay, aboutMe = :aboutMe, facebookU = :facebookU, twitterU = :twitter, githubU = :github WHERE uId = :id"; $stmt = $this->connect()->prepare($sql); $stmt->execute(array( ':firstName' => $userInformation['firstName'], ':lastName' => $userInformation['lastName'], ':birthDay' => $userInformation['birthDay'], ':aboutMe' => $userInformation['aboutMe'], ':facebookU' => $userInformation['facebook'], ':twitterU' => $userInformation['twitter'], ':github' => $userInformation['github'], ':id' => $userInformation['id'] )); $result = true; } catch (\PDOException $e) { $result = "Error: " . $e->getMessage(); } return $result;
内容的提问来源于stack exchange,提问作者user10852336
相关产品推荐
相关产品推荐

