Многострочный запрос в MySql из PHP
Имеется фаил - дамп базы. Его надо немножко подкоректировать (заменить названия таблиц) и выполнить на мускуле.
Я делаю так открываю этот фаил, меняю что мне нужно и .... дальше не знаю как мне его выполнить ... как переменную в mysql_query(), он не пойдет ... ясен пень там мног запросов .... разбивать его на отдельные запросы по ";" гиблое дело, в содержании ячеек много ";".
Вобщем незнаю че делать .... уже поздно голова не соображает ничего.
Спасибо заранее.
__________________
потому что mysql_query по доке можно выполнить только один запрос, и он не должен заканчиваться ";", и пробовал не получилорсь, ругается что ";" на конце
объем дампа 25 кб .... через PHPMyAdmin все выполняется на ура ....
разбейте по ; и выполните по отдельности
ну емае ... ну писал же ведь .... в содержимом яцеек много этих самых ";", а сделать так чтоб скрипт различал (";") от просто ";", я не могу .... не умею.....
эт канешна здорово, но кто мне шелл даст на мускул? ... мне надо средствами ПХП .... а там кроме злосчасного однозапросового mysql_query .... пока ничего не нашел ....
интересно кк тотже PHPMyAdmin работает?
а то что на большинстве хостингов такое отключенно по понятным соображениям?
Вобщем есть 3 направления поиска ... разбить на отдельные запросы ... в принципе можно по коментам которые ПХПмайадмин оствляет при дампе .... но это не красиво
заморочиться на регулярные выражения ... тут вообще кошмар ....и научть скрипт реагировать на правильные кавычки ... это еще тот гемор ...
ну и посмотреть как это делает сам пхпмайадмин .... и скопировать ....
в любом случае все это требует времени и усилий неоправданных ...
Представим, что вся эта пачка запросов выглядит так, как экспортирует их phpMyAdmin. Тогда вот эти несколько строчек дают желаемый результат:
// Убираем комментарии
$sql = preg_replace("/^-.*$/m", "", $sql);
// Видим, что комментариев больше нет.
echo $sql;
// Для красоты тримим, по ходу шинкуя запросы в массив
foreach($result = explode(";\n", $sql) as $key=>$qq){
$result[$key] = trim($result[$key]);
// Тут же можно сразу делать mysql_query
}
print_r($result);
Представим, что вся эта пачка запросов выглядит так, как экспортирует их phpMyAdmin. Тогда вот эти несколько строчек дают желаемый результат:
// Убираем комментарии
$sql = preg_replace("/^-.*$/m", "", $sql);
// Видим, что комментариев больше нет.
echo $sql;
// Для красоты тримим, по ходу шинкуя запросы в массив
foreach($result = explode(";\n", $sql) as $key=>$qq){
$result[$key] = trim($result[$key]);
// Тут же можно сразу делать mysql_query
}
print_r($result);
спасибо, все работает .... одкако маленькая поправка .... после explode последний элемент остается пустым, так как при дампе туда запихивается еще одна пустая строка.
В принциме его можно сразу выкинуть, а можно сделать проверку на "не пустую строку"...
$sql=trim($sql);
:)
так ничего и не придумал.
ну можно заюзать preg_split() как вариант, но шаблон я воздержусь для него составлять ..... нервы дороже .... :)
$sql = preg_replace("/^-.*$/m", "", $sql);
$sql = preg_replace("/;\s*(create|insert|select|replace|delete)/mi", DELIMITER."$1", $sql);
$result = explode(DELIMITER, $sql);
Дамп может быть в разных видах. От бинарного файла, до xml (последнее - очень хорошо). Просто в данном случае обсуждается текстовый SQL.
мда .... пролистал доку по пхп, полазил в нете.... действительно других средств работы с мускулом, кроме того что уже прозвучало ненашел ..
все остальное - это консоль, а значит не доступно простым смертным. Всякие там обратные кавычки и прочии средства связанные с выполнением системных команд .... имхо не подхотят.
$sql = preg_replace("/^-.*$/m", "", $sql);
$sql = preg_replace("/;\s*(create|insert|select|replace|delete)/mi", DELIMITER."$1", $sql);
$result = explode(DELIMITER, $sql);
имхо мне кажется не стоит того ... я смотрю на решение подобных проблем так ...
1 - мы находим решение данного конкрентного вопроса .... быстро и просто .... но решение работает только на нашем примере.
2 - мы находим решение ДЛЯ всей области проблеммы ... ваш вариант здесь тоже может не подойти.
например а какже DROP ? :) или еще какой опереатор .... да мало ли, мож в мускул че новое добавят.
здесь можно пойти таким путем .... он описан, выше ссылка есть....
разбивать по ";" не заключенные в кавычки, причем игнорировать экранированные кавычки ... как это установить .... например четность нечетность не экранированных кавычек выше .....
ЗЫ Устал я говорить в пустоту. Успехов в извращениях.
ЗЫ Устал я говорить в пустоту. Успехов в извращениях.
ну предложите хоть один работающий вариант, ну или хотябы более мение четкую концепцию решеня проблемы....
общее решение.
$result = preg_split('/\x3B(\n|\r|\r\n|\n\r)/i', $sql);
foreach($result as $key=>$qq){
$qq = trim($qq);
mysql_query($qq) or die (mysql_error());
}
эт канешна здорово, но кто мне шелл даст на мускул? ... мне надо средствами ПХП .... а там кроме злосчасного однозапросового mysql_query .... пока ничего не нашел ....
интересно кк тотже PHPMyAdmin работает?
если ты хочешь сделать подобное, то посмотри как всё-таки работает PhpMyAdmin. или может просто хочется перепридумать? :)
мне так кажется что то он также таботает с разбивкой команд .... ибо ниче другова на ум не приходит.
ну проблема в том, что задачей является не заливк в базу дампа, а создание скрипта укоторый это делает. Установка движка для сайта.
причем тут поставь phpmyadmin?, разумеется он там есть.
mfender, так что ваша идея лучшая ... простая и эффективная, не надо заморачиваться с подсчетом кавычек (как в соседней теме) и составлять бесконечные регэкспы, которые могут не подойти под какойнить случай.
Вобщем спасибо.
а использование регэкспов упростит понимание скриптом различных дампов.
Нампример как в моем примере, работает и у меня на Денвере, и на 1gb.ru.
http://ru2.php.net/manual/ru/function.mysqli-multi-query.php
А знаешь, что бывает за разглашение тайн??? :D
да, чето такое в доке по ПХП видел .... но вниманя не предал особо ... так как не везде сработает ИМХО.
mysqli_multi_query
(PHP 5)
mysqli_multi_query
(no version information, might be only in CVS)
mysqli->multi_query -- Performs a query on the database
Это говорит о том, скорее всего, что версии расширений не однояйцевые. И эта беда будет ещё долго преследовать всех. Поэтому на mysqli вообще не стоит полагаться ещё лет три. Поэтому никто его всерьёз не рассматривает. Вот когда до хостёров дойдёт, что это такое и зачем оно нужно, тогда можно использовать.
был такой порыв, потом когда все и так заработало, пропал :)
В задаче было сказао, что нужно занести в БД, а не сделать скрипт, который это бы делал.