PHP: несколько SQL-запросов в одной инструкции mysql query
поэтому у меня есть файл дампа SQL, который должен быть загружен с помощью mysql_query(). К сожалению, с ним невозможно выполнить несколько запросов.
-> нельзя предположить, что mysql клиент командной строки (mysql --help) установлен -- для загрузки файла SQL напрямую
-> нельзя предположить, что mysqli
4 ответов
у вас больше проблемных случаев, чем просто точки с запятой в строках.
- скрипт builtin команды, которые не могут быть выполнены
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);
}
?>