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);
}
?>