我们已经得到了数以千计的MySQL插入查询字符串,如下所示:
$sql = INSERT INTO my_table VALUES ( 123, '456', 'Don't fail', 'hellow world' )
sql字符串是在一个项目中提供给我们的。
问题是,在某些查询中,一些字段值在中间有单引号,因此当运行mysqli_query($sql)
时,它会抛出错误。
在我的示例中,如果我转义整个$sql字符串,它也将转义\'456\‘或\’不要失败\‘,这也将抛出and error,这就是为什么我需要分别提取和转义这些值,然后将sql查询放回一起。
我需要从括号中提取值,并将它们放入一个数组中,这样我就可以逐个对它们进行转义。如下所示:
$vals[0] = 123
$vals[0] = 456
$vals[0] = Don't fail
$vals[0] = hellow world
有没有我可以使用的正则表达式?
我知道表"my_table“的列数。
还有其他的解决方案吗?
谢谢
发布于 2019-06-26 23:51:09
您可以创建一个匹配整个SQL字符串的模式并捕获每个值,而不是尝试对撇号进行转义。
$pattern = "/(?:[ \w]+ \() (\d+), '(\d+)', '(.+?)', '(.+?)' \)/";
然后将这些值作为参数绑定到每个insert语句的预准备语句。
$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-27 00:54:22
你要非常小心不要在这里得到意想不到的结果,
<?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;
如果以双撇号开头或结尾,将不起作用,例如:$sql = INSERT INTO my_table VALUES ( 123, '456', 'Don't fail', 'hellow worlds'' )
https://stackoverflow.com/questions/56781844
复制相似问题