2010-07-12 71 views
0

我在postgressql中使用了主鍵(pk_user)。如果我插入錯誤的參數。在PHP中捕獲postgres錯誤

的Postgres調用異常:(錯誤:重複鍵值違反唯一約束「pk_user」)

這是確定的,但我想抓住這個錯誤,並把它轉換爲用戶界面(此用戶名使用)

我的PHP腳本:

$sql="INSERT INTO user (....) VALUES (....)" 
@$result=pg_query($dbconn,$sql); 
if(!$result) { 
$error= pg_last_error($dbconn); 
if($error==='ERROR: duplicate key value violates unique constraint "pk_user"') 
    $outputmesage="this username is used"; 
.... 
} 
else { 
..... 
} 

但建設if($error==='ERROR: duplicate key value violates unique constraint "pk_user"') 是錯誤的。我不知道寫了什麼。函數strcmp(str1,str2)也是錯誤的。

P.S: 我爲我的英語不好

+0

我的評論有點不相關,但不應該先檢查用戶名是否已被使用,然後嘗試插入它? 我不喜歡(也許是個人的)做某件事的方法,我知道它可能是錯誤的,並從副作用看到原因。 – 2010-07-12 15:51:37

+1

dimitris mistriotis:不,這是錯誤的方式。即使你首先檢查它,你也不能保證有人不會在你的檢查和插入之間要求相同的用戶名(除非在事務中 - 但是限制併發性並且在那裏只需要一個查詢就足夠了)。除了Torenaga方法的正確性之外,它也更加有效,因爲它總是隻需要一個查詢,而大多數時候你只需要進行兩個查詢。 – 2013-01-08 16:55:22

回答

0

插入之前使選擇該用戶名惋惜和它解決的問題。

,但如果你儘量減少查詢的數量,以分貝,你可以留在你的解決方案,只是改變了條件某事像這樣:

if(strstr($error,"duplicate key value")) { 
    $outputmesage="this username is used"; 
} 

希望這將是有益的

2

你可以使用pg_result_error_field但你必須使用pg_send_querypg_get_result(而不是pg_query和更好的選擇pg_query_params):

pg_send_query($dbconn,$sql); 
$res = pg_get_result($dbconn); 

# check for "UNIQUE VIOLATION" 
if(pg_result_error_field($res,PGSQL_DIAG_SQLSTATE) == '23505') { 
    ... 

另一種方法是使用PDO,將錯誤處理設置爲「ERRMODE_EXCEPTION」,處理異常並查看exception'scode屬性(它應該再次包含SQLSTATE錯誤代碼。