Запуск MySQL *.sql файлов в PHP
У меня есть два файла *.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
для команд и вместо <
используется --execute="SOURCE ..."
вместо <
.
Кроме того, у меня никогда не было хорошего объяснения разницы между shell_exec()
и exec()
.
Ответы
Ответ 1
Этот вопрос возникает время от времени. Там нет хорошего решения для запуска .sql script непосредственно из PHP. Существуют крайние случаи, когда утверждения, общие в .sql script, не могут быть выполнены в качестве операторов SQL. Например, инструмент mysql имеет встроенные команды, которые не распознаются сервером MySQL, например. CONNECT
, USE
и DELIMITER
.
Итак, я даю +1 для ответа @Ignacio Vazquez-Abrams . Вы должны запустить ваш .sql script в 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
не следует пробел.
Я также написал его с синтаксисом переменной интерполяции вместо так много конкатенации строк.
См. также мои ответы на следующие вопросы:
Ответ 2
$commands = file_get_contents($location);
$this->_connection->multi_query($commands);
Ответ 3
Вот что я использую:
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 a startsWith function
function startsWith($haystack, $needle){
$length = strlen($needle);
return (substr($haystack, 0, $length) === $needle);
}
Ответ 4
Для этого вам нужно создать полный парсер SQL. Я рекомендую вам использовать инструмент командной строки mysql
для этого, вызывая его извне из PHP.
Ответ 5
Мне никогда не приходилось его использовать, но класс mysqli имеет метод multi_query:
http://php.net/manual/en/mysqli.multi-query.php
Ответ 6
Я знаю, что я очень опаздываю на вечеринку, но PHP Mini Admin уже несколько раз был спасателем. Это в основном "облегченный" PHPMyAdmin, который содержится в одном файле, поэтому нет необходимости в сложных установках, просто загружайте его и входите в систему. Simples!
Ответ 7
Не забывайте о phpMyAdmin. Довольно прочный интерфейс для взаимодействия с MySQL.
Я не знаю, решает ли ваша проблема вашу проблему, так как я не знаю, можете ли вы взаимодействовать с ней непосредственно из кода, но просто захотеть выбросить ее там.
Ответ 8
Я создал миграцию script с multi_query
. Он может обрабатывать вывод mysqldump и экспорт phpmyadmin без инструмента командной строки mysql. Я также сделал несколько логических операций для обработки нескольких файлов миграции на основе временной метки, хранящейся в БД, например Rails. Я знаю, что для этого требуется больше обработки ошибок, но в настоящее время работает для меня.
Проверьте это: https://github.com/kepes/php-migration
Я думаю, что если вы не будете обрабатывать ввод пользователя с помощью только скриптов, созданных разработчиками или инструментами экспорта, вы можете безопасно использовать его.
Ответ 9
Вы можете использовать этот script для запуска файлов MySQL script. Вам, конечно, нужно будет задавать $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');
}
Ответ 10
Одно предложение:
// connect to db.
if (mysql_query("SOURCE myfile.sql")) {
echo "Hello Sonny";
}
Ответ 11
Чтобы выполнить создание таблицы из приложения, вы можете захотеть создать файл 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 );