2017-12-31 52 views
1

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; 
+0

일치하는 행이 업데이트되지 않은 경우 업데이트는 * 행을 반환합니다 ('rowCount'를 통해) *. 이것은 일부 실행 (즉, 각 쿠키가있는 첫 번째)에서 현재 데이터베이스에 일치하는 쿠키 값이 없음을 의미합니다. – user2864740

+2

위의 부록 : 값이 변경되지 않았습니다. *; ref https://stackoverflow.com/questions/35364214/does-mysql-overwrite-a-column-of-same-value-on-update IIRC 또한 "CLIENT_FOUND_ROWS"플래그에 의존합니다. – user2864740

+1

'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

답변

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?