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

65
задан Benjamin 11 July 2014 в 14:11
поделиться

9 ответов

Я получаю чувство, что все здесь, кто ответил на этот вопрос, не знают то, на что он похож, чтобы быть разработчиком веб-приложения, который позволяет людям устанавливать приложение на своих собственных серверах. Общий хостинг, особенно, не позволяет Вам использовать SQL как "запрос" ДАННЫХ ЗАГРУЗКИ, упомянутый ранее. Большинство общих хостов также не позволяет Вам использовать shell_exec.

Теперь, для ответа на OP лучший выбор состоит в том, чтобы просто пристроить файл PHP, который содержит запросы в переменной и может просто выполнить их. Если Вы полны решимости проанализировать .sql файлы, необходимо изучить phpMyAdmin и получить некоторое представление для того, чтобы вытащить данные из .sql файлов тот путь. Озирайтесь в других веб-приложениях, которые имеют установщики, и Вы будете видеть, что, вместо того, чтобы использовать .sql файлы для их запросов, они просто упаковывают их в файлах PHP и просто выполняют каждую строку через mysql_query или независимо от того, что случается так, что они должны сделать.

48
ответ дан Jeremy Privett 24 November 2019 в 15:09
поделиться

Почему бы не взять код от phpMyAdmin и использования это? Это - Открытый исходный код, в конце концов...

0
ответ дан Mez 8 October 2019 в 05:04
поделиться

Простое решение должно использовать shell_exec () для выполнения mysql клиента со сценарием SQL, как введено. Это могло бы работать немного медленнее, потому что это должно разветвиться, но можно записать код через несколько минут и затем возвратиться к работе над чем-то полезным. Запись Сценария PHP для выполнения любого сценария SQL могла взять Вас недели.

сценарии SQL Поддержки более сложны, чем, что люди описывают здесь, если Вы не уверены, что Ваш сценарий содержит только подмножество функциональности сценариев. Ниже некоторые примеры вещей, которые могут появиться в обычном сценарии SQL, которые делают его комплексом для кодирования сценария для интерпретации его линию за линией.

-- Comment lines cannot be prepared as statements
-- This is a MySQL client tool builtin command.  
-- It cannot be prepared or executed by server.
USE testdb;

-- This is a multi-line statement.
CREATE TABLE foo (
  string VARCHAR(100)
);

-- This statement is not supported as a prepared statement.
LOAD DATA INFILE 'datafile.txt' INTO TABLE foo;

-- This statement is not terminated with a semicolon.
DELIMITER //

-- This multi-line statement contains a semicolon 
-- but not as the statement terminator.
CREATE PROCEDURE simpleproc (OUT param1 INT)
BEGIN
  SELECT COUNT(*) INTO param1 FROM foo;
END
// 

, Если Вы только поддерживаете подмножество сценариев SQL, исключая некоторые угловые случаи, такие как те выше, относительно легко записать Сценарий PHP, который читает файл и выполняет SQL-операторы в файле. Но если Вы хотите поддерживать какой-либо действительный сценарий SQL, это намного более сложно.

<час>

См. также мои ответы на эти связанные вопросы:

27
ответ дан Community 24 November 2019 в 15:09
поделиться

mysqli может выполнить несколько запросов, разделенных ;

, Вы могли читать в целом файле и выполнить все это сразу использование mysqli_multi_query()

, Но, я буду первым, чтобы сказать, что это не самое изящное решение.

10
ответ дан phatduckk 24 November 2019 в 15:09
поделиться

Если Вы не планируете импортировать огромный .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()

, Если файлы не огромны (говорят, более чем несколько мегабайтов), нет никакой причины выполнить его line-at-a-time или попытаться разделить его на несколько запросов (путем разделения использования ;, который, поскольку я прокомментировал ответ cam8001, повредится, если запрос будет иметь точки с запятой в строках)..

2
ответ дан dbr 24 November 2019 в 15:09
поделиться

Вы уверены что не один запрос на строку? Ваш текстовый редактор может обертывать строки, но в действительности каждый запрос может быть на одной строке.

Во всяком случае, метод olle кажется лучшим. Если у Вас есть причины для выполнения запросов один во время, необходимо быть в состоянии читать в файле линию за линией, затем использовать точку с запятой в конце каждого запроса для разграничивания. Вы - очень более обеспеченное чтение в файле линию за линией, чем попытка разделить огромную строку, поскольку это будет намного более добро к памяти Вашего сервера. Пример:

$query  = '';
$handle = @fopen("/sqlfile.sql", "r");

if ($handle) {
    while (!feof($handle)) {
        $query.= fgets($handle, 4096);

        if (substr(rtrim($query), -1) === ';') {
            // ...run your query, then unset the string
            $query = '';
        }
    }

    fclose($handle);
}

, Очевидно, необходимо будет рассмотреть транзакции и остальных, если Вы выполните большой запросы в пакете, но это - вероятно, не грандиозное предприятие для сценария новой установки.

4
ответ дан cam8001 24 November 2019 в 15:09
поделиться
mysql_query("LOAD DATA LOCAL INFILE '/path/to/file' INTO TABLE mytable");
3
ответ дан rink.attendant.6 24 November 2019 в 15:09
поделиться

Мое предложение должно было бы посмотреть на исходный код PHPMyBackup. Это - автоматизированный загрузчик SQL PHP. Вы найдете, что mysql_query только загружает один запрос за один раз, и проекты как PHPMyAdmin и PHPMyBackup уже сделали тяжелую работу для Вас парсинга SQL корректный путь. Не перестраивайте то колесо: P

4
ответ дан SchizoDuckie 24 November 2019 в 15:09
поделиться

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

1
ответ дан 24 November 2019 в 15:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: