2013-08-03 25 views
0

請幫我弄清楚這一點。第一個查詢將返回一個消息,說PHP MYSQL無法執行查詢:未知列

Couldn't execute query: Unknown column 'ssd23' in 'where clause. 

ssd23$_POST將獲得來自HTML表單的pnumber值。但是,如果只有數字,它將起作用。

$result = mysqli_query($con, "DELETE FROM Tools WHERE PartNumber = {'$_POST['pnumber']'}") or die ("Couldn't execute query: " .mysqli_error($con)); 

下面的第二個查詢可以在使用變量後使用數字和字符。

​​
+4

有這個代碼SQL注入漏洞,這將意味着你的網站將通過在短期內餅乾被拆除。請不要使用這個代碼! – halfer

+0

使用預準備語句將動態輸入傳遞到SQL查詢中。它們專爲提高安全性而設計,*和*它們將幫助您避免將來出現此類特定問題。 – DCoder

+0

顯然,* value *有一個缺失的引用,然後將其視爲* field name *。有趣的是,您已經無意識地利用了自己的代碼的SQL注入漏洞:D –

回答

1

替換此:

$result = mysqli_query($con, "DELETE FROM Tools WHERE PartNumber = {'$_POST['pnumber']'}") or die ("Couldn't execute query: " .mysqli_error($con)); 

有了這個:

$result = mysqli_query($con, "DELETE FROM Tools WHERE PartNumber = '" . $_POST['pnumber'] ."'") or die ("Couldn't execute query: " .mysqli_error($con)); 

通知我並沒有採取上述

甚至更​​好的照顧SQL注入的是使用準備報表這將保護您的querys,你的情況會是這樣的:

$sql= 'DELETE FROM Tools WHERE PartNumber= ?';  

$stmt = $con->prepare($sql); 
$stmt->bind_param('i', $_POST['pnumber']); 
$stmt->execute(); 
+2

嗨,佩裏。在您的示例中,您已經複製了OP的安全漏洞。如果您看到'$ _POST'或其他用戶輸入被添加到查詢中而沒有轉義或參數化,請務必警告OP他們的代碼不安全。 – halfer

+1

@halfer,我現在添加一個準備聲明的例子,比第一個選項好得多:) – Perry

+0

好東西佩裏! +1 – halfer