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






У вас больше проблемных случаев, чем просто точки с запятой внутри строк.
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);
}
Также спасибо за вашу помощь, Билл.
Здесь есть более серьезная проблема. У вас могут быть утверждения, основанные на других утверждениях. Вы не можете просто выполнить их линейно, вслепую.
Всегда может указать mysql игнорировать уникальные проверки и проверки внешнего ключа перед запуском вашего списка запросов, что решит многие проблемы с порядком запросов.
Хорошо, скажите базе данных игнорировать проверки работоспособности, реализованные для сохранения целостности данных. Это верный путь к успеху.
@enobrev: А что будет, если потом снова включить проверку работоспособности? точно; больше проблем.
в зависимости от того, что вы импортируете, отключение проверок работоспособности не так страшно. Конечно, если мы говорим о вставках, это проблема, но если все, что вы делаете, это изменяете структуру, то все эти проверки работоспособности сойдут с ума каждый раз, когда вы пытаетесь удалить таблицу, имеющую входящие ссылки.
<?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);
}
?>
У вас есть точки с запятой в конце строки, но это не конец оператора, например внутри тела определения процедуры или триггера. И такие операторы, как DELIMITER, не заканчивающиеся точкой с запятой.