2011-01-20 109 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)。