2012-10-24 28 views
0

我在使用帶變量的引號的sql查詢中遇到了一些問題。 (通常我使用「綁定」,所以我沒有這種問題)。以下是查詢:在sql查詢中使用簡單和雙引號

$myquery = mysql_query("SELECT * FROM mytable ORDER BY id ASC WHERE var='".$var."'"); 

語法似乎不正確,任何人都可以幫忙嗎?

+1

請,不要concat SQL字符串... – Prinzhorn

+1

這種方法通常容易出現SQL注入攻擊,所以它不是真的可取的。「似乎不是合作的直立「意味着什麼都沒有;你有錯誤嗎? – lanzz

+0

@lanzz,抱歉不準確:實際上查詢會加載一些我在網頁上顯示的數據。但是在這裏顯示這些數據失敗 – Newben

回答

2

以及你可以嘗試這樣的事:

$query = sprintf("SELECT * FROM mytable WHERE var='%s' ORDER BY id ASC",mysql_real_escape_string($var)); 
$result = mysql_query($query) or die("Error:" . mysql_error()); 

另外請注意,ORDER BY是在錯誤的地方。 它更具可讀性,您無需打擾單一的qoute concate。 也是安全的mysql注入。 希望這有助於!

+0

非常感謝Alan,它工作得很好! – Newben

+0

lanzz你是對的我只是忘了把mysql_real_escape_string($ var) tx – alan978

-1

您可以使用它像

$myquery = mysql_query("SELECT * FROM mytable ORDER BY id ASC WHERE var='$var'"); 
+0

沒有相反的證據,我假設'$ var'沒有通過'mysql_real_escape_string'傳遞,所以這種方法很容易發生SQL注入。它在問題中也存在錯誤的ORDER BY/WHERE子句順序,所以它在語法上仍然無效。 – lanzz

+0

@ alan978的解決方案工作正常,但您的表達似乎不起作用。但僅憑好奇心,它是否存在使用引號的一些查詢,而不使用sprintf風格的用法? – Newben

+0

@lanzz,他沒有被告知有關數據,我們可以假設,他直接分配數據的值:P –

1

一般來說,你應該使用參數綁定您的DBD(Perl的數據庫驅動程序)或其他語言和驅動器組合提供的功能。我收集你正在使用PHP(雖然你應該標記你的問題,以消除歧義)。

這是How to bind SQL parameters in PHP(使用PDO)上的StackOverflow線程。注意:PHP PDO :: bindParam方法存在限制其他語言類似的功能。因此,閱讀鏈接的線程注意事項。

這是另一個討論有關Binding Parameters to Statements ... Perl的(但概念適用於其他編程語言和他們的SQL庫/驅動器)。

+0

我知道,我總是使用綁定技術。在這裏我想知道,因爲我正在爲使用sql查詢的大量引用項目工作,所以我想說清楚 – Newben