2012-01-18 35 views
0

我正在使用帶有準備好的語句的存儲過程來查找一串電子郵件地址中的行。使用存儲過程的'where子句'中的未知列

它看起來像這樣:

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `get_users_by_email`(IN emailString VARCHAR(100)) 
BEGIN 
    SET @sql = CONCAT('SELECT user_id FROM users WHERE user_email IN (',emailString,')'); 
    PREPARE qry FROM @sql; 
    EXECUTE qry; 
END 

然後我用調用過程:

CALL get_users_by_email('[email protected],[email protected], etc..');

不過,我收到此錯誤:

Unknown column in '[email protected]' in 'where clause'

的查詢工作,如果我用它來尋找數值如:

CALL get_users_by_email('123,456');

任何想法,爲什麼它會在字母數字值示數?該查詢在退出預準備語句和過程時正常工作。

+3

如果電子郵件字符串是由人類提供的,這是一個巨大的sql注入漏洞。 – MatBailie 2012-01-18 14:41:22

+0

@Dems,感謝您的警告。 – Kit 2012-01-18 14:48:19

回答

2

你需要字符串分隔符在你的電子郵件地址:

SET @sql = CONCAT('SELECT user_id FROM users WHERE user_email IN (''',emailString,''')'); 
+0

謝謝。它已經停止了這個錯誤,但是如果我提供一個郵件地址而不是一個字符串,它只會返回結果。有任何想法嗎? – Kit 2012-01-18 14:45:44

+0

如果你傳遞一個字符串,那麼你需要先關閉分隔符,然後在列表中的每個逗號之後重新打開。 – 2012-01-18 14:46:33

+0

很酷,謝謝! – Kit 2012-01-18 14:52:55

1

如果你使用一個字符串,你需要用引號把它傳遞:

SET @sql = CONCAT('SELECT user_id FROM users WHERE user_email IN (''',emailString,''')'); 

我使用額外的引號逃脫。這些數字起作用,因爲如果數字沒有被分隔,數字就不會被解釋爲對象名稱。

+0

謝謝你的回答! – Kit 2012-01-18 14:53:08