이상한 결과가 나타납니다. mySQL 데이터베이스에서 사이트 사용자 계정을 활성화/비활성화하는 업데이트 메서드 (http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/data-retrieval-and-manipulation.html#update) 호출이 업데이트되지 않고 0을 반환하는 경우가 있습니다. 다음은 코드입니다.Symfony2 DBAL 업데이트 메서드가 0을 반환합니다.
$user_id = '198';
$sqlSetStmnt= [ 'activation_code' => NULL, 'active' => 0 ];
$conn = $this->get('database_connection');
try {
$result = $conn->update('users', $sqlSetStmnt,[ 'id' => (int)$user_id ]);
}
catch(Exception $e) {
$error = $e->getMessage();
throw new \Exception('update user account data function -- ' .
'error: ' . $error . ' - ' .
'unable to update your account!');
} // End of catch(Exception) block.
if(($result === FALSE) || ($result !== 1)) {
throw new \Exception('update user account data function -- ' .
'update return value: ' . $result . ' - ' .
'unable to update your account!');
} // if(($result === FALSE) || ($result !== 1)) ...
사용자 테이블 기본 키 인 ID INT (11) 열 활성 TINYINT (1) 열 및 activation_code VARCHAR (40) NULL 컬럼을 갖는다.
$ USER_ID 변수가 '198'의 문자열 값이 포함되어 있습니다,하지만 $ sqlSetStmnt 값을 생성 할 때 그것은 int로 캐스팅.
테이블은 사용자 테이블의 행 업데이트 호출시 (198)의 ID 열 값에 있다는 것을 확인하는 사용자에게 검사 . 업데이트 호출을 실행할 때 사용
계정은 행 활성 및 activation_code 열 값을 변경 할 수있는 충분한 권한을가집니다.
시스템에 다른 사용자가 없거나 데이터베이스에 액세스 할 수 없으므로 행에 잠금이 설정되지 않습니다.
내가 X 디버그를 사용하여 코드를 검사하고 $ USER_ID 및 $ sqlSetStmnt 변수의 값이 적절 $가은 0으로 설정된주는 결과, I가 기대 값으로 설정했다 메서드를 업데이트하고 업데이트 메서드 호출에 의해 예외가 throw되지 않았 음을 나타냅니다. 그런데상기 $ USER_ID 및 $ sqlSetStmnt 변수 값은 사용자가 입력되지 않기 때문에 결합 변수를 사용하지 않아도되므로없이 SQL 인젝션 가능성, 또는 버퍼 오버런 없다 .
업데이트 방법이 0을 반환 한 이유에 대한 정보를 DBAL에서 얻을 수있는 방법이 있습니까?
감사합니다.
$result = $conn->update('users', $sqlSetStmnt, [ 'id' => (int)$user_id ]);
에 :
업데이트는 실제로 업데이트 된 레코드 수를 반환합니다. 실제로 레코드를 변경하고 0을 반환한다고 말하고 있습니까? – Cerad
아니요, 레코드가 업데이트 된 것으로 나타나지 않습니다. 그러나 id 열 값이 일치하는 행이 있고 id 열이 테이블의 기본 키이므로 한 행이 업데이트되어 결과가 0이 아닌 한 값으로 설정되어야합니다. –
activation_code가 널이 아니거나 활성 값이 0이 아닌 경우에만 행이 갱신됩니다. 기본 SQL 데이터베이스 물건. – Cerad