我遇到咖啡因剝奪攻擊......排除的結果是在一個字符串
如果我有一串數字
$myStr = '100, 102, 204';
如何從MySQL數據庫中選擇結果不具有與這些字符串中的一個匹配的id值?
SELECT * FROM t1
WHERE t1.id NOT IN ($myStr)
這只是看起來不正確的......
我遇到咖啡因剝奪攻擊......排除的結果是在一個字符串
如果我有一串數字
$myStr = '100, 102, 204';
如何從MySQL數據庫中選擇結果不具有與這些字符串中的一個匹配的id值?
SELECT * FROM t1
WHERE t1.id NOT IN ($myStr)
這只是看起來不正確的......
我的猜測是,你引述的全部條款:
SELECT * FROM t1
WHERE t1.id NOT IN ('100, 102, 204')
你需要這樣的:
SELECT * FROM t1
WHERE t1.id NOT IN (100, 102, 204)
是的,愚蠢的下午錯誤...咖啡因...我需要更多的咖啡因。謝謝。 – santa
@santa:下次請發佈您的實際代碼。即使這個答案是正確的,但從查看這個問題我們可以猜測你正在引用這個列表。 – ThiefMaster
你的代碼是完全正確的。
如果你只是從一個表中選擇,id
而不是t1.id
就足夠了。
不,這是不正確的,因爲SQL'IN'子句不允許單個變量來表示值列表。原樣查詢只能作爲動態SQL運行。 –
他使用PHP,所以他**使用動態SQL。 – ThiefMaster
的SQL IN
條款不允許一個變量來表示的值的列表。該查詢按原樣只能作爲動態SQL運行 - 在任何數據庫上運行。
的替代方案,是MySQL的具體,但限制較小是使用FIND_IN_SET function:
SELECT t.*
FROM T1 t
WHERE FIND_IN_SET(t.id, $myStr) = 0
FIND_IN_SET文檔:
...返回0如果str不在strlist或如果strlist是空的字符串。如果任一參數爲NULL,則返回NULL。如果第一個參數包含逗號(「,」)字符,則此函數無法正常工作。
哇,我真的需要加強我的mySQL技能 - 有很多很酷的事情是可能的。 – santa
你是不是垮了呢?它對我來說很合適。 –
這對你來說有什麼「看起來不正確」?只要你確保'$ myStr'總是一個數字列表(即防止SQL注入),這將會很好。 – ceejayoz
在oracle中,你可以用類似於你的文章的方式撰寫字符串,然後EXECUTE IMMEDIATE動態地運行它。我不確定mySQL是否具有類似的功能。 – Randy