从MySQL INSERT查询字符串中提取括号内的值

时间:2019-06-26 22:48:17

标签: php mysql regex mysqli

我们已经获得了成千上万个这样的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”的列数。

还有其他解决方案吗?

谢谢

2 个答案:

答案 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'' )

,则无法使用

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