从PHP中加载.sql文件

我正在为正在开发的应用程序创build一个安装脚本,并且需要从PHP内部dynamic创build数据库。 我已经得到它来创build数据库,但现在我需要加载在几个.sql文件。 我曾打算一次打开文件和mysql_query,直到我查看模式文件,并意识到它们不是每行一个查询。

那么,如何从PHP内部加载一个sql文件(就像phpMyAdmin的导入命令一样)?

我感觉到,在这里回答这个问题的每个人都不知道成为一个允许人们在自己的服务器上安装应用程序的Web应用程序开发人员是什么感觉。 共享主机,特别是,不允许你像前面提到的“LOAD DATA”查询那样使用SQL。 大多数共享主机也不允许你使用shell_exec。

现在,为了回答OP,最好的办法是在一个variables中构build一个包含查询的PHP文件,然后运行它们。 如果你决定分析.sql文件,你应该看看phpMyAdmin,并获得一些想法,从这种方式获取.sql文件的数据。 看看有安装程序的其他Web应用程序,你会发现,而不是使用.sql文件进行查询,只是将它们打包在PHP文件中,并通过mysql_query或任何他们需要做的事情来运行每个string。

 $db = new PDO($dsn, $user, $password); $sql = file_get_contents('file.sql'); $qr = $db->exec($sql); 

phpBB使用一些函数来parsing他们的文件。 他们是相当好的评论(什么是例外!),所以你可以很容易地知道他们在做什么(我从http://www.frihost.com/forums/vt-8194.html得到这个解决scheme)。; 这是我用过很多的解决scheme:

 <php ini_set('memory_limit', '5120M'); set_time_limit ( 0 ); /*************************************************************************** * sql_parse.php * ------------------- * begin : Thu May 31, 2001 * copyright : (C) 2001 The phpBB Group * email : support@phpbb.com * * $Id: sql_parse.php,v 1.8 2002/03/18 23:53:12 psotfx Exp $ * ****************************************************************************/ /*************************************************************************** * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * ***************************************************************************/ /*************************************************************************** * * These functions are mainly for use in the db_utilities under the admin * however in order to make these functions available elsewhere, specifically * in the installation phase of phpBB I have seperated out a couple of * functions into this file. JLH * \***************************************************************************/ // // remove_comments will strip the sql comment lines out of an uploaded sql file // specifically for mssql and postgres type files in the install.... // function remove_comments(&$output) { $lines = explode("\n", $output); $output = ""; // try to keep mem. use down $linecount = count($lines); $in_comment = false; for($i = 0; $i &lt; $linecount; $i++) { if( preg_match("/^\/\*/", preg_quote($lines[$i])) ) { $in_comment = true; } if( !$in_comment ) { $output .= $lines[$i] . "\n"; } if( preg_match("/\*\/$/", preg_quote($lines[$i])) ) { $in_comment = false; } } unset($lines); return $output; } // // remove_remarks will strip the sql comment lines out of an uploaded sql file // function remove_remarks($sql) { $lines = explode("\n", $sql); // try to keep mem. use down $sql = ""; $linecount = count($lines); $output = ""; for ($i = 0; $i &lt; $linecount; $i++) { if (($i != ($linecount - 1)) || (strlen($lines[$i]) > 0)) { if (isset($lines[$i][0]) && $lines[$i][0] != "#") { $output .= $lines[$i] . "\n"; } else { $output .= "\n"; } // Trading a bit of speed for lower mem. use here. $lines[$i] = ""; } } return $output; } // // split_sql_file will split an uploaded sql file into single sql statements. // Note: expects trim() to have already been run on $sql. // function split_sql_file($sql, $delimiter) { // Split up our string into "possible" SQL statements. $tokens = explode($delimiter, $sql); // try to save mem. $sql = ""; $output = array(); // we don't actually care about the matches preg gives us. $matches = array(); // this is faster than calling count($oktens) every time thru the loop. $token_count = count($tokens); for ($i = 0; $i &lt; $token_count; $i++) { // Don't wanna add an empty string as the last thing in the array. if (($i != ($token_count - 1)) || (strlen($tokens[$i] > 0))) { // This is the total number of single quotes in the token. $total_quotes = preg_match_all("/'/", $tokens[$i], $matches); // Counts single quotes that are preceded by an odd number of backslashes, // which means they're escaped quotes. $escaped_quotes = preg_match_all("/(?&lt;!\\\\)(\\\\\\\\)*\\\\'/", $tokens[$i], $matches); $unescaped_quotes = $total_quotes - $escaped_quotes; // If the number of unescaped quotes is even, then the delimiter did NOT occur inside a string literal. if (($unescaped_quotes % 2) == 0) { // It's a complete sql statement. $output[] = $tokens[$i]; // save memory. $tokens[$i] = ""; } else { // incomplete sql statement. keep adding tokens until we have a complete one. // $temp will hold what we have so far. $temp = $tokens[$i] . $delimiter; // save memory.. $tokens[$i] = ""; // Do we have a complete statement yet? $complete_stmt = false; for ($j = $i + 1; (!$complete_stmt && ($j &lt; $token_count)); $j++) { // This is the total number of single quotes in the token. $total_quotes = preg_match_all("/'/", $tokens[$j], $matches); // Counts single quotes that are preceded by an odd number of backslashes, // which means they're escaped quotes. $escaped_quotes = preg_match_all("/(?&lt;!\\\\)(\\\\\\\\)*\\\\'/", $tokens[$j], $matches); $unescaped_quotes = $total_quotes - $escaped_quotes; if (($unescaped_quotes % 2) == 1) { // odd number of unescaped quotes. In combination with the previous incomplete // statement(s), we now have a complete statement. (2 odds always make an even) $output[] = $temp . $tokens[$j]; // save memory. $tokens[$j] = ""; $temp = ""; // exit the loop. $complete_stmt = true; // make sure the outer loop continues at the right point. $i = $j; } else { // even number of unescaped quotes. We still don't have a complete statement. // (1 odd and 1 even always make an odd) $temp .= $tokens[$j] . $delimiter; // save memory. $tokens[$j] = ""; } } // for.. } // else } } return $output; } $dbms_schema = 'yourfile.sql'; $sql_query = @fread(@fopen($dbms_schema, 'r'), @filesize($dbms_schema)) or die('problem '); $sql_query = remove_remarks($sql_query); $sql_query = split_sql_file($sql_query, ';'); $host = 'localhost'; $user = 'user'; $pass = 'pass'; $db = 'database_name'; //In case mysql is deprecated use mysqli functions. mysql_connect($host,$user,$pass) or die('error connection'); mysql_select_db($db) or die('error database selection'); $i=1; foreach($sql_query as $sql){ echo $i++; echo "<br />"; mysql_query($sql) or die('error in query'); } ?> 

最简单的解决scheme是使用shell_exec()以SQL脚本作为input运行mysql客户端。 这可能会运行得慢一些,因为它必须分叉,但是你可以在几分钟之内编写代码,然后回到工作中。 编写一个PHP脚本来运行任何SQL脚本可能需要几个星期。

支持SQL脚本比人们在这里描述的要复杂得多,除非你确定你的脚本只包含脚本function的一个子集。 以下是可能出现在普通SQL脚本中的一些示例,这些示例使编写脚本逐行解释脚本变得复杂。

 -- Comment lines cannot be prepared as statements -- This is a MySQL client tool builtin command. -- It cannot be prepared or executed by server. USE testdb; -- This is a multi-line statement. CREATE TABLE foo ( string VARCHAR(100) ); -- This statement is not supported as a prepared statement. LOAD DATA INFILE 'datafile.txt' INTO TABLE foo; -- This statement is not terminated with a semicolon. DELIMITER // -- This multi-line statement contains a semicolon -- but not as the statement terminator. CREATE PROCEDURE simpleproc (OUT param1 INT) BEGIN SELECT COUNT(*) INTO param1 FROM foo; END // 

如果你只支持SQL脚本的一个子集,不包括上面那些angular落的情况,编写一个PHP脚本来读取文件并在文件中执行SQL语句是相对容易的。 但是如果你想支持任何有效的SQL脚本,那就更加复杂了。


另请参阅我对这些相关问题的回答:

  • 在PHP中运行MySQL * .sql文件
  • 是否有可能从另一个SQL脚本中的存储过程调用SQL脚本?
  • PHP:一个mysql_query语句中的多个SQL查询

mysqli可以运行多个查询分隔的;

你可以读取整个文件并使用mysqli_multi_query()一次全部运行

但是,我会第一个说这不是最优雅的解决scheme。

在我的项目中我使用了下一个解决scheme:

 <?php /** * Import SQL from file * * @param string path to sql file */ function sqlImport($file) { $delimiter = ';'; $file = fopen($file, 'r'); $isFirstRow = true; $isMultiLineComment = false; $sql = ''; while (!feof($file)) { $row = fgets($file); // remove BOM for utf-8 encoded file if ($isFirstRow) { $row = preg_replace('/^\x{EF}\x{BB}\x{BF}/', '', $row); $isFirstRow = false; } // 1. ignore empty string and comment row if (trim($row) == '' || preg_match('/^\s*(#|--\s)/sUi', $row)) { continue; } // 2. clear comments $row = trim(clearSQL($row, $isMultiLineComment)); // 3. parse delimiter row if (preg_match('/^DELIMITER\s+[^ ]+/sUi', $row)) { $delimiter = preg_replace('/^DELIMITER\s+([^ ]+)$/sUi', '$1', $row); continue; } // 4. separate sql queries by delimiter $offset = 0; while (strpos($row, $delimiter, $offset) !== false) { $delimiterOffset = strpos($row, $delimiter, $offset); if (isQuoted($delimiterOffset, $row)) { $offset = $delimiterOffset + strlen($delimiter); } else { $sql = trim($sql . ' ' . trim(substr($row, 0, $delimiterOffset))); query($sql); $row = substr($row, $delimiterOffset + strlen($delimiter)); $offset = 0; $sql = ''; } } $sql = trim($sql . ' ' . $row); } if (strlen($sql) > 0) { query($row); } fclose($file); } /** * Remove comments from sql * * @param string sql * @param boolean is multicomment line * @return string */ function clearSQL($sql, &$isMultiComment) { if ($isMultiComment) { if (preg_match('#\*/#sUi', $sql)) { $sql = preg_replace('#^.*\*/\s*#sUi', '', $sql); $isMultiComment = false; } else { $sql = ''; } if(trim($sql) == ''){ return $sql; } } $offset = 0; while (preg_match('{--\s|#|/\*[^!]}sUi', $sql, $matched, PREG_OFFSET_CAPTURE, $offset)) { list($comment, $foundOn) = $matched[0]; if (isQuoted($foundOn, $sql)) { $offset = $foundOn + strlen($comment); } else { if (substr($comment, 0, 2) == '/*') { $closedOn = strpos($sql, '*/', $foundOn); if ($closedOn !== false) { $sql = substr($sql, 0, $foundOn) . substr($sql, $closedOn + 2); } else { $sql = substr($sql, 0, $foundOn); $isMultiComment = true; } } else { $sql = substr($sql, 0, $foundOn); break; } } } return $sql; } /** * Check if "offset" position is quoted * * @param int $offset * @param string $text * @return boolean */ function isQuoted($offset, $text) { if ($offset > strlen($text)) $offset = strlen($text); $isQuoted = false; for ($i = 0; $i < $offset; $i++) { if ($text[$i] == "'") $isQuoted = !$isQuoted; if ($text[$i] == "\\" && $isQuoted) $i++; } return $isQuoted; } function query($sql) { global $mysqli; //echo '#<strong>SQL CODE TO RUN:</strong><br>' . htmlspecialchars($sql) . ';<br><br>'; if (!$query = $mysqli->query($sql)) { throw new Exception("Cannot execute request to the database {$sql}: " . $mysqli->error); } } set_time_limit(0); $mysqli = new mysqli('localhost', 'root', '', 'test'); $mysqli->set_charset("utf8"); header('Content-Type: text/html;charset=utf-8'); sqlImport('import.sql'); echo "Peak MB: ", memory_get_peak_usage(true)/1024/1024; 

在testingsql文件(41Mb)内存高峰使用率:3.25Mb

我的build议是查看PHPMyBackup的源代码。 这是一个自动的PHP SQL加载器。 你会发现mysql_query一次只加载一个查询,像PHPMyAdmin和PHPMyBackup这样的项目已经为你正确的parsingSQL做了很多工作。 请不要重新发明那个轮子:P

Plahcinski解决scheme的更新解决scheme。 或者,您可以使用fopen和fread更大的文件:

 $fp = file('database.sql', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); $query = ''; foreach ($fp as $line) { if ($line != '' && strpos($line, '--') === false) { $query .= $line; if (substr($query, -1) == ';') { mysql_query($query); $query = ''; } } } 

由于我不能评论答案,谨防使用以下解决scheme:

 $db = new PDO($dsn, $user, $password); $sql = file_get_contents('file.sql'); $qr = $db->exec($sql); 

在PHP PDO https://bugs.php.net/bug.php?id=61613有一个错误;

 db->exec('SELECT 1; invalidstatement; SELECT 2'); 

不会出错或返回false(在PHP 5.5.14上testing)。

适用于Navicat转储。 可能需要转储第一个/ * * /注释navicat放入。

 $file_content = file('myfile.sql'); $query = ""; foreach($file_content as $sql_line){ if(trim($sql_line) != "" && strpos($sql_line, "--") === false){ $query .= $sql_line; if (substr(rtrim($query), -1) == ';'){ echo $query; $result = mysql_query($query)or die(mysql_error()); $query = ""; } } } 

尝试这个:

 // SQL File $SQLFile = 'YourSQLFile.sql'; // Server Name $hostname = 'localhost'; // User Name $db_user = 'root'; // User Password $db_password = ''; // DBName $database_name = 'YourDBName'; // Connect MySQL $link = mysql_connect($hostname, $db_user, $db_password); if (!$link) { die("MySQL Connection error"); } // Select MySQL DB mysql_select_db($database_name, $link) or die("Wrong MySQL Database"); // Function For Run Multiple Query From .SQL File function MultiQuery($sqlfile, $sqldelimiter = ';') { set_time_limit(0); if (is_file($sqlfile) === true) { $sqlfile = fopen($sqlfile, 'r'); if (is_resource($sqlfile) === true) { $query = array(); echo "<table cellspacing='3' cellpadding='3' border='0'>"; while (feof($sqlfile) === false) { $query[] = fgets($sqlfile); if (preg_match('~' . preg_quote($sqldelimiter, '~') . '\s*$~iS', end($query)) === 1) { $query = trim(implode('', $query)); if (mysql_query($query) === false) { echo '<tr><td>ERROR:</td><td> ' . $query . '</td></tr>'; } else { echo '<tr><td>SUCCESS:</td><td>' . $query . '</td></tr>'; } while (ob_get_level() &gt; 0) { ob_end_flush(); } flush(); } if (is_string($query) === true) { $query = array(); } } echo "</table>"; return fclose($sqlfile); } } return false; } /* * * Use Function Like This: ** */ MultiQuery($SQLFile); 

你确定它不是每行一个查询吗? 你的文本编辑器可能会包装线,但实际上每个查询可能在一行。

无论如何,olle的方法似乎是最好的。 如果您有理由一次运行查询,则应该能够逐行读入文件,然后在每个查询的末尾使用分号来分隔。 你一个接一个地在文件中读取文件要比分割一个巨大的string好得多,因为它对你的服务器的内存会更友好。 例:

 $query = ''; $handle = @fopen("/sqlfile.sql", "r"); if ($handle) { while (!feof($handle)) { $query.= fgets($handle, 4096); if (substr(rtrim($query), -1) == ';') { // ...run your query, then unset the string $query = ''; } } fclose($handle); } 

很明显,你需要考虑事务,其余的是如果你在批处理中运行大量的查询,但是对于新安装的脚本来说这可能不是什么大问题。

 mysql_query("LOAD DATA LOCAL INFILE '/path/to/file' INTO TABLE mytable"); 

除非你打算导入巨大的 .sql文件,只要将整个文件读入内存,并将其作为查询运行即可。

我已经使用PHP了一段时间,所以,伪代码:

 all_query = read_file("/my/file.sql") con = mysql_connect("localhost") con.mysql_select_db("mydb") con.mysql_query(all_query) con.close() 

除非文件是巨大的(比如说,超过几兆字节),否则没有理由一次执行它,或尝试将其分割成多个查询(通过使用分割,这正如我对cam8001的回答所评论的如果查询在string中有分号,则中断

这是最好的代码恢复SQL的PHP​​可以使用100%Goooood! 非常感谢

 $file_content = file('myfile.sql'); $query = ""; foreach($file_content as $sql_line){ if(trim($sql_line) != "" && strpos($sql_line, "--") === false){ $query .= $sql_line; if (substr(rtrim($query), -1) == ';'){ echo $query; $result = mysql_query($query)or die(mysql_error()); $query = ""; } } } 

加载和parsingphpmyadmin转储或mysql转储文件的最简单和最快的方法..

 $ mysql -u username -p -h localhost dbname < dumpfile.sql 

简而言之,我这样做的方式是:

  1. 读取文件(一个数据库转储,例如$ mysqldump db > db.sql

     $sql = file_get_contents(db.sql); 
  2. 使用mysqli :: multi_query导入它

     if ($mysqli->multi_query($sql)) { $mysqli->close(); } else { throw new Exception ($mysqli->error); } 

注意mysqli_query支持asynchronous查询。 更多这里: http : //php.net/manual/en/mysqli.multi-query.php和在这里https://stackoverflow.com/a/6652908/2002493

我在这里看到的解决scheme没有处理需要更改分隔符,而在服务器上创build一个存储过程时,我不能指望有权访问LOAD DATA INFILE。 我希望能够发现有人已经解决了这个问题,而不需要去查看phpMyAdmin的代码。 和其他人一样,我也是在自己编写GPL代码时正在寻找别人的GPL方式。

一些PHP库可以parsing由多个SQL语句组成的SQL文件,并正确地分解它(不是简单地使用“;”自然分解),而是执行它们。

例如,检查Phing的PDOSQLExecTask

只是为了重申所有人的问题:

PHP的mysql_query会自动结束每个SQL命令的分隔,另外在手册中这样做是非常模糊的。 一个命令之外的一切都会产生一个错误。

在另一个mysql_query中,包含SQL风格注释的string很好,\ n,\ r ..

mysql_query的局限性在于SQLparsing器直接在下一个命令中报告问题

  You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INSERT INTO `outputdb:` (`intid`, `entry_id`, `definition`) VALUES... 

这是一个快速的解决scheme:(假设格式良好的SQL;

 $sqlCmds = preg_split("/[\n|\t]*;[\n|\t]*[\n|\r]$/", $sqlDump); 

许多主机不允许你通过PHP创build你自己的数据库,但你似乎已经解决了这个问题。
一旦数据库被创build,你可以简单地操作和填充它:

的mysql_connect( “本地主机”);
mysql_query(“SOURCE file.sql”);

这可能会有所帮助 – >

它或多或less的做法是首先获取给函数的string(file.sql的file_get_contents()值),并删除所有的换行符。 然后按“;”分割数据 字符。 接下来进入一个while循环,查看创build的数组的每一行。 如果行包含“`”字符,它将知道它是一个查询,并为给定的行数据执行myquery()函数。

码:

 function myquery($query) { mysql_connect(dbhost, dbuser, dbpass); mysql_select_db(dbname); $result = mysql_query($query); if (!mysql_errno() && @mysql_num_rows($result) > 0) { } else { $result="not"; } mysql_close(); return $result; } function mybatchquery ($str) { $sql = str_replace("\n","",$str) $sql = explode(";",$str); $x=0; while (isset($str[$x])) { if (preg_match("/(\w|\W)+`(\w|\W)+) { myquery($str[$x]); } $x++ } return TRUE; } function myrows($result) { $rows = @mysql_num_rows($result); return $rows; } function myarray($result) { $array = mysql_fetch_array($result); return $array; } function myescape($query) { $escape = mysql_escape_string($query); return $escape; } $str = file_get_contents("foo.sql"); mybatchquery($str); 

为什么不从phpMyAdmin获取代码并使用它? 毕竟它是开源的…

我经常用这个:

 $sql = explode(";",file_get_contents('[your dump file].sql'));// foreach($sql as $query) mysql_query($query); 

我希望下面的代码能很好地解决你的问题。

 //Empty all tables' contents $result_t = mysql_query("SHOW TABLES"); while($row = mysql_fetch_assoc($result_t)) { mysql_query("TRUNCATE " . $row['Tables_in_' . $mysql_database]); } // Temporary variable, used to store current query $templine = ''; // Read in entire file $lines = file($filename); // Loop through each line foreach ($lines as $line) { // Skip it if it's a comment if (substr($line, 0, 2) == '--' || $line == '') continue; // Add this line to the current segment $templine .= $line; // If it has a semicolon at the end, it's the end of the query if (substr(trim($line), -1, 1) == ';') { // Perform the query mysql_query($templine) or print('Error performing query \'<strong>' . $templine . '\': ' . mysql_error() . '<br /><br />'); // Reset temp variable to empty $templine = ''; } } ?> 

这实际上为我工作:

 /* load sql-commands from a sql file */ function loadSQLFromFile($url) { // ini_set ( 'memory_limit', '512M' ); // set_time_limit ( 0 ); global $settings_database_name; global $mysqli_object; global $worked; $worked = false; $sql_query = ""; // read line by line $lines = file($url); $count = count($lines); for($i = 0;$i<$count;$i++) { $line = $lines[$i]; $cmd3 = substr($line, 0, 3); $cmd4 = substr($line, 0, 4); $cmd6 = substr($line, 0, 6); if($cmd3 == "USE") { // cut away USE ``; $settings_database_name = substr($line, 5, -3); } else if($cmd4 == "DROP") { $mysqli_object->query($line); // execute this line } else if(($cmd6 == "INSERT") || ($cmd6 == "CREATE")) { // sum all lines up until ; is detected $multiline = $line; while(!strstr($line, ';')) { $i++; $line = $lines[$i]; $multiline .= $line; } $multiline = str_replace("\n", "", $multiline); // remove newlines/linebreaks $mysqli_object->query($multiline); // execute this line } } return $worked; } ?> 

有些人(Plahcinski)提出这样的代码:

 $file_content = file('myfile.sql'); $query = ""; foreach($file_content as $sql_line){ if(trim($sql_line) != "" && strpos($sql_line, "--") === false){ $query .= $sql_line; if (substr(rtrim($query), -1) == ';'){ echo $query; $result = mysql_query($query)or die(mysql_error()); $query = ""; } } } 

但我会更新为我工作的那个:

  //selecting my database $database = 'databaseTitleInFile'; $selectDatabase = mysql_select_db($database, $con); if(! $selectDatabase ) { die('Could not select the database: ' . mysql_error()); } echo "The database " . $database . " selected successfully\n"; //reading the file $file_path='..\yourPath\to\File'; if(!file_exists($file_path)){ echo "File Not Exists"; } $file_content = file_get_contents($file_path); $array = explode("\n", $file_content) //making queries $query = ""; foreach($array as $sql_line){ $sql_line=trim($sql_line); if($sql_line != "" && substr($sql_line, 0, 2) === "--" && strpos($sql_line, "/*") === false){ $query .= $sql_line; if (substr(rtrim($query), -1) == ';'){ $result = mysql_query($query)or die(mysql_error()); $query = ""; } } } 

因为它更全面。 😉

我有一个环境,没有mysql工具或phpmyadmin只是我的PHP应用程序连接到不同的主机上的MySQL服务器,但我需要运行由mysqldump或myadmin导出的脚本。 为了解决这个问题,我创build了一个脚本multi_query就像我在这里提到的那样

它可以在不使用mysql命令行工具的情况下处理mysqldump输出和phpmyadmin输出。 我也做了一些逻辑来处理多个迁移文件,这些文件基于Rails中存储在数据库中的时间戳。 我知道它需要更多的error handling,但目前为我做的工作。

检查出来: https : //github.com/kepes/php-migration

这是纯粹的PHP,不需要任何其他工具。 如果你不处理用户input,只有开发人员或导出工具制作的脚本,你可以安全地使用它。

我注意到PostgreSQL PDO驱动程序不允许你运行以分号分隔的脚本。 为了在任何使用PDO的数据库上运行.sql文件,必须自己将代码拆分为PHP代码。 这是一个似乎工作得很好的解决scheme:

https://github.com/diontruter/migrate/blob/master/src/Diontruter/Migrate/SqlScriptParser.php

被引用的类以独立于数据库的方式为我完成了技巧,如果有任何问题,请给我留言。 以下是在将脚本添加到项目后如何使用脚本:

 $pdo = new PDO($connectionString, $userName, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $parser = new SqlScriptParser(); $sqlStatements = $parser->parse($fileName); foreach ($sqlStatements as $statement) { $distilled = $parser->removeComments($statement); if (!empty($distilled)) { $statement = $pdo->prepare($sql); $affectedRows = $statement->execute(); } }