2011-09-02 84 views
1

我想表現每個用戶,他們被稱爲使用此語句:PHP SQL語句轉義

$result = mysql_query("SELECT `CallerNumber`, `CalleeNumber`, `ServiceCost` FROM `calls` WHERE `Customer_ID` = $current_user['CustomerID']"); 

$current_user['CustomerID']部分導致錯誤。我試圖把它放在帶有/ escapes的單引號中,但它不起作用。如何才能做到這一點?

回答

0

你可以在下面試試。

$arg = $current_user['CustomerID']; 
$result = mysql_query("SELECT `CallerNumber`, `CalleeNumber`, `ServiceCost` FROM `calls` WHERE `Customer_ID` = '$arg'"); 
+0

沒有工作空格或其他奇怪的字符! ;)謝謝 – Cimbom

+0

-1,失敗。如果'$ arg'是一個字符串,空格將會破壞這段代碼。如果'$ current_user ['customerID']'可以由用戶操縱,那麼你有一個SQL注入。非常差的代碼。 – Johan

+0

@Johan ..你是對的,但我的目標是解決錯誤並讓代碼首先工作。我不想開始傳播安全和最佳實踐。 :) – scartag

-1

你可以使用{$current_user['CustomerID']}代替$current_user['CustomerID']

只有在情況下$current_user['CustomerID']使用,這不是用戶輸入,否則你應該使用mysql_real_escape_string()避免SQL Injection

+0

哦,這更甜蜜,謝謝! – Cimbom

+0

現在我正在使用此答案。這是否也傾向於SQL注入? – Cimbom

+0

{}不像你認爲他們使用'mysql_real_escape_string()'那樣工作,你需要使用單引號。這會讓你大開眼界。 – Johan

0

這已經有一段時間,因爲我做了PHP ,但我認爲你需要的是這樣的:

$result = mysql_query("SELECT `CallerNumber`, `CalleeNumber`, `ServiceCost` FROM `calls` WHERE `Customer_ID` = '" . mysql_real_escape_string($current_user['CustomerID']) . "'"); 

(我剛看了一下從對象,道歉,如果這不是常用的一個。)

另外,轉義一個反斜槓完成(\),而不是一個正斜槓(/)

+0

-1,但差不多,你需要總是用單引號包圍注入的值,否則mysql_real_escape_string()將不會執行任何操作。 – Johan

+0

@Johan好吧,謝謝你指出,我已經修復(我認爲) –

+0

是的,這將工作。 – Johan

-1

對於變量(包括數組甚至屬性電話)用雙引號或heredocs(EOT),只需將它們裝入大括號中即可。

$result = mysql_query("SELECT `CallerNumber`, `CalleeNumber`, `ServiceCost` FROM `calls` WHERE `Customer_ID` = {$current_user['CustomerID']}"); 
+0

-1失敗,有沒有人聽說過SQL注入? – Johan

+0

@Johan我基於他的問題回答他的問題。但是我同意你在不清理它的情況下構建一個SQL字符串是一種不好的做法,因爲它很容易發生SQL注入。雖然考慮到他的問題的上下文,但不知道$ current_user來自哪裏,因此我們不能斷定代碼是不好的。 – hyubs

+0

當$ current_user ....包含空格時,{}將不起作用,請參閱http://codepad.org/cM9V2YX4有關爲什麼它不起作用的演示 – Johan

0

唯一正確的答案是:

首先逃脫參數,如果它不是由程序本身產生的。
永遠是個好主意!你要注入的查詢中有越獄變數。
這是一個更好的主意,使用PDO,但另一個主題。

$arg = mysql_real_escape_string($current_user['CustomerID']); 

然後圍繞注入VAR單引號或轉義都不行!

$query = "SELECT CallerNumber, CalleeNumber, ServiceCost 
      FROM calls WHERE Customer_ID = '$arg' "); 

這也將避免語法錯誤在SQL語句中,如果$var包含空格或其他特殊瓦爾。不需要周圍COLUMNNAMES

反引號,除非您使用保留字作爲列名,或者你正在使用你的列/表名

+0

哦,好的。該參數由程序,數據庫生成,我正在讀取它。如果我從用戶那裏得到它,我會逃避它。謝謝 – Cimbom

+0

爲什麼downvote? – Johan

+1

我沒有。我會upvote。但它不會讓我 – Cimbom