首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从MySQL INSERT查询字符串中提取括号内的值

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

Stack Overflow用户
提问于 2019-06-27 06:48:17
回答 2查看 215关注 0票数 0

我们已经得到了数以千计的MySQL插入查询字符串,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
$sql = INSERT INTO my_table VALUES ( 123, '456', 'Don't fail', 'hellow world' )

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

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

在我的示例中,如果我转义整个$sql字符串,它也将转义\'456\‘或\’不要失败\‘,这也将抛出and error,这就是为什么我需要分别提取和转义这些值,然后将sql查询放回一起。

我需要从括号中提取值,并将它们放入一个数组中,这样我就可以逐个对它们进行转义。如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
$vals[0] = 123
$vals[0] = 456
$vals[0] = Don't fail
$vals[0] = hellow world

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

我知道表"my_table“的列数。

还有其他的解决方案吗?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2019-06-27 07:51:09

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

代码语言:javascript
代码运行次数:0
运行
复制
$pattern = "/(?:[ \w]+ \() (\d+), '(\d+)', '(.+?)', '(.+?)' \)/";

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

代码语言:javascript
代码运行次数:0
运行
复制
$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();
}
票数 0
EN

Stack Overflow用户

发布于 2019-06-27 08:54:22

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

代码语言:javascript
代码运行次数: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;

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56781844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档