diff --git a/ext/pdo/pdo_sql_parser.re b/ext/pdo/pdo_sql_parser.re index 31da8ffdf9969..0cbdecdf6e9af 100644 --- a/ext/pdo/pdo_sql_parser.re +++ b/ext/pdo/pdo_sql_parser.re @@ -55,8 +55,8 @@ static int scan(Scanner *s) */ /*!re2c - (["](([\\]ANYNOEOF)|ANYNOEOF\["\\])*["]) { RET(PDO_PARSER_TEXT); } - (['](([\\]ANYNOEOF)|ANYNOEOF\['\\])*[']) { RET(PDO_PARSER_TEXT); } + (["](ANYNOEOF\["]|"")*["]) { RET(PDO_PARSER_TEXT); } + (['](ANYNOEOF\[']|'')*[']) { RET(PDO_PARSER_TEXT); } MULTICHAR { RET(PDO_PARSER_TEXT); } ESCQUESTION { RET(PDO_PARSER_ESCAPED_QUESTION); } BINDCHR { RET(PDO_PARSER_BIND); } diff --git a/ext/pdo/tests/bug_79276.phpt b/ext/pdo/tests/bug_79276.phpt new file mode 100644 index 0000000000000..31fc9ee4d9151 --- /dev/null +++ b/ext/pdo/tests/bug_79276.phpt @@ -0,0 +1,40 @@ +--TEST-- +Bug #79276 (PDO ignores any placeholder between two '\') +--SKIPIF-- + +--FILE-- +exec("SET SESSION sql_mode = 'NO_BACKSLASH_ESCAPES'"); +} + +$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true); + +$create_sql = "CREATE TABLE test (foo INT, bar VARCHAR(10))"; +$db->exec($create_sql); + +$insert_sql = "INSERT INTO test VALUES (1, '\\')"; +$db->exec($insert_sql); + +$sql = "SELECT * FROM test WHERE bar = '\\' AND foo = :foo AND bar = '\\'"; +$sth = $db->prepare($sql); +$sth->execute(['foo' => 1]); +$row = $sth->fetch(PDO::FETCH_NUM); +var_dump($row); +?> +--EXPECT-- +array(2) { + [0]=> + string(1) "1" + [1]=> + string(1) "\" +}