2013-06-21 150 views
0

我們有一個表車和一個簡單的PHP表單。在插入數據之前,我會檢查是否存在車輛註冊號碼,但某些客戶端電腦可能輸入重複條目。以下是代碼片段。還有什麼可能導致這種情況?如何避免重複數據輸入通過PHP到MySQL?

$vehicleRegistrationNumber=$_POST['vehicleRegistrationNumber']; 
$selectQuery1 ="Select vehicleRegistrationNumber From Vehicle Where vehicleRegistrationNumber='".$vehicleRegistrationNumber."'"; 
$result1 = mysqli_query($link,$selectQuery1); 
$row1 = mysqli_fetch_array($result1, MYSQL_ASSOC); 
$n1 = mysqli_num_rows($result1); 

if($n1 > 0) { 
    $status="<span class=\"statusFailed\">: Vehicle ".$vehicleRegistrationNumber." Already Exist.</span>"; 
} 
else { 
    //insert codes 
} 
+7

爲什麼不只在vehicleRegistrationNumber上使用UNIQUE索引?這樣mysql將爲你處理它,如果你嘗試插入重複行,你只需要關心你會得到的錯誤。 – hynner

+0

是的我現在已經完成了唯一索引,但是通過瀏覽器問題可能是這個檢查失敗了? – new14

回答

1

首先你的代碼很容易受到SQL注入與組嘗試。這個檢查可以通過提交XYZ0001' AND 1='0或更多的惡意值來繞過。爲了防止出現這種情況,請使用預準備語句和參數綁定來代替字符串連接。

其他可能性僅僅是用戶的錯誤,例如在數據庫中第一眼廣告記錄中很難找到的尾部空格("XYZ001" != "XYZ0001 ")。在檢查它在DB中的存在之前,您應該檢查PHP是否提交的值僅包含允許的字符並且沒​​有常見錯誤。

+0

所以我在其他地方做了這樣的檢查。那麼如何避免它們或加強他們的安全?那麼,如何避免在PHP和以上的常見錯誤來的SQL注入將這是一個fullful的幫助,如果我把它們在mysql_real_escape_string()? – new14

+0

您在代碼中使用'mysqli',因此如果您堅持不使用預準備語句,請使用'mysqli_real_escape_string'。 [Here](http://stackoverflow.com/q/60174/258674)你可以閱讀更多關於sql注入。至於常見錯誤,您必須爲所需數據定義模式,並檢查它是否符合您的要求,如果不符合,請以所需格式提示用戶。 –

+0

我一直在我的其他頁面使用mysqli_real_escape_string。它足夠安全嗎?還是應該轉向預先準備好的聲明? – new14

1

通過

$selectQuery1 ="Select vehicleRegistrationNumber From Vehicle Where vehicleRegistrationNumber='".$vehicleRegistrationNumber."' GROUP BY vehicleRegistrationNumber"; 
+0

沒有團隊的搞笑部分也應該可以檢查一下吧? – new14

+1

是的,你可以做不同也可以使用PHP, –

+0

你是什麼意思使用PHP?我在php上運行它?那麼還有什麼可能會使這件事變成一種奇怪的儀式。 – new14

1

最好的方法是在SQL端處理它。只需將該字段定義爲UNIQUE INDEX。

現在,當試圖插入一個重複的索引錯誤,就會拋出,您可以看看它是這樣的:

if (!mysqli_query($con,$sql)) 
    { 
    die('Error: ' . mysqli_error($con)); 
    } 

這樣你就可以避免每次插入查詢之前選擇查詢。只要你想要處理錯誤。

+0

爲什麼和什麼是錯誤的查詢infact?我很好奇爲什麼它在我身邊? – new14

+1

可能沒有錯。只是建議一種方法來避免對數據庫的額外查詢 – Aris

+0

我很好奇這麼簡單的查詢怎麼會失敗? – new14