Запуск 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.

Ответ 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 );