У меня есть два файла *.sql
которые я использую при создании новой базы данных веб-сайта. Первый файл создает все таблицы. Второй файл заполняет некоторые записи по умолчанию. Я хотел бы выполнить эти файлы с 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"');
… Я никогда не получал полезного вывода, но следил за некоторыми предложениями в другом потоке и, наконец, все это работало. Я --option=value
к --option=value
для команд и использую --execute="SOURCE ..."
вместо <
для выполнения файла.
Кроме того, у меня никогда не было хорошего объяснения разницы между shell_exec()
и exec()
.
Этот вопрос возникает время от времени. Не существует хорошего решения для запуска скрипта .sql непосредственно из PHP. Существуют крайние случаи, когда утверждения, обычные в сценарии .sql, не могут быть выполнены как SQL-выражения. Например, средство mysql имеет встроенные команды , которые не распознаются сервером MySQL, например CONNECT
, USE
и DELIMITER
.
Поэтому я даю +1 ответ @Ignacio Vazquez-Abrams. Вы должны запустить скрипт .sql в PHP, вызвав инструмент mysql
, например, с помощью shell_exec()
.
Я получил этот тест:
$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
не должно быть пробела.
Я также написал его с переменным синтаксисом интерполяции, а не столько конкатенацией строк.
См. Также мои ответы на следующие вопросы:
$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); }
Для этого вам нужно создать полный парсер SQL. Я рекомендую вам вместо этого использовать инструмент командной строки mysql
для этого, вызывая его извне из PHP.
Мне никогда не приходилось использовать его, но класс mysqli имеет метод multi_query:
Я знаю, что я очень опаздываю на вечеринку, но PHP Mini Admin несколько раз был спасателем. Это в основном «облегченный» PHPMyAdmin, который содержится в одном файле, поэтому нет необходимости в сложных установках, просто загружайте его и входите в систему.
Не забывайте о phpMyAdmin . Довольно прочный интерфейс для взаимодействия с MySQL.
Я не знаю, решает ли это вашу проблему, так как я не знаю, можете ли вы взаимодействовать с ней непосредственно из кода, но просто хотел ее выбросить.
Я создал сценарий миграции с multi_query
. Он может обрабатывать вывод mysqldump и экспорт phpmyadmin без инструмента командной строки mysql. Я также сделал несколько логических операций для обработки нескольких файлов миграции на основе временной метки, хранящейся в БД, например Rails. Я знаю, что для этого требуется больше обработки ошибок, но в настоящее время работает для меня.
Проверьте это: https://github.com/kepes/php-migration
Я думаю, что если вы не будете обрабатывать вход пользователя с помощью только скриптов, созданных разработчиками или инструментами экспорта, вы можете безопасно использовать их.
Вы можете использовать этот скрипт для запуска файлов сценариев MySQL. Вам, конечно, нужно будет задавать $ hostName, $ userName, $ password, $ dataBaseName, $ port и $ fileName.
<?php function parseScript($script) { $result = array(); $delimiter = ';'; while(strlen($script) && preg_match('/((DELIMITER)[ ]+([^\n\r])|[' . $delimiter . ']|$)/is', $script, $matches, PREG_OFFSET_CAPTURE)) { if (count($matches) > 2) { $delimiter = $matches[3][0]; $script = substr($script, $matches[3][1] + 1); } else { if (strlen($statement = trim(substr($script, 0, $matches[0][1])))) { $result[] = $statement; } $script = substr($script, $matches[0][1] + 1); } } return $result; } function executeScriptFile($fileName, $dbConnection) { $script = file_get_contents($scriptFleName); $statements = parseScript($script); foreach($statements as $statement) { mysqli_query($dbConnection, $statement); } } $hostName = ''; $userName = ''; $password = ''; $dataBaseName = ''; $port = ''; $fileName = ''; if ($connection = @mysqli_connect($hostName, $userName, $password, $dataBaseName, $port)) { executeScriptFile($fileName, $connection); } else { die('Can not connect to MySQL'); }
Одно из предложений:
// connect to db. if (mysql_query("SOURCE myfile.sql")) { echo "Hello Sonny"; }
Для выполнения генерации таблиц из приложения вам может понадобиться создать файл 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 );