here으로 묘사 된 환상적인 last_insert_id 트릭을 사용하고 있지만 이제는 비 결정적 동작 문제가 발생합니다.PHP : PDO rowCount()가 0을 반환하는 경우가 있습니까?
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();
}
}
코드는 기존의 "쿠키"값마다 실행되지만 $ 카운트 (1 대신) 0 코드가 실행되는 다른 모든 시간입니다.
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;
일치하는 행이 업데이트되지 않은 경우 업데이트는 * 행을 반환합니다 ('rowCount'를 통해) *. 이것은 일부 실행 (즉, 각 쿠키가있는 첫 번째)에서 현재 데이터베이스에 일치하는 쿠키 값이 없음을 의미합니다. – user2864740
위의 부록 : 값이 변경되지 않았습니다. *; ref https://stackoverflow.com/questions/35364214/does-mysql-overwrite-a-column-of-same-value-on-update IIRC 또한 "CLIENT_FOUND_ROWS"플래그에 의존합니다. – user2864740
'UPDATE' 쿼리에서'someField'를'LAST_INSERT_ID (someField)'로 설정하는 것에 대한 아이디어는 무엇입니까? [매뉴얼] (https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_last-insert-id) : * "* *** expr *** *가있는 경우 LAST_INSERT_ID()에 대한 인수로 주어진 경우, 인수의 값은 함수에 의해 반환되며 LAST_INSERT_ID()가 반환 할 다음 값으로 기억됩니다. "* 원하는 것이 맞습니까? – rickdenhaan