在PHP中运行MySQL * .sql文件

我有两个*.sql文件,我创build一个新的网站数据库时使用。 第一个文件创build所有表。 第二个文件填充一些默认logging。 我想从PHP执行这些文件。 我也使用Zend_Framework,如果这将有助于实现这一点。

附加信息

  1. 我没有控制台访问权限
  2. 我试图在我们的应用程序内自动生成网站。

使用shell_exec()

 $command = 'mysql' . ' --host=' . $vals['db_host'] . ' --user=' . $vals['db_user'] . ' --password=' . $vals['db_pass'] . ' --database=' . $vals['db_name'] . ' --execute="SOURCE ' . $script_path ; $output1 = shell_exec($command . '/site_db.sql"'); $output2 = shell_exec($command . '/site_structure.sql"'); 

…我从来没有得到有用的输出,但在另一个线程上遵循一些build议 ,并最终得到了一切工作。 我切换到--option=value格式的命令和使用--execute="SOURCE ..."而不是<执行该文件。

另外,我从来没有得到shell_exec()exec()之间区别的很好的解释。

这个问题不时出现。 直接从PHP运行.sql脚本没有好的解决scheme。 有些情况下,.sql脚本中常见的语句不能作为SQL语句执行。 例如,mysql工具具有内置的MySQL服务器无法识别的命令 ,例如CONNECTUSEDELIMITER

所以我给@Ignacio Vazquez-Abrams的答案 +1。 你应该通过调用mysql工具,例如shell_exec() ,在PHP中运行你的.sql脚本。


我有这个testing工作:

 $command = "mysql -u{$vals['db_user']} -p{$vals['db_pass']} " . "-h {$vals['db_host']} -D {$vals['db_name']} < {$script_path}"; $output = shell_exec($command . '/shellexec.sql'); 

关键的部分是MySQL的-p选项不能跟一个空格。

我也用变化的插值语法来写它,而不是那么多的string连接。


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

  • 从PHP中加载.sql文件
  • 是否有可能从另一个SQL脚本中的存储过程调用SQL脚本?
  • PHP:一个mysql_query语句中的多个SQL查询
 $commands = file_get_contents($location); $this->_connection->multi_query($commands); 

这是我使用的:


 function run_sql_file($location){ //load file $commands = file_get_contents($location); //delete comments $lines = explode("\n",$commands); $commands = ''; foreach($lines as $line){ $line = trim($line); if( $line && !startsWith($line,'--') ){ $commands .= $line . "\n"; } } //convert to array $commands = explode(";", $commands); //run commands $total = $success = 0; foreach($commands as $command){ if(trim($command)){ $success += (@mysql_query($command)==false ? 0 : 1); $total += 1; } } //return number of successful queries and total number of queries found return array( "success" => $success, "total" => $total ); } // Here's a startsWith function function startsWith($haystack, $needle){ $length = strlen($needle); return (substr($haystack, 0, $length) === $needle); } 

你需要为此创build一个完整的SQLparsing器。 我build议你使用mysql命令行工具,而不是从PHP调用它。

我从来没有使用它,但mysqli类有一个multi_query方法:

http://php.net/manual/en/mysqli.multi-query.php

我知道我很晚参加派对,但是PHP迷你pipe理员已经有几次救命了。 它基本上是一个“精简版”PHPMyAdmin包含在一个文件,所以不需要复杂的安装,只需上传和login。简单!

不要忘了phpMyAdmin 。 非常稳固的接口与MySQL交互。

我不知道它是否解决了你的问题,因为我不知道你是否可以直接从代码进行交互,但只是想把它扔出去。

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

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

我想如果你不用用户input来处理用户input的脚本,只需要开发者或导出工具就可以安全地使用它。

一个build议:

 // connect to db. if (mysql_query("SOURCE myfile.sql")) { echo "Hello Sonny"; } 

要从应用程序中执行表生成,你可能想要创build一个php文件,当你运行它时就可以做到这一点。

 $hostname = "localhost"; $database = "databasename"; $username = "rootuser"; $UserPassword = "password"; $myconnection = mysql_pconnect($hostname, $username , $UserPassword) or trigger_error(mysql_error(),E_USER_ERROR); mysql_connect($hostname , $username , $UserPassword ) or die(mysql_error()); mysql_select_db($database) or die(mysql_error()); if ( !$myconnection ){ echo "Error connecting to database.\n";} $userstableDrop = " DROP TABLE IF EXISTS `users`"; $userstableCreate = " CREATE TABLE IF NOT EXISTS `users` ( `UserID` int(11) NOT NULL, `User_First_Name` varchar(50) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=15" ; $userstableInsert = "INSERT INTO `users` (`UserID`, `User_First_Name`) VALUES (1, 'Mathew'), (2, 'Joseph'), (3, 'James'), (4, 'Mary')"; $userstableAlter1 = "ALTER TABLE `users` ADD PRIMARY KEY (`UserID`)"; $userstableAlter2 = " ALTER TABLE `users` MODIFY `UserID` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=15"; $createDb_sql = $userstableDrop; $insertSite = mysql_query($createDb_sql); $createDb_sql = $userstableCreate; $insertSite = mysql_query($createDb_sql); $createDb_sql = $userstableInsert; $insertSite = mysql_query($createDb_sql); $createDb_sql = $userstableAlter1; $insertSite = mysql_query($createDb_sql); $createDb_sql = $userstableAlter2; $insertSite = mysql_query($createDb_sql); echo "Succesful!"; mysql_close($myconnection );