2014-07-08 104 views
-3

獲取值我有這樣的語句:解析SQL查詢,以便從「內爆」

$q1="SELECT * FROM indexing WHERE keywords IN '(".implode(' , ' , $words). ")"; 
$result = mysqli_query($con,$q1) ; 

我需要基於變量$words值從indexing表中獲取詳細信息。
但現在它總是顯示返回的行數爲零。
如何在sql語句中正確添加引號才能獲得正確的結果。

+1

您是否在執行前打印過q1? –

+1

您是否檢查過查詢的錯誤返回值? –

+0

是的..顯示SELECT * FROM indexing WHERE keywords IN '(1) user3814621

回答

0

說你有,

$words = ["a" ,"b","c","d"]; // i.e an array 

然後,

$val = implode(',' , $words) ; 


$q1="SELECT * FROM indexing WHERE keywords IN ($val)"; 

做這種方式。

0

首先,您正在使用mysqli_query,而您應該至少使用準備好的語句,如果不是pdo。

$query = "SELECT <your code> FROM <your code> IN ('".implode("','",array_values($words))."') ";應該工作。 如果您正在尋找準備好的聲明中的解決方案,它已經被回答here

1

如果你爲echo(或vardumpprintfq1,爲了調試,你會看到實際的SQL文本被髮送到服務器。

這裏有一些問題。在paren之前有一個單引號,我們期望你打算$words是數組,它將被轉換成SQL語句中的字符串文字列表。

IN '(".implode(' , ' , $words). ")" 
^   ^^ ^^ 

它看起來像你預期的是這樣的:

IN ('" . implode("','",$words) . "')"; 
    ^   ^^ ^^   ^

如果$words是空的,這將導致SQL文本:

IN ('') 

如果$words包含元素"abc","def" ,這將導致SQL文本:

IN ('abc','def') 

但是,再次檢查實際SQL文本發送到數據庫之前的內容。


您可能需要認真考慮所產生的SQL語句,如果在$words的要素之一恰好包含可能被解釋爲SQL文本字符,例如:

"abc') OR 1=1; -- " 

經典的SQL注入漏洞ala Little Bobby Tables http://xkcd.com/327/