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;

Приведенный ниже метод explode () не будет работать, потому что некоторые значения содержимого дампа содержат точки с запятой.

$sql = explode(';', file_get_contents('dump.sql'));
foreach ($sql as $key => $val) {
    mysql_query($val);
}

Как лучше всего загрузить SQL без изменения файла дампа?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
9
0
38 973
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

  • Скрипт команд встроенный, которые не могут быть выполнены 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);
}

Также спасибо за вашу помощь, Билл.

У вас есть точки с запятой в конце строки, но это не конец оператора, например внутри тела определения процедуры или триггера. И такие операторы, как DELIMITER, не заканчивающиеся точкой с запятой.

Bill Karwin 06.12.2008 05:27

Здесь есть более серьезная проблема. У вас могут быть утверждения, основанные на других утверждениях. Вы не можете просто выполнить их линейно, вслепую.

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

enobrev 08.12.2008 10:37

Хорошо, скажите базе данных игнорировать проверки работоспособности, реализованные для сохранения целостности данных. Это верный путь к успеху.

FlySwat 08.12.2008 20:47

@enobrev: А что будет, если потом снова включить проверку работоспособности? точно; больше проблем.

Kris 09.12.2008 17:04

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

enobrev 13.12.2008 08:59
<?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);
}
?>

Другие вопросы по теме