【问题标题】:Php split SQL in separate queriesphp 在单独的查询中拆分 SQL
【发布时间】:2015-01-14 08:06:49
【问题描述】:

我想将 SQL 拆分为单独的查询...但仍然无法正常工作

$string = 'CREATE TABLE `articles` (
`id` int(9) auto_increment,
`context` text,
PRIMARY KEY (`id`)
) DEFAULT CHARSET='utf8' COLLATE='utf8_general_ci';

INSERT INTO `articles` VALUES (1, "insert; row1;"),
(2, "update; row2;")';


preg_match_all("/([^;\"]*?(\".*?\")?)*?;\s*/U", $string, $result);
print_r($result[0]);

【问题讨论】:

标签: php mysql split preg-match preg-match-all


【解决方案1】:

使用爆炸:

$queries = explode(";\n", $string);

或者你可以预先过滤字符串:

$strings = array();
function capture($match) {
    global $strings;
    $strings[] = $match[0];
    return '<<<' . count($strings) . '>>>';
}
function recopy($string) {
    global $strings;
    foreach($strings as $key => $value) {
        $string = str_replace('<<<' . $key . '>>>', $value, $string);
    }
    return $string;
}
$string = preg_replace_callback('#([\'"]).*(?<!\\\\)(?:\\\\\\\\)*\\1#isU', 'capture', $string);
$queries = array_map('recopy', explode(";", $string));

正如拉斯穆斯所说,用 \' 转义 '。

【讨论】:

  • 是的,我已经用 ;\n 进行了编辑,这是第二个完整的解决方案。
  • 代码已修复,下次代码失败时也会给出错误消息。请少用感叹号。
【解决方案2】:

我认为您可以使用explode(";",$string) 或找到 ;然后定位substr()

【讨论】:

  • 我只看到了问题:查询包含 ; “插入;第 1 行;”所以它不能解决问题。
  • 此查询是否始终采用这种格式,这意味着一个创建表然后其余的插入?
【解决方案3】:

另一个问题是您对 php 和查询使用相同的 ',而不是将查询包装在 ' 尝试使用 " 代替。

示例: CHARSET='utf8'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 2021-04-27
    相关资源
    最近更新 更多