我们已经获得了成千上万个这样的MySQL INSERT查询字符串:
stat_snow = []
for d in range(len(index_list)):
rfilname = 'MERRAfile.nc4' #full snow file
rsnow = read_netcdf(rfilname,snow)
msnow = rsnow[[0],[index_list[d][0][0][0]],[index_list[d][1][0][0]]][0][0][0]
stat_snow = np.append(stat_snow,msnow)
sql字符串只是在一个项目中提供给我们的。
问题在于,在某些查询中,某些字段值的中间带有单引号,因此在运行$sql = INSERT INTO my_table VALUES ( 123, '456', 'Don't fail', 'hellow world' )
时会引发错误。
在我的示例中,如果我转义了整个$ sql字符串,它也会转义\'456 \'或\'Don \'t fail \',并且也会抛出并出错,这就是为什么我需要分别提取和转义值,然后将sql查询放回去。
我需要从括号内提取值并将它们放入数组中,以便可以分别对它们进行转义。 像这样:
mysqli_query($sql)
我可以使用正则表达式吗?
我知道表“ my_table”的列数。
还有其他解决方案吗?
谢谢
答案 0 :(得分: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();
}
答案 1 :(得分: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'' )