CakePHP3.x中execute()方法执行结果如何获取?遇数据库错误求助
解决数据库更新后fetchAll报错的问题
Hey Alex, 我一眼就看出问题所在啦!咱们一步步理清楚:
为什么fetchAll会报错?
你执行的是UPDATE(更新)这类写操作,这类SQL语句本身不会返回结果集——数据库只会告诉你“我执行成功了,影响了X条记录”,但不会像SELECT那样返回行数据。而fetchAll('assoc')是用来从查询结果集里提取数据的,没有结果集的时候调用它,自然就会抛出“Database Error”了。
正确确认执行成功的方式
你不需要用fetchAll,而是通过以下两种方式来验证:
1. 先判断execute()的返回值
execute()方法本身会返回布尔值:true表示SQL语句执行成功(没有语法错误、权限问题等),false表示执行失败。比如:
$stmt = $pdo->prepare("UPDATE users SET name = ? WHERE id = ?"); $executionSuccess = $stmt->execute(['NewName', 123]); if (!$executionSuccess) { // 这里是真的执行失败了,比如SQL写错了、数据库连接断了 $errorDetails = $stmt->errorInfo(); echo "执行出错:" . $errorDetails[2]; } else { // 执行成功,但还要看有没有实际修改记录 $affectedRows = $stmt->rowCount(); if ($affectedRows > 0) { echo "完美!成功更新了 $affectedRows 条记录"; } else { echo "执行成功,但没有记录被修改——可能是WHERE条件没匹配到,或者要更新的值和原数据一样哦"; } }
2. 用rowCount()获取受影响行数
rowCount()(PDO)或者affected_rows(mysqli)会返回被SQL语句修改/删除/插入的行数。这里要注意:如果返回0,不一定是失败,只是没有记录被变更而已。
额外提醒
只有当你执行SELECT、SHOW、DESCRIBE这类返回结果集的查询语句时,才需要用fetchAll()、fetch()这类方法来获取数据。写操作(UPDATE、DELETE、INSERT)完全不需要碰这些方法!
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

