You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 03:22:10