PHP: несколько SQL-запросов в одном операторе mysql_query - PullRequest
9 голосов
/ 06 декабря 2008

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

12 голосов
/ 06 декабря 2008

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

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

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

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


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

5 голосов
/ 06 декабря 2008

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

Вышеупомянутая функция explode () не сработала, потому что в значениях есть точки с запятой. Однако я не смог понять (и упомянуть), что точки с запятой всегда начинаются с новой строки в файле дампа SQL. Увы,

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

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

3 голосов
/ 06 декабря 2008

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

0 голосов
/ 22 февраля 2013
<?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);
}
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...