Поэтому у меня есть файл дампа SQL, который необходимо загрузить с помощью mysql_query (). К сожалению, с ним невозможно выполнить несколько запросов.
-> Нельзя предположить, что клиент командной строки mysql (mysql –help) установлен – для загрузки файла SQL напрямую
-> Нельзя предположить, что расширение mysqli установлено
/* contents of dump.sql, including comments */ DELETE FROM t3 WHERE body = 'some text; with semicolons; scattered; throughout'; DELETE FROM t2 WHERE name = 'hello'; DELETE FROM t1 WHERE id = 1;
Взрыв () ниже не будет работать, потому что некоторые значения содержимого дампа содержат точки с запятой.
$sql = explode(';', file_get_contents('dump.sql')); foreach ($sql as $key => $val) { mysql_query($val); }
Каков наилучший способ загрузить SQL без изменения файла дампа?
У вас больше проблем, чем просто точки с запятой в строках.
mysql_query()
, например USE
. DELIMITER
. CREATE PROCEDURE
. Я не знаю, как легко справиться с этой задачей, не отрываясь от клиента командной строки mysql. Я понимаю, вы сказали, что не можете полагаться на присутствие этого клиента, но без этого клиента вам нужно большое количество PHP-кода для синтаксического анализа скрипта и выполнения операторов соответствующим образом.
Вы можете найти такой код внутри продукта phpMyAdmin . Однако этот продукт лицензируется под лицензией GPL, поэтому, если вы используете какой-либо код, вы также должны лицензировать свой собственный проект под GPL.
См. Также мои ответы на следующие вопросы:
Бритва Оккама снова ударяет.
Вышеуказанная функция explode () не будет работать, потому что в значениях есть точки с запятой. Однако то, что я не понял (и упоминал), состоит в том, что точки с запятой всегда претерпевают новые строки в файле дампа SQL. Увы,
$sql = explode(";\n", file_get_contents('dump.sql')); foreach ($sql as $key => $val) { mysql_query($val); }
Кроме того, спасибо за вашу помощь, Билл.
Здесь есть большая проблема. У вас могут быть утверждения, которые зависят от других операторов. Вы не можете просто выполнять их линейно слепо.
<?php //STATIC QUERY $sql1 = " CREATE TABLE tblTable ( strOne VARCHAR(50) NOT NULL, strTwo VARCHAR(50) NOT NULL, strThree VARCHAR(50) NOT NULL ); INSERT INTO tblTable (strOne, strTwo, strThree) VALUES ('String 1', 'String 2', 'String 3'); UPDATE tblTable SET strOne = 'String One', strTwo = 'String Two' WHERE strThree = 'String 3'; "; //GET FROM FILE $sql2 = file_get_contents('dump.sql'); $queries = preg_split("/;+(?=([^'|^\\\']*['|\\\'][^'|^\\\']*['|\\\'])*[^'|^\\\']*[^'|^\\\']$)/", $sql); foreach ($queries as $query){ if (strlen(trim($query)) > 0) mysql_query($query); } ?>