2015-11-03 126 views
0

在PHP上,使用每個sql命令將多個插入和/或更新和/或刪除的大型sql字符串拆分成數組的最佳方式是什麼?將N個sql命令拆分爲一個數組?

例如:

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

我可以假設有關於每個指令的分號結尾,但有可能是查詢值內分號,例如:字段=「1部分;第2部分,等等」

+1

你可以假設每一個命令是在一個新的線上?如果是這樣,你可以匹配'/; $ /' – samlev

+0

我已經考慮過了,但它不是100%準確的。我可以假設每條命令末尾總是有一個新行,但在查詢內部可以找到相同的內容:field ='val1; \ n val2; \ n etc' – fcaserio

+0

仍然是beste答案,但不知何故不起作用與我的示例字符串:foreach(preg_split(「/; $ /」,$ sql)作爲$部分) 我做錯了什麼? – fcaserio

回答

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); 
+0

@dstudeba我誤解了這個問題..我已經更新了我的答案 –

+0

其實,這也行不通。單詞插入和更新可以在字段定義中找到,如welll。 – fcaserio

+0

都是在一行中的sql查詢? –

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

TKS大家特別@samlev

+0

not at您不必要地刪除和添加所有最佳解決方案... –