2016-08-26 5 views
1

Ich versuche, eine vorbereitete PDO-Anweisung für die Verwendung in einer Datenbankabfrage zu verwenden, die folgendermaßen aussieht, wobei die Platzhaltervariablen durch die Zahlen in Anführungszeichen dargestellt werden: "123 "und‚456‘:Sicherheit für vorbereitete SQL-Anweisung mit REGEX in Abfrage

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".*') 

Meine Frage ist, wäre die beste Praxis für den gesamten REGEX Ausdruck zu binden sein, oder einfach nur das‚123‘und‚456‘Variablen (ist das überhaupt möglich in einem regulären Ausdruck) oder etwas ganz anderes?

Mit anderen Worten, die dies bevorzugt ist,:

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".*'"); 

Oder das? (Ich weiß, dass es einige Probleme mit doppelten Anführungszeichen geben würde, die den Platzhalter umgeben.)

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'); 

Danke.

Antwort

1

Platzhalter können nicht zitiert werden. Einfach so:

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

Die erste ist ein Platzhalter und funktioniert wie erwartet. Der andere testet auf Gleichheit mit dem Zeichen "Fragezeichen". Es ist kein Platzhalter mehr.

Und dann ist das Problem von ? auch ein Regex-Metazeichen. Wenn Platzhalter KöNNTEN zitiert werden, dann

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

würde, dass ? eine Abfrage Platzhalter sein, oder ist es die regex „Null-oder-one“ Bereichsoperator?

Wenn Sie Platzhalter verwenden in Regexes wollen, müssen Sie „bauen“ das RegexMuster

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

Genau die gleiche Art und Weise, wie Sie ein LIKE Muster bauen würde:

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

Brilliant . Vielen Dank. – user1596165

Verwandte Themen