我收到一個奇怪的結果,其中更新方法(http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/data-retrieval-and-manipulation.html#update)調用激活/停用mySQL數據庫中的站點用戶帳戶有時不更新並返回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更新方法,並且更新方法調用不拋出異常。
順便說一句,有沒有必要使用變量綁定,因爲在$ USER_ID和$ sqlSetStmnt變量的值不輸入由用戶,所以沒有可能性SQL注入的,或緩衝區溢出。
是否有某種方式從DBAL獲取有關爲什麼update方法返回0的信息?
謝謝。
update返回實際更新的記錄數。你是說它實際上正在改變記錄並返回0嗎? – Cerad
不,記錄似乎沒有更新。但是,由於有一行具有匹配的id列值,並且id列是該表的主鍵,所以我預計應該更新一行並將結果設置爲1而不是零。 –
只有當activation_code不爲空和/或活動值不爲零時,該行纔會更新。基本的SQL數據庫東西。 – Cerad