Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用N个sql命令将字符串拆分为一个数组?_Php_Preg Match_Preg Split - Fatal编程技术网

Php 使用N个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;第二部

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

例如:

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 = "";
    }
}