Загрузка файлов .sql из PHP - PullRequest
       148

Загрузка файлов .sql из PHP

62 голосов
/ 29 сентября 2008

Я создаю сценарий установки для приложения, которое я разрабатываю и должен динамически создавать базы данных из PHP. У меня есть это для создания базы данных, но теперь мне нужно загрузить в несколько файлов .sql. Я планировал открыть файл и mysql_query его по строке за раз - пока я не посмотрел на файлы схемы и не понял, что это не один запрос на строку.

Итак, как мне загрузить файл sql из PHP (как phpMyAdmin с его командой import)?

Ответы [ 30 ]

3 голосов
/ 02 ноября 2011

Попробуйте:

// SQL File
$SQLFile = 'YourSQLFile.sql';

// Server Name
$hostname = 'localhost';

// User Name
$db_user = 'root';

// User Password
$db_password = '';

// DBName
$database_name = 'YourDBName';

// Connect MySQL
$link = mysql_connect($hostname, $db_user, $db_password);

if (!$link) {
die("MySQL Connection error");
}

// Select MySQL DB
mysql_select_db($database_name, $link) or die("Wrong MySQL Database");

// Function For Run Multiple Query From .SQL File
function MultiQuery($sqlfile, $sqldelimiter = ';') {
set_time_limit(0);

if (is_file($sqlfile) === true) {
$sqlfile = fopen($sqlfile, 'r');

if (is_resource($sqlfile) === true) {
$query = array();
echo "<table cellspacing='3' cellpadding='3' border='0'>";

while (feof($sqlfile) === false) {
$query[] = fgets($sqlfile);

if (preg_match('~' . preg_quote($sqldelimiter, '~') . '\s*$~iS', end($query)) === 1) {
$query = trim(implode('', $query));

if (mysql_query($query) === false) {
echo '<tr><td>ERROR:</td><td> ' . $query . '</td></tr>';
} else {
echo '<tr><td>SUCCESS:</td><td>' . $query . '</td></tr>';
}

while (ob_get_level() &gt; 0) {
ob_end_flush();
}

flush();
}

if (is_string($query) === true) {
$query = array();
}
}
echo "</table>";

return fclose($sqlfile);
}
}

return false;
}

/* * * Use Function Like This: ** */

MultiQuery($SQLFile);
3 голосов
/ 29 апреля 2011

Работает на свалках Navicat. Может потребоваться сбросить первый / * * / комментарий, который вводит navicat.

$file_content = file('myfile.sql');
$query = "";
foreach($file_content as $sql_line){
  if(trim($sql_line) != "" && strpos($sql_line, "--") === false){
    $query .= $sql_line;
    if (substr(rtrim($query), -1) == ';'){
      echo $query;
      $result = mysql_query($query)or die(mysql_error());
      $query = "";
    }
  }
 }
3 голосов
/ 29 сентября 2008
mysql_query("LOAD DATA LOCAL INFILE '/path/to/file' INTO TABLE mytable");
3 голосов
/ 21 мая 2015

Вкратце, я сделал так:

  1. Считать файл (дБ, например, $ mysqldump db > db.sql)

    $sql = file_get_contents(db.sql);
    
  2. Импортируйте его, используя mysqli :: multi_query

    if ($mysqli->multi_query($sql)) {
        $mysqli->close();
    } else {
        throw new Exception ($mysqli->error);
    }
    

Остерегайтесь mysqli_query поддерживает асинхронные запросы. Больше здесь: http://php.net/manual/en/mysqli.multi-query.php и здесь https://stackoverflow.com/a/6652908/2002493

2 голосов
/ 29 сентября 2008

Если вы не планируете импортировать огромные .sql файлы, просто прочитайте весь файл в память и запустите его как запрос.

Прошло много времени с тех пор, как я использовал PHP, поэтому псевдокод:

all_query = read_file("/my/file.sql")
con = mysql_connect("localhost")
con.mysql_select_db("mydb")
con.mysql_query(all_query)
con.close()

Если файлы не имеют большого размера (скажем, более нескольких мегабайт), нет причин выполнять их по очереди или пытаться разбить их на несколько запросов (путем разделения с помощью ;, который, как я прокомментировал, в ответе cam8001 прервется, если в строке запроса есть точки с запятой) ..

2 голосов
/ 24 октября 2011

Это лучший код для восстановления SQL по PHP может использовать 100% Goooood! Большое спасибо

$file_content = file('myfile.sql');
$query = "";
foreach($file_content as $sql_line){
if(trim($sql_line) != "" && strpos($sql_line, "--") === false){
 $query .= $sql_line;
 if (substr(rtrim($query), -1) == ';'){
   echo $query;
   $result = mysql_query($query)or die(mysql_error());
   $query = "";
  }
 }
}
2 голосов
/ 23 мая 2012

Самый простой и быстрый способ загрузить и проанализировать дамп phpmyadmin или файл дампа mysql ..

$ mysql -u username -p -h localhost dbname < dumpfile.sql 
1 голос
/ 11 сентября 2011

Просто чтобы сформулировать задачу для всех:

PHP mysql_query, автоматически разграничивает конец каждой команды SQL и, кроме того, очень смутно описывает это в своем руководстве. Все, кроме одной команды, приведет к ошибке.

С другой стороны, mysql_query подходит для строки, содержащей комментарии в стиле SQL, \ n, \ r ..

Ограничение mysql_query проявляется в том, что анализатор SQL сообщает о проблеме непосредственно при следующей команде, например

 You have an error in your SQL syntax; check the manual that corresponds to your
 MySQL server version for the right syntax to use near 'INSERT INTO `outputdb:`
 (`intid`, `entry_id`, `definition`) VALUES...

Вот быстрое решение: (при условии хорошо отформатированного SQL;

$sqlCmds = preg_split("/[\n|\t]*;[\n|\t]*[\n|\r]$/", $sqlDump);
1 голос
/ 01 июня 2010

Ни одно из решений, которые я видел здесь, не касается необходимости изменения разделителя при создании хранимой процедуры на сервере, где я не могу рассчитывать на доступ к LOAD DATA INFILE. Я надеялся обнаружить, что кто-то уже решил это, не прибегая к помощи кода phpMyAdmin, чтобы понять это. Как и другие, я тоже находился в процессе поиска чужого GPL-способа сделать это, так как сам пишу GPL-код.

1 голос
/ 23 октября 2013

Это может быть полезно ->

Более или менее то, что он делает, это сначала берет строку, переданную функции (значение file_get_contents () вашего file.sql) и удаляет все разрывы строк. Затем он разбивает данные на ";" персонаж. Затем он входит в цикл while, просматривая каждую строку созданного массива. Если строка содержит символ «` », она узнает, что это запрос, и предложит функцию myquery () для данных данной строки.

Код:

function myquery($query) {

mysql_connect(dbhost, dbuser, dbpass);

mysql_select_db(dbname);

$result = mysql_query($query);

if (!mysql_errno() && @mysql_num_rows($result) > 0) {
}

else {

$result="not";
}
mysql_close();

return $result;

}



function mybatchquery ($str) {

$sql = str_replace("\n","",$str)

$sql = explode(";",$str);

$x=0;

while (isset($str[$x])) {

if (preg_match("/(\w|\W)+`(\w|\W)+) {

myquery($str[$x]);

}

$x++

}

return TRUE;

}




function myrows($result) {

$rows = @mysql_num_rows($result);

return $rows;
}




function myarray($result) {

$array = mysql_fetch_array($result);

return $array;
}




function myescape($query) {

$escape = mysql_escape_string($query);

return $escape;
}



$str = file_get_contents("foo.sql");
mybatchquery($str);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...