Intereting Posts
php копирование элементов массива по значению, а не по ссылке Возможно ли «избежать» имени метода в PHP, чтобы иметь имя метода, которое сталкивается с зарезервированным ключевым словом? facebook Uncaught OAuthException: токен активного доступа должен использоваться для запроса информации о текущем пользователе Правильное выполнение оболочки в PHP Content-Disposition с перенаправлением 302 Как установить путь PHP include через .htaccess? Как я могу общаться между PHP и Java-программой? PHP вытащить случайное изображение из папки Как сделать Gmail как индикатор выполнения загрузки Как увеличить максимальную переменную POST в PHP? Ошибка Firefox «элемент не найден» Передача SMS / текстовых сообщений через PHP PHP – Задержка при перенаправлении Как вычислить crc16 в php Как защищать паролем файлы (изображения, видео, zip) динамически от публики и разрешать доступ только к членам?

PHP: несколько SQL-запросов в одном операторе mysql_query

Поэтому у меня есть файл дампа 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 без изменения файла дампа?

Solutions Collecting From Web of "PHP: несколько SQL-запросов в одном операторе mysql_query"

У вас больше проблем, чем просто точки с запятой в строках.

  • Сценарии встроенных команд, которые не могут быть выполнены mysql_query() , например USE .
  • Заявления, которые не заканчиваются точкой с запятой, например DELIMITER .
  • Заявления, содержащие точки с запятой, но не внутренние кавычки, такие как CREATE PROCEDURE .

Я не знаю, как легко справиться с этой задачей, не отрываясь от клиента командной строки mysql. Я понимаю, вы сказали, что не можете полагаться на присутствие этого клиента, но без этого клиента вам нужно большое количество PHP-кода для синтаксического анализа скрипта и выполнения операторов соответствующим образом.

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


См. Также мои ответы на следующие вопросы:

  • Запуск MySQL * .sql файлов в PHP
  • Загрузка файлов .sql из PHP
  • можно ли вызвать sql-скрипт из хранимой процедуры в другом sql-скрипте?

Бритва Оккама снова ударяет.

Вышеуказанная функция 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); } ?>