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 без изменения файла дампа?
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);
}
Также спасибо за помощь, Билл.
Здесь есть большая проблема. У вас могут быть утверждения, основанные на других утверждениях. Вы не можете просто выполнить их линейно вслепую.
<?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);
}
?>