在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'
答案 0 :(得分:0)
在insert
和update
之前添加唯一字符串,例如-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的初步想法