将包含N sql命令的字符串拆分为数组?

时间:2015-11-03 15:12:01

标签: php preg-match preg-split

在PHP上,使用每个sql命令将具有多个插入和/或更新和/或删除的大型sql字符串拆分成数组的最佳方法是什么?

例如:

INSERT INTO tbl () VALUES ();
INSERT INTO tbl_child () VALUES ();
INSERT INTO tbl_child () VALUES ();
UPDATE tbl_child SET ... WHERE ...;

我可以假设每条指令的末尾都有分号,但查询值中可能有分号,例如:field ='part1; part2; etc'

2 个答案:

答案 0 :(得分:0)

insertupdate之前添加唯一字符串,例如-splittingstring-

$sqls=str_ireplace(";insert",";-splittingstring-insert",$sqls);  <--to be replaced
$sqls=str_ireplace(";update",";-splittingstring-update",$sqls);  <--to be replaced
$arr=explode("-splittingstring-",$sqls);

foreach($arr as $sql) {
if(!empty($sql)) {
//PDO or mysqli code here...
}
}

<强>更新

替换上面的行
$sqls=preg_replace("/(;)[\r|\n]+(insert|update|delete)/m", "\\1-splittingstring-\\2", $sqls);

答案 1 :(得分:-1)

我能找到的最佳解决方案如下:

foreach (preg_split("/;[\r|\n]{1,2}(insert|update|delete)+/i", $qry, 0, PREG_SPLIT_DELIM_CAPTURE) as $part) {
    if (in_array(strtolower($part), array("insert","update","delete"))) {
        $prefix = $part;
    } else if (trim($part) != "") {
        $part = $prefix . $part;
        // exec...
        $prefix = "";
    }
}

每个人都特别提到@samlev的初步想法