Intereting Posts
Почему эта таблица нескольких строк отправляется по строке? Это верно? PDO :: PARAM_INT важна в bindParam? API PHP для Google Analytics PHP. Является ли uniqid («») хорошим практическим решением для создания уникальной и последовательной стороны сервера? Концептуальная проблема Symfony2: общие пакеты по сравнению с конкретными Какие заголовки я хочу отправить вместе с ответом 304? Использование пространств имен с классами, созданными из переменной Зарегистрировать IP-адрес пользователя, дату и время PHPExcel toArray пропускает первую строку заголовка Массив запросов Msqli Маршрутизация в CakePHP для тщеславия Как использовать деревья выражений в PHP? Почему, если условие не работает? $ _SERVER . $ _SERVER Возможно ли запустить XMPP на основе PHP и Javascript многопользовательской сетевой игры в FaceBook? Является ли использование PHP для сопоставления нескольких файлов JavaScript, которые будут быстрее, чем включение их отдельно?

Запуск MySQL * .sql файлов в PHP

У меня есть два файла *.sql которые я использую при создании новой базы данных веб-сайта. Первый файл создает все таблицы. Второй файл заполняет некоторые записи по умолчанию. Я хотел бы выполнить эти файлы с 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"'); 

… Я никогда не получал полезного вывода, но следил за некоторыми предложениями в другом потоке и, наконец, все это работало. Я --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 не должно быть пробела.

Я также написал его с переменным синтаксисом интерполяции, а не столько конкатенацией строк.


См. Также мои ответы на следующие вопросы:

  • Загрузка файлов .sql из PHP
  • можно ли вызвать sql-скрипт из хранимой процедуры в другом sql-скрипте?
  • PHP: несколько SQL-запросов в одном операторе mysql_query
 $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:

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

Я знаю, что я очень опаздываю на вечеринку, но 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 );