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);
}
?>
Другие вопросы по тегам