2012-01-18 9 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'

私のような数値を見つけるためにそれを使用する場合、クエリが動作します。それは英数字の値にerroringされるだろう、なぜ

CALL get_users_by_email('123,456');

任意のアイデア?準備されたステートメントとプロシージャから引き出されるとき、クエリは正常に動作します。

+3

電子メール文字列が人間によって提供される場合、これは大規模なSQLインジェクションの脆弱性です。 – MatBailie

+0

@Dems、警告のおかげで。 – Kit

答えて

2

は、あなたのメールアドレスの周りに文字列の区切り文字を必要とする:あなたは、文字列を使用している場合

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

ありがとうございます。エラーを停止しましたが、文字列ではなく単一の電子メールアドレスを指定すると結果が返されます。何か案は? – Kit

+0

文字列を渡している場合は、リスト内の各カンマを区切り文字で区切って閉じてから再度開く必要があります。 –

+0

クール、ありがとう! – Kit

1

、それを引用符で合格する必要があります。

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

は私が脱出するために余分な引用符を使用しました。数字は、区切られていない場合、オブジェクト名として解釈されないので、数字は機能します。

+0

ありがとうございました! – Kit

関連する問題