2016-08-26 6 views
1

プレースホルダ変数が引用符で囲まれた「123」というデータベースクエリで使用するために、準備されたPDO文を使用しようとしています。 」と 『456:123『と 『456』の変数(REGEX式であっても可能である』クエリでREGEXを使用する準備済みSQL文のセキュリティ

SELECT `user_ID` as `ID` 
FROM `usermeta` 
WHERE (`meta_key` = 'custom_fields') 
AND (`meta_value` REGEXP '.*"ABC";.*s:[0-9]+:"123".*') 
AND (`meta_value` REGEXP '.*"DEF";.*s:[0-9]+:"456".*') 

私の質問は、ベストプラクティスは、全体REGEX式に特異的に結合する、または単にするだろう、です』 )、まったく違う何か?好ましいつまり、

、この:

SELECT `user_ID` as `ID` 
FROM `usermeta` 
WHERE (`meta_key` = 'custom_fields') 
AND (`meta_value` :REGEXP1) 
AND (`meta_value` :REGEXP2) 

$stmt->bindParam(':REGEXP1', "REGEXP '.*"ABC";.*s:[0-9]+:"123".*'"); 
$stmt->bindParam(':REGEXP2', "REGEXP '.*"DEF";.*s:[0-9]+:"456".*'"); 

それとも、この? (プレースホルダを二重引用符で囲む問題があることはわかっています)

SELECT `user_ID` as `ID` 
FROM `usermeta` 
WHERE (`meta_key` = 'custom_fields') 
AND (`meta_value` REGEXP '.*"ABC";.*s:[0-9]+:":value1".*') 
AND (`meta_value` REGEXP '.*"DEF";.*s:[0-9]+:":value2".*') 

$stmt->bindParam(':value1', '123'); 
$stmt->bindParam(':value2', '456'); 

ありがとうございます。

答えて

1

プレースホルダは引用できません。

SELECT ... WHERE foo = ? 
SELECT ... WHERE foo = '?' 

最初のものはプレースホルダであり、期待どおりに動作します。もう1つは、文字「疑問符」と同等かどうかをテストすることです。もうプレースホルダではありません。

さらに、?も正規表現のメタ文字であるという問題があります。プレースホルダが引用されることができれば、その後、

SELECT ... WHERE foo REGEXP '^.?' 

与えられたもの?は、クエリのプレースホルダであるか、またはそれが正規表現「ゼロまたは-1」の範囲演算子であるのでしょうか?

あなたが正規表現でプレースホルダを使用する場合は、あなたがLIKEパターン構築しなければならないとまったく同じ方法で正規表現パターン

SELECT ... WHERE foo REGEXP concat('^.', ?) 

「を構築」する必要があります。

SELECT ... WHERE foo LIKE '%?%' // wrong 
SELECT ... WHERE foo LIKE concat('%', ?, '%') // right 
+0

ブリリアントを。ありがとうございました。 – user1596165

関連する問題