PDO::MYSQL_ATTR_FOUND_ROWS不生效?测试程序返回值异常排查
问题分析:UPDATE语句rowCount()返回0的异常情况
问题描述
以下测试程序在多数平台执行后返回预期结果1,但在某主机服务商的平台上返回0。当前环境为MySQL 8.0.26、PHP 8.2.9,请问可能的原因是什么?
<?php error_reporting(-1); ini_set('display_errors', '1'); $db_database = "your_database"; $db_host = 'localhost'; $db_login = "your_login"; $db_password = "your_password"; $dsn = "mysql:dbname=$db_database;host=$db_host"; $table = "found_rows_test"; $options = [PDO::MYSQL_ATTR_FOUND_ROWS => true]; $dbh = new PDO($dsn, $db_login, $db_password, $options); $sql = "CREATE TABLE IF NOT EXISTS $table (id varchar(10), data int, PRIMARY KEY(id))"; $stmt = $dbh->prepare($sql); $stmt->execute(); $sql = "INSERT IGNORE INTO $table (id, data) VALUES ('abcd', 1)"; $stmt = $dbh->prepare($sql); $stmt->execute(); $sql = "UPDATE $table SET data=1 WHERE id='abcd'"; $stmt = $dbh->prepare($sql); $stmt->execute(); echo $stmt->rowCount();
可能的原因
PDO::MYSQL_ATTR_FOUND_ROWS选项未实际生效:代码中虽显式设置该选项,让rowCount()返回匹配的行数,但主机服务商的PHP全局配置可能通过pdo_mysql.default_found_rows强制将其设为false,或连接创建过程中选项被拦截覆盖。此时rowCount()仅统计实际被修改的行数,由于UPDATE语句未改变数据,返回0。- MySQL优化器的特殊处理:主机的MySQL可能开启了特定优化规则,当检测到UPDATE语句无实际数据变更时,直接跳过执行逻辑,导致
rowCount()返回0。 - MySQL sql_mode配置影响:若服务器启用了某些严格模式或特殊sql_mode,可能改变UPDATE语句的计数逻辑,使
rowCount()仅统计实际修改的行而非匹配的行。 - PDO扩展编译/配置缺陷:尽管PHP版本为8.2.9,但主机环境的PDO MySQL扩展可能存在编译问题,导致
MYSQL_ATTR_FOUND_ROWS选项无法正确传递给MySQL服务器。
内容的提问来源于stack exchange,提问作者Greenflash
相关产品推荐
相关产品推荐

