在PHP中运行MySQL * .sql文件
我有两个*.sql
文件,我创build一个新的网站数据库时使用。 第一个文件创build所有表。 第二个文件填充一些默认logging。 我想从PHP执行这些文件。 我也使用Zend_Framework,如果这将有助于实现这一点。
附加信息
- 我没有控制台访问权限
- 我试图在我们的应用程序内自动生成网站。
解
使用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服务器无法识别的命令 ,例如CONNECT
, USE
和DELIMITER
。
所以我给@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方法:
我知道我很晚参加派对,但是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 );