2011-01-20 234 views
1

我想從phpmyadmin導出格式拆分mysql查詢。每個查詢將以「;」分隔但不能使用爆炸,因爲「;」可能在任何地方都有實地價值。下面是一個例子。在數組中拆分mysql查詢,每個查詢用「;」分隔

insert into wp_options (option_id, blog_id, option_name, option_value, autoload) values (201, 0, "tadv_btns2", "a:21:{i:0;s:14:\"fontsizeselect\";i:1;s:12:\"formatselect\";i:2;s:9:\"pastetext\";i:3;s:9:\"pasteword\";i:4;s:12:\"removeformat\";i:5;s:9:\"separator\";i:6;s:7:\"charmap\";i:7;s:5:\"print\";i:8;s:9:\"separator\";i:9;s:9:\"forecolor\";i:10;s:9:\"backcolor\";i:11;s:8:\"emotions\";i:12;s:9:\"separator\";i:13;s:3:\"sup\";i:14;s:3:\"sub\";i:15;s:5:\"media\";i:16;s:9:\"separator\";i:17;s:4:\"undo\";i:18;s:4:\"redo\";i:19;s:7:\"attribs\";i:20;s:7:\"wp_help\";}", "no"); 

insert into wp_options (option_id, blog_id, option_name, option_value, autoload) values (202, 0, "tadv_btns3", "a:0:{}", "no"); 

insert into wp_options (option_id, blog_id, option_name, option_value, autoload) values (203, 0, "tadv_btns4", "a:0:{}", "no"); 

insert into wp_options (option_id, blog_id, option_name, option_value, autoload) values (204, 0, "tadv_allbtns", "a:64:{i:0;s:6:\"wp_adv\";i:1;s:4:\"bold\";i:2;s:6:\"italic\";i:3;s:13:\"strikethrough\";i:4;s:9:\"underline\";i:5;s:7:\"bullist\";i:6;s:7:\"numlist\";i:7;s:7:\"outdent\";i:8;s:6:\"indent\";i:9;s:11:\"justifyleft\";i:10;s:13:\"justifycenter\";i:11;s:12:\"justifyright\";i:12;s:11:\"justifyfull\";i:13;s:3:\"cut\";i:14;s:4:\"copy\";i:15;s:5:\"paste\";i:16;s:4:\"link\";i:17;s:6:\"unlink\";i:18;s:5:\"image\";i:19;s:7:\"wp_more\";i:20;s:7:\"wp_page\";i:21;s:6:\"search\";i:22;s:7:\"replace\";i:23;s:10:\"fontselect\";i:24;s:14:\"fontsizeselect\";i:25;s:7:\"wp_help\";i:26;s:10:\"fullscreen\";i:27;s:11:\"styleselect\";i:28;s:12:\"formatselect\";i:29;s:9:\"forecolor\";i:30;s:9:\"backcolor\";i:31;s:9:\"pastetext\";i:32;s:9:\"pasteword\";i:33;s:12:\"removeformat\";i:34;s:7:\"cleanup\";i:35;s:12:\"spellchecker\";i:36;s:7:\"charmap\";i:37;s:5:\"print\";i:38;s:4:\"undo\";i:39;s:4:\"redo\";i:40;s:13:\"tablecontrols\";i:41;s:4:\"cite\";i:42;s:3:\"ins\";i:43;s:3:\"del\";i:44;s:4:\"abbr\";i:45;s:7:\"acronym\";i:46;s:7:\"attribs\";i:47;s:5:\"layer\";i:48;s:5:\"advhr\";i:49;s:4:\"code\";i:50;s:11:\"visualchars\";i:51;s:11:\"nonbreaking\";i:52;s:3:\"sub\";i:53;s:3:\"sup\";i:54;s:9:\"visualaid\";i:55;s:10:\"insertdate\";i:56;s:10:\"inserttime\";i:57;s:6:\"anchor\";i:58;s:10:\"styleprops\";i:59;s:8:\"emotions\";i:60;s:5:\"media\";i:61;s:10:\"blockquote\";i:62;s:9:\"separator\";i:63;s:1:\"|\";}", "no"); 
+1

使用換行符分割? – ajreal 2011-01-20 13:42:24

+0

更新PHP版本的注意事項:mysqli在一個字符串中支持多個statemens,其功能爲mysqli_multi_query() - > http://php.net/manual/de/mysqli.quickstart.multiple-statement.php – BurninLeo 2017-01-21 19:50:04

回答

1

一種方式做的是:

通過爆炸「);」

它會返回語句

的陣列

然後CONCAT「)」在每個語句中陣列的端

0

通過「換行」字符分隔這些線路?如果是剛剛爆炸他們:

$my_array = explode("\n",$content);

+0

實際上有些查詢分爲不止一行如此爆炸(「\ n」,$ content)將不起作用 – Mihir 2011-01-20 17:48:39

1

我的建議是有東西會是唯一的,以取代您的分隔符。例如,分號不會是唯一的(如你所描述的),所以你不能在這個分割。換行符(如前所述)可能是一個很好且簡單的選擇。

0

如何對這樣的事情

$fh = fopen('/path/to/your/file.sql', 'r') or die($php_errormsg); 
while (!feof($fh)) { 
    $line = fgets($fh, 4096); 
    if (preg_match($pattern, $line)) { $sql_queries[ ] = $line; } 
} 
fclose($fh); 

其中$模式可以被初始化爲SQL INSERT查詢格式。 使用新行不會是一個很好的選擇,因爲大的SQL插入綿延多行

7

給出一個包含字符串的多個,分號分隔的SQL語句,下面的函數解析出每個個別語句並將它們全部返回到數組中。它使用一個(非平凡的)正則表達式和一個對preg_match_all()的調用,並正確處理單行和多行註釋,以及單引號和雙引號字符串(每個字符串可能包含要忽略的非終止分號) :

function split_sql($sql_text) { 
    // Return array of ; terminated SQL statements in $sql_text. 
    $re_split_sql = '%(?#!php/x re_split_sql Rev:20170816_0600) 
     # Match an SQL record ending with ";" 
     \s*          # Discard leading whitespace. 
     (          # $1: Trimmed non-empty SQL record. 
      (?:         # Group for content alternatives. 
      \'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\' # Either a single quoted string, 
      | "[^"\\\\]*(?:\\\\.[^"\\\\]*)*"  # or a double quoted string, 
      | /\*[^*]*\*+(?:[^*/][^*]*\*+)*/  # or a multi-line comment, 
      | \#.*        # or a # single line comment, 
      | --.*        # or a -- single line comment, 
      | [^"\';#]       # or one non-["\';#-] 
     )+         # One or more content alternatives 
      (?:;|$)        # Record end is a ; or string end. 
     )          # End $1: Trimmed SQL record. 
     %x'; // End $re_split_sql. 
    if (preg_match_all($re_split_sql, $sql_text, $matches)) { 
     return $matches[1]; 
    } 
    return array(); 
} 

編輯2017年8月15日:在正則表達式的多行註釋部分修正錯誤中指出@jxmallett。 編輯2017-08-16:整理正則表達式(添加正則表達式shebang和刪除不必要的組$2)。