PHP:PDO rowCount()有时返回0?

时间:2017-12-31 00:10:17

标签: php mysql pdo

我正在使用here描述的奇妙的last_insert_id技巧,但现在遇到了非确定性行为的问题。

PHP代码几乎每次运行时都能正常工作。这是一个完全空闲的系统(没有生产同时运行)。

我有什么遗忘吗?问题是什么?

我的PHP代码:

$query = "UPDATE `session` 
                SET `date_access` = NOW(), someField = LAST_INSERT_ID(someField) 
                WHERE ID = :cookie LIMIT 1 ;";
    $stmt = $dbh->prepare($query);
    $stmt->bindParam(':cookie', $_COOKIE['x']);
    if ($stmt->execute()) {
        $count = $stmt->rowCount();
        if ($count == 1) {
            $result = $dbh->lastInsertId();
        } 
    }

代码每次都以现有的“cookie”值运行,但每次代码运行时$ count为0(而不是1)。

这就是表格:

            SET NAMES utf8;
            SET time_zone = '+00:00';
            SET foreign_key_checks = 0;
            SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';

            SET NAMES utf8mb4;

            DROP TABLE IF EXISTS `session`;
            CREATE TABLE `session` (
              `ID` char(50) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
              `date_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
              `date_access` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
              `someField` bigint(20) unsigned NOT NULL,
              UNIQUE KEY `ID` (`ID`),
              KEY `someField` (`someField`),
              CONSTRAINT `session_ibfk_2` FOREIGN KEY (`someTable`) REFERENCES `someTable` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

1 个答案:

答案 0 :(得分:1)

https://dev.mysql.com/doc/refman/5.7/en/mysql-affected-rows.html说:

  

对于UPDATE语句,默认情况下受影响的行值是实际更改的行数。

换句话说,如果您更新但您设置的值已经是存储在匹配行中的值,则它不会计为受影响的行

这是默认行为,但如果在连接时设置PDO属性,则可以更改此行为。见PHP, MySQL - can you distinguish between rows matched and rows affected?