我创造,我正在开发,需要在PHP中动态创建数据库的应用程序的安装脚本。 我已经得到它来创建数据库,但现在我需要在多个.sql文件加载。 我曾计划打开该文件并MYSQL_QUERY有一条线在一个时间 - 直到我看着架构文件,并意识到他们不是每行只有一个查询。
那么,如何加载在PHP中的SQL文件(如phpMyAdmin的,其进口的命令呢)?
我创造,我正在开发,需要在PHP中动态创建数据库的应用程序的安装脚本。 我已经得到它来创建数据库,但现在我需要在多个.sql文件加载。 我曾计划打开该文件并MYSQL_QUERY有一条线在一个时间 - 直到我看着架构文件,并意识到他们不是每行只有一个查询。
那么,如何加载在PHP中的SQL文件(如phpMyAdmin的,其进口的命令呢)?
我越来越觉得,在这里大家谁的回答了这个问题不知道是什么感觉是一个Web应用程序开发谁允许人们安装他们自己的服务器上的应用程序。 共享主机,特别是不允许你使用SQL像前面提到的“LOAD DATA”查询。 大多数共享主机也不允许你使用了shell_exec。
现在,回答OP,最好的办法是刚刚打造出来的,它包含在一个变量您的疑问并可以运行他们的PHP文件。 如果你确定要解析.sql文件,你应该看看phpMyAdmin的,并得到一些想法获取数据出来的.sql文件的方式。 看看周围有安装程序,你会看到,而不是使用.sql文件为他们查询其他Web应用程序,他们只是把它们打包在PHP文件,只需运行通过的mysql_query或任何每个字符串这是他们需要做的。
$db = new PDO($dsn, $user, $password);
$sql = file_get_contents('file.sql');
$qr = $db->exec($sql);
亚历克使用一些功能来分析他们的文件。 他们是相当良好注释(什么异常!),这样你可以很容易地知道他们在做什么(我得到了这个解决方案http://www.frihost.com/forums/vt-8194.html )。 这里是我用了很多的解决办法的:
<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 < $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 < $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 < $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("/(?<!\\\\)(\\\\\\\\)*\\\\'/", $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 < $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("/(?<!\\\\)(\\\\\\\\)*\\\\'/", $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.
mysqli_connect($host,$user,$pass) or die('error connection');
mysqli_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');
}
?>
最简单的解决方法是使用了shell_exec()与SQL脚本输入运行MySQL客户端。 因为它有到餐桌这可能跑慢一点,但你可以在一两分钟,编写代码,然后回来到一些有用的东西的工作。 写一个PHP脚本运行任何SQL脚本可以带你去周。
支持SQL脚本比人们所描述这里,除非你确信你的脚本只包含的脚本功能的子集更加复杂。 以下是可能出现在一个普通的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脚本的一个子集,排除了一些角落情况下,如上述的那些,这是比较容易写一个PHP脚本读取文件并执行文件中的SQL语句。 但是,如果你想支持任何有效的SQL脚本,这要复杂得多。
另请参见我的答案,这些相关的问题:
mysqli
可以运行由一个分隔的多个查询;
你可以在整个文件中读取,并在使用一次运行它mysqli_multi_query()
但是,我会是第一个说这是不是最完美的解决方案。
在我的项目,我用下一个解决方案:
<?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;
在测试SQL文件(41MB)的内存使用高峰:3.25MB
因为我不能回答评论,谨防用以下解决方案:
$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测试)。
我的建议是看PHPMyBackup的源代码。 这是一个自动的SQL PHP装载机。 你会发现,只有请求mysql_query加载一个查询的时间,而像phpMyAdmin和PHPMyBackup项目已经完成了艰难的工作,为您解析SQL的正确方法。 请不要重新发明轮子即:P
的Plahcinski解决方案的一个更新的解决方案。 或者您可以使用的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 = '';
}
}
}
工程于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() > 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);
你确定每行它不是一个查询? 你的文本编辑器,可以包装线,但在现实中每个查询可能是在一行。
无论如何,欧莱的方法似乎是最好的。 如果你有理由在一次运行查询,你应该能够在一行的文件中的行读取,然后使用分号在每个查询结束划定。 你好得多关闭的线在一个文件中读取行不是试图分裂一个巨大的字符串,因为这将是更亲切到你的服务器的内存中。 例:
$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");
简单地说,我已经做到了这一点的方法是:
阅读文件(一个数据库转储如$ mysqldump db > db.sql
)
$sql = file_get_contents(db.sql);
使用的mysqli :: multi_query导入
if ($mysqli->multi_query($sql)) { $mysqli->close(); } else { throw new Exception ($mysqli->error); }
当心mysqli_query支持异步查询。 更这里: http://php.net/manual/en/mysqli.multi-query.php这里https://stackoverflow.com/a/6652908/2002493
除非你打算导入巨大的 .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()
除非这些文件是巨大的(比方说,在几个兆字节),没有理由线在-A-时间来执行它,或者尝试使用它拆分成多个查询(通过拆分;
,这是我对cam8001的解答发表了评论,将打破如果查询字符串中的分号)..
这最好的代码对于由PHP还原SQL可以使用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 = "";
}
}
}
最简单和最快的方式来加载和分析phpMyAdmin的转储或MySQL转储文件..
$ mysql -u username -p -h localhost dbname < dumpfile.sql
我在这里看到的解决方案中没有处理需要而服务器在那里我不能有机会获得LOAD DATA INFILE指望创建存储过程来改变分隔符。 我希望能找到有人已经解决了这个,而不必冲刷phpMyAdmin的代码来弄明白。 与其他人一样,我也曾经在寻找这样做,因为我写GPL代码自己的别人的GPL许可方式的过程。
一些PHP库可以解析由多个SQL语句的SQL文件,爆炸得当(不使用简单的“;”发生爆炸,自然),并执行它们。
例如,检查Phing的PDOSQLExecTask
只是重申了大家的问题:
PHP的的mysql_query,自动最终划定每个SQL命令,另外是关于它的说明书中这样做很模糊。 一切都超出了一个命令将产生一个错误。
在其他的mysql_query是罚款含SQL风格的注释字符串,\ n,\ r ..
的mysql_query的局限性显露本身在SQL分析器报告的问题直接下一个命令如要
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...
这里是一个快速的解决方案:(假设以及格式化SQL;
$sqlCmds = preg_split("/[\n|\t]*;[\n|\t]*[\n|\r]$/", $sqlDump);
许多主机不会让你通过PHP创建自己的数据库,但你似乎已经解决了。
一旦数据库被创建,你可以操纵和简单地填充它:
的mysql_connect( “本地主机”);
的mysql_query( “SOURCE file.sql”);
有的人(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 = "";
}
}
}
因为它更全面。 ;-)
这可能是有益的 - >
或多或少它的作用是先提供给函数的字符串(您file.sql的file_get_contents()函数值),并删除所有换行符。 然后,它由分割的数据“;” 字符。 接下来,它进入一个while循环,看着所创建的阵列的每一行。 如果行包含“`”字符,就会知道这是一个查询和execture的更改为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);
我注意到,PostgreSQL的PDO驱动程序不允许运行用分号分隔脚本。 为了使用PDO运行任何数据库的.sql文件,必须将拆分PHP代码自己的陈述。 这里,似乎工作得很好的解决方案:
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();
}
}
为什么不采取从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;
}
?>
我在那里没有mysql工具或phpMyAdmin的只是我的PHP应用程序连接到不同的主机上的MySQL服务器的环境中,但我需要运行通过的mysqldump或myadmin导出脚本。 为了解决这个问题,我创建了一个脚本multi_query
正如我所提到这里
它可以处理mysqldump的输出和phpMyAdmin的出口没有mysql命令行工具。 我也做了一些逻辑基于存储在DB像Rails的时间戳来处理多个迁移文件。 我知道这需要更多的错误处理,但目前做的工作对我来说。
检查出来: https://github.com/kepes/php-migration
这是纯PHP,不需要任何其他工具。 如果不处理用户输入与它只能由开发商或者你可以放心地使用它导出工具制作脚本。
这是从项目我工作。 基本上采取任何文本文件,并提取SQL语句而忽略了意见,并无偿换行。
<?php
/*
ingestSql(string) : string
Read the contents of a SQL batch file, stripping away comments and
joining statements that are broken over multiple lines with the goal
of producing lines of sql statements that can be successfully executed
by PDO exec() or execute() functions.
For example:
-- My SQL Batch
CREATE TABLE foo(
bar VARCHAR(80),
baz INT NOT NULL);
Becomes:
CREATE TABLE foo(bar VARCHAR(80), baz INT NOT NULL);
*/
function ingestSql($sqlFilePath=__DIR__ . "/create-db.sql") {
$sqlFile = file($sqlFilePath);
$ingestedSql = "";
$statement = "";
foreach($sqlFile as $line) {
// Ignore anything between a double-dash and the end of the line.
$commentStart = strpos($line, "--");
if ($commentStart !== false) {
$line = substr($line, 0, $commentStart);
}
// Only process non-blank lines.
if (strlen($line)) {
// Remove any leading and trailing whitespace and append what's
// left of the line to the current statement.
$line = trim($line);
$statement .= $line;
// A semi-colon ends the current statement. Otherwise what was a
// newline becomes a single space;
if (substr($statement, -1) == ";") {
$ingestedSql .= $statement;
$statement = "\n";
}
else {
$statement .= " ";
}
}
}
return $ingestedSql;
}
?>