Php 使用N个sql命令将字符串拆分为一个数组?
在PHP上,使用每个sql命令将具有多个插入和/或更新和/或删除的大型sql字符串拆分为一个数组的最佳方法是什么 例如:Php 使用N个sql命令将字符串拆分为一个数组?,php,preg-match,preg-split,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;第二部
INSERT INTO tbl () VALUES ();
INSERT INTO tbl_child () VALUES ();
INSERT INTO tbl_child () VALUES ();
UPDATE tbl_child SET ... WHERE ...;
我可以假设每条指令的末尾都有一个分号,但是查询值中可能有分号,例如:field='part1;第二部分;etc'在
插入之前添加唯一字符串和更新类似-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...
}
}
我能找到的最佳解决方案如下:
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 = "";
}
}
tks Everyone,特别是@samlev,最初的想法你能假设每个命令都在一个新行上吗?如果是,您可以匹配/$/代码>我已经考虑过了,但它不是100%准确。我可以假设在每个命令的末尾都有一个新行,但是在查询中可以找到相同的行:field='val1\n-val2\n etc'仍然是最好的答案,但不知何故我的示例字符串不起作用:foreach(preg_split(“/;$/”,$sql)作为$part)我做错了什么吗?@fcaserio为什么preg_split
会起作用??你们在这个领域也有新线……事实上,我认为这是一个起点。像preg|u split(“/;$(INSERT | UPDATE | DELETE)/i“,$sql)这样的东西可能会work@dstudeba我误解了这个问题。。我已经更新了我的答案事实上,这也不起作用。“插入”和“更新”这两个词也可以在字段定义中找到。谢谢,我删除了我的评论。只有在sql语句中update和insert不在字符串中时,此操作才有效。最好的方法是确定分号是否在字符串中。我已经添加了分号部分。。但条件是冒号和新sql查询之间不应该有空格,也不应该有换行符每个sql位于以分号结尾的不同行上,但分号可以在引号中找到,如“field='val1;\n val2;\n etc”中所示
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 = "";
}
}