我正在使用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;
答案 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?