我正在使用嚴格模式開啓的MySQL。我通過HTML表單插入用戶提供的數據。我已經完成了所有的驗證,這是最後一步。我可以安全地認爲這個INSERT成功了嗎?
這是從我的PHP代碼的摘錄:
$sql = 'SET sql_mode = TRADITIONAL'; //last chance data validation
$mysqli->query($sql) or output_error('Database Error: Failed to set SQL mode');
$db_err_msg = 'Database Error: Failed to update profile summary';
$sql = "INSERT INTO {$tables['text']} (lngProfileId, memProfileText) VALUES(?, ?)
ON DUPLICATE KEY UPDATE memProfileText = VALUES(memProfileText)";
$stmt = $mysqli->prepare($sql) or output_error($db_err_msg);
$stmt->bind_param('is', $profile_id, $_POST['memProfileText'])
or output_error($db_err_msg);
$stmt->execute() or output_error($db_err_msg);
$stmt->close();
//if code reaches this point, can it assume insert/update succeeded?
注:output_error
是致命錯誤,我的錯誤處理程序。它不會返回;它退出。
我需要檢查警告嗎?或者我可以安全地假設插入/更新成功?是否有一些情況可能導致警告而不是錯誤,即使嚴格模式打開?
編輯:我只關心應該考慮的事情致命錯誤。如果它被更新而不是插入,這是我不關心的。這不是一個錯誤。
另外,在這種情況下,last_insert_id
和affected_rows
是沒有意義的。如果用戶沒有進行任何更改,affected_rows將爲0,last_insert_id的值將不會更新。
我的定義在這種情況下成功:
- 它插入記錄或更新記錄或做過什麼,如果未進行任何更改
- 它並沒有「悄悄裂傷我的數據」
許多新手程序員犯的錯誤假設查詢成功,沒有檢查返回值或警告。他們的代碼在正常情況下工作 ...。
我的問題是:??「考慮到我的代碼,以嚴格的方式開啓,錯誤檢查我所做的,是安全的假設查詢成功那是一個正確或不正確的假設我應該還要檢查警告還是會是多餘的?「
你測試了嗎?如果它起作用,它就會起作用。 –
是的,我測試過了。它適用於我投擲的所有東西。但我想確保沒有一些我不考慮的場景。我試圖確保我編寫健壯的代碼。 – toxalot
不要解決不存在的問題。你不想重新測試mysql,php驅動程序的功能。或者你也可以寫自己的驅動程序,DB –