2011-06-27 65 views
1

我遇到咖啡因剝奪攻擊......排除的結果是在一個字符串

如果我有一串數字

$myStr = '100, 102, 204'; 

如何從MySQL數據庫中選擇結果不具有與這些字符串中的一個匹配的id值?

SELECT * FROM t1 
WHERE t1.id NOT IN ($myStr) 

這只是看起來不正確的......

+3

你是不是垮了呢?它對我來說很合適。 –

+2

這對你來說有什麼「看起來不正確」?只要你確保'$ myStr'總是一個數字列表(即防止SQL注入),這將會很好。 – ceejayoz

+0

在oracle中,你可以用類似於你的文章的方式撰寫字符串,然後EXECUTE IMMEDIATE動態地運行它。我不確定mySQL是否具有類似的功能。 – Randy

回答

1

我的猜測是,你引述的全部條款:

SELECT * FROM t1 
WHERE t1.id NOT IN ('100, 102, 204') 

你需要這樣的:

SELECT * FROM t1 
WHERE t1.id NOT IN (100, 102, 204) 
+0

是的,愚蠢的下午錯誤...咖啡因...我需要更多的咖啡因。謝謝。 – santa

+1

@santa:下次請發佈您的實際代碼。即使這個答案是正確的,但從查看這個問題我們可以猜測你正在引用這個列表。 – ThiefMaster

6

你的代碼是完全正確的。

如果你只是從一個表中選擇,id而不是t1.id就足夠了。

+0

不,這是不正確的,因爲SQL'IN'子句不允許單個變量來表示值列表。原樣查詢只能作爲動態SQL運行。 –

+0

他使用PHP,所以他**使用動態SQL。 – ThiefMaster

1

的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。如果第一個參數包含逗號(「,」)字符,則此函數無法正常工作。

+0

哇,我真的需要加強我的mySQL技能 - 有很多很酷的事情是可能的。 – santa

相關問題