獲取值我有這樣的語句:解析SQL查詢,以便從「內爆」
$q1="SELECT * FROM indexing WHERE keywords IN '(".implode(' , ' , $words). ")";
$result = mysqli_query($con,$q1) ;
我需要基於變量$words
值從indexing
表中獲取詳細信息。
但現在它總是顯示返回的行數爲零。
如何在sql語句中正確添加引號才能獲得正確的結果。
獲取值我有這樣的語句:解析SQL查詢,以便從「內爆」
$q1="SELECT * FROM indexing WHERE keywords IN '(".implode(' , ' , $words). ")";
$result = mysqli_query($con,$q1) ;
我需要基於變量$words
值從indexing
表中獲取詳細信息。
但現在它總是顯示返回的行數爲零。
如何在sql語句中正確添加引號才能獲得正確的結果。
說你有,
$words = ["a" ,"b","c","d"]; // i.e an array
然後,
$val = implode(',' , $words) ;
$q1="SELECT * FROM indexing WHERE keywords IN ($val)";
做這種方式。
首先,您正在使用mysqli_query,而您應該至少使用準備好的語句,如果不是pdo。
$query = "SELECT <your code> FROM <your code> IN ('".implode("','",array_values($words))."') ";
應該工作。 如果您正在尋找準備好的聲明中的解決方案,它已經被回答here。
如果你爲echo
(或vardump
或printf
)q1
,爲了調試,你會看到實際的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/
您是否在執行前打印過q1? –
您是否檢查過查詢的錯誤返回值? –
是的..顯示
SELECT * FROM indexing WHERE keywords IN '(1)
– user3814621