【发布时间】:2019-06-26 22:48:17
【问题描述】:
我们已经收到了数千个这样的 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”表的列数。
还有其他解决方案吗?
谢谢
【问题讨论】:
-
你为什么要逃避他们?它们是如何产生的?这是在 SQL 文件中吗? cakePHP 与此有什么关系?还是 MySQLi?
-
sql字符串只是在一个项目中给我们的。在我的例子中,如果我转义整个 $sql 字符串,它也会转义 \'456\' 或 \'Don\'t fail\',这也会抛出和错误,这就是我需要提取和转义的原因单独的值,然后将 sql 查询重新组合在一起。
-
不,我的意思是你从哪里得到这种格式的 SQL?我想这不是精灵给你的。如果它来自 mysqldump 或 phpMyAdmin,它已经被转义了。如果它是由某人手动编写的,那么问题是为什么?
-
@Alex
mysqli_real_escape_string对完整的 SQL 查询有何帮助? -
@Dharman 我们有一个巨大的 sql 转储文件,其中包含 750 多个表和数百万行,当我将它导入 phpmyadmin 时,它会超时。因此,我设法在原始大转储上使用 file_get_contents 将其划分为 750 个较小的 .sql 转储(每个表一个)。也许这就是他们没有逃脱的原因?如何改用 IDE?