0

我们已经收到了数千个这样的 MySQL INSERT 查询字符串:

$sql = INSERT INTO my_table VALUES ( 123, '456', 'Don't fail', 'hellow world' )

sql 字符串只是在一个项目中提供给我们的。

问题是,在某些查询中,某些字段值在中间有单引号,因此在运行mysqli_query($sql)时会引发错误。

在我的例子中,如果我转义整个 $sql 字符串,它也会转义 \'456\' 或 \'Don\'t fail\',这也会抛出和错误,这就是我需要提取和转义的原因单独的值,然后将 sql 查询重新组合在一起。

我需要从括号内提取值并将它们放入一个数组中,这样我就可以单独对它们进行转义。像这样的东西:

$vals[0] = 123
$vals[0] = 456
$vals[0] = Don't fail
$vals[0] = hellow world

有我可以使用的正则表达式吗?

我知道表“my_table”的列数。

还有其他解决方案吗?

谢谢

4

2 回答 2

0

您可以创建一个匹配整个 SQL 字符串并捕获每个值的模式,而不是尝试转义撇号。

$pattern = "/(?:[ \w]+ \() (\d+), '(\d+)', '(.+?)', '(.+?)' \)/";

然后将这些值作为参数绑定到每个插入语句的准备好的语句。

$stmt = $mysqli->prepare('INSERT INTO my_table VALUES (?, ?, ?, ?)');

foreach ($inserts as $insert) {
    preg_match($pattern, $insert, $matches);
    list ($full, $a, $b, $c, $d) = $matches;
    $stmt->bindValue("isss", $a, $b, $c, $d);
    $stmt->execute();
}
于 2019-06-26T23:51:08.900 回答
0

你要非常小心,不要在这里得到意想不到的结果,

<?php

$re = '/\b\'\b/';  // b for word boudry

$str = <<<EOT
$sql = INSERT INTO my_table VALUES ( 123, '456', 'Don't fail', 'hellow world' )
EOT;

$subst = '\\\\\'';

$result = preg_replace($re, $subst, $str);

echo $result;

如果您以双撇号 IE 开头或结尾,则将不起作用: $sql = INSERT INTO my_table VALUES ( 123, '456', 'Don't fail', 'hellow worlds'' )

演示:https ://regex101.com/r/Ast9A7/1

于 2019-06-27T00:54:22.050 回答