Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Многострочный запрос в MySql из PHP

6.0K
20 июня 2007 года
merlex
78 / / 25.02.2006
Простите за может быть глупый вопрос .... не могу найти решенеие.

Имеется фаил - дамп базы. Его надо немножко подкоректировать (заменить названия таблиц) и выполнить на мускуле.

Я делаю так открываю этот фаил, меняю что мне нужно и .... дальше не знаю как мне его выполнить ... как переменную в mysql_query(), он не пойдет ... ясен пень там мног запросов .... разбивать его на отдельные запросы по ";" гиблое дело, в содержании ячеек много ";".

Вобщем незнаю че делать .... уже поздно голова не соображает ничего.

Спасибо заранее.
13
20 июня 2007 года
RussianSpy
3.0K / / 04.07.2006
Почему он не пойдет в mysql_query? Каков объем дампа?
6.0K
20 июня 2007 года
merlex
78 / / 25.02.2006
Почему он не пойдет в mysql_query ? Каков объем дампа?
__________________

потому что mysql_query по доке можно выполнить только один запрос, и он не должен заканчиваться ";", и пробовал не получилорсь, ругается что ";" на конце

объем дампа 25 кб .... через PHPMyAdmin все выполняется на ура ....
13
20 июня 2007 года
RussianSpy
3.0K / / 04.07.2006
25 кбайт это очень мало
разбейте по ; и выполните по отдельности
6.0K
20 июня 2007 года
merlex
78 / / 25.02.2006
> разбейте по ; и выполните по отдельности

ну емае ... ну писал же ведь .... в содержимом яцеек много этих самых ";", а сделать так чтоб скрипт различал (";") от просто ";", я не могу .... не умею.....
8
20 июня 2007 года
mfender
3.5K / / 15.06.2005
Ищи по последовательности "; <что-то между> INSERT" (или SELECT или что там ещё).
13
20 июня 2007 года
RussianSpy
3.0K / / 04.07.2006
В таком случае вперед к чтению мануалов по бэкапам
http://dev.mysql.com/doc/refman/5.0/en/disaster-prevention.html
6.0K
20 июня 2007 года
merlex
78 / / 25.02.2006
млин .... тогда уже проще самому ручками сделать разделитель в файле, и по нему разбивать :) .... но это не конструктивно .... в данном случае решение пройдет, а вдругом нет
6.0K
20 июня 2007 года
merlex
78 / / 25.02.2006
> В таком случае вперед к чтению мануалов по бэкапам

эт канешна здорово, но кто мне шелл даст на мускул? ... мне надо средствами ПХП .... а там кроме злосчасного однозапросового mysql_query .... пока ничего не нашел ....

интересно кк тотже PHPMyAdmin работает?
13
20 июня 2007 года
RussianSpy
3.0K / / 04.07.2006
есть функции system, exec и обратные кавычки ``
6.0K
20 июня 2007 года
merlex
78 / / 25.02.2006
Цитата: RussianSpy
есть функции system, exec и обратные кавычки ``



а то что на большинстве хостингов такое отключенно по понятным соображениям?

Вобщем есть 3 направления поиска ... разбить на отдельные запросы ... в принципе можно по коментам которые ПХПмайадмин оствляет при дампе .... но это не красиво

заморочиться на регулярные выражения ... тут вообще кошмар ....и научть скрипт реагировать на правильные кавычки ... это еще тот гемор ...

ну и посмотреть как это делает сам пхпмайадмин .... и скопировать ....

в любом случае все это требует времени и усилий неоправданных ...

8
20 июня 2007 года
mfender
3.5K / / 15.06.2005
неужто всё так сложно?

Представим, что вся эта пачка запросов выглядит так, как экспортирует их phpMyAdmin. Тогда вот эти несколько строчек дают желаемый результат:

Код:
// @var $sql = какой-то список sql-запросов
// Убираем комментарии
$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);
337
20 июня 2007 года
shine
719 / / 09.06.2006
Используй поиск по форуму перед созданием новых тем. http://forum.codenet.ru/showthread.php?t=33521
6.0K
20 июня 2007 года
merlex
78 / / 25.02.2006
Цитата: mfender
неужто всё так сложно?

Представим, что вся эта пачка запросов выглядит так, как экспортирует их phpMyAdmin. Тогда вот эти несколько строчек дают желаемый результат:

Код:
// @var $sql = какой-то список sql-запросов
// Убираем комментарии
$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 последний элемент остается пустым, так как при дампе туда запихивается еще одна пустая строка.

В принциме его можно сразу выкинуть, а можно сделать проверку на "не пустую строку"...

6.0K
20 июня 2007 года
merlex
78 / / 25.02.2006
а еще лучше заранее протримить

$sql=trim($sql);

:)
8
20 июня 2007 года
mfender
3.5K / / 15.06.2005
На самом деле, вариант с explode - не самый лучший. Постле ; в запросе может не оказаться переноса строки. Поэтому, лучше шинковать в массив их всё-таки регулярными выражениями. Я с позаранку об этом не подумал. А сейчас перечитал и дошло. Но это тоже просто...
6.0K
20 июня 2007 года
merlex
78 / / 25.02.2006
меня последнее время коробит от слова "регулярные выражения" ... я помню кучу времени убил на решение подобной задачи, надо было на учить скрипт вытаскивать из строки сочетание символов c дефисом впереди, НЕ заключенных в круглые скобки, причем с возможностью наличия заэкранированных круглых скобок ...
так ничего и не придумал.

ну можно заюзать preg_split() как вариант, но шаблон я воздержусь для него составлять ..... нервы дороже .... :)
13
20 июня 2007 года
RussianSpy
3.0K / / 04.07.2006
Но лучше все таки озаботиться изучением встроенных средств поднятия дампа.
8
20 июня 2007 года
mfender
3.5K / / 15.06.2005
Немного усовершенствовал:

 
Код:
define("DELIMITER", "@^qq&ъ");
$sql = preg_replace("/^-.*$/m", "", $sql);
$sql = preg_replace("/;\s*(create|insert|select|replace|delete)/mi", DELIMITER."$1", $sql);
$result = explode(DELIMITER, $sql);
8
20 июня 2007 года
mfender
3.5K / / 15.06.2005
Цитата: RussianSpy
Но лучше все таки озаботиться изучением встроенных средств поднятия дампа.


Дамп может быть в разных видах. От бинарного файла, до xml (последнее - очень хорошо). Просто в данном случае обсуждается текстовый SQL.

6.0K
20 июня 2007 года
merlex
78 / / 25.02.2006
Цитата: RussianSpy
Но лучше все таки озаботиться изучением встроенных средств поднятия дампа.



мда .... пролистал доку по пхп, полазил в нете.... действительно других средств работы с мускулом, кроме того что уже прозвучало ненашел ..

все остальное - это консоль, а значит не доступно простым смертным. Всякие там обратные кавычки и прочии средства связанные с выполнением системных команд .... имхо не подхотят.

6.0K
20 июня 2007 года
merlex
78 / / 25.02.2006
Цитата: mfender
Немного усовершенствовал:

 
Код:
define("DELIMITER", "@^qq&ъ");
$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 ? :) или еще какой опереатор .... да мало ли, мож в мускул че новое добавят.

здесь можно пойти таким путем .... он описан, выше ссылка есть....

разбивать по ";" не заключенные в кавычки, причем игнорировать экранированные кавычки ... как это установить .... например четность нечетность не экранированных кавычек выше .....

13
20 июня 2007 года
RussianSpy
3.0K / / 04.07.2006
Почему не доступно?

ЗЫ Устал я говорить в пустоту. Успехов в извращениях.
6.0K
20 июня 2007 года
merlex
78 / / 25.02.2006
Цитата: RussianSpy
Почему не доступно?

ЗЫ Устал я говорить в пустоту. Успехов в извращениях.



ну предложите хоть один работающий вариант, ну или хотябы более мение четкую концепцию решеня проблемы....

6.0K
22 июня 2007 года
merlex
78 / / 25.02.2006
а вот и шаблон для регекспов
общее решение.
 
Код:
$sql=trim($sql);
$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());
}
15
22 июня 2007 года
shaelf
2.7K / / 04.05.2005
Поставь на хост phpmyadmin (3 минуты) и через него залей (1 минута) и всё.
92
22 июня 2007 года
Тень Пса
2.2K / / 19.10.2006
Цитата: merlex
> В таком случае вперед к чтению мануалов по бэкапам

эт канешна здорово, но кто мне шелл даст на мускул? ... мне надо средствами ПХП .... а там кроме злосчасного однозапросового mysql_query .... пока ничего не нашел ....

интересно кк тотже PHPMyAdmin работает?


если ты хочешь сделать подобное, то посмотри как всё-таки работает PhpMyAdmin. или может просто хочется перепридумать? :)

6.0K
22 июня 2007 года
merlex
78 / / 25.02.2006
Цитата: Тень Пса
если ты хочешь сделать подобное, то посмотри как всё-таки работает PhpMyAdmin. или может просто хочется перепридумать? :)



мне так кажется что то он также таботает с разбивкой команд .... ибо ниче другова на ум не приходит.

6.0K
22 июня 2007 года
merlex
78 / / 25.02.2006
Цитата: shaelf
Поставь на хост phpmyadmin (3 минуты) и через него залей (1 минута) и всё.



ну проблема в том, что задачей является не заливк в базу дампа, а создание скрипта укоторый это делает. Установка движка для сайта.

причем тут поставь phpmyadmin?, разумеется он там есть.

16K
22 июня 2007 года
Бян
43 / / 05.09.2006
для PHP5 есть расширение mysqli
http://ru2.php.net/manual/ru/function.mysqli-multi-query.php
6.0K
22 июня 2007 года
merlex
78 / / 25.02.2006
зы ... разбивать запрос по ; с переводом строки очень удобно, потому как он всегда следует в конце запроса (типа как кто-то enter нажал) а прочие переводы строк, в тексте ячеек базы заменяются \r

mfender, так что ваша идея лучшая ... простая и эффективная, не надо заморачиваться с подсчетом кавычек (как в соседней теме) и составлять бесконечные регэкспы, которые могут не подойти под какойнить случай.
Вобщем спасибо.

а использование регэкспов упростит понимание скриптом различных дампов.

Нампример как в моем примере, работает и у меня на Денвере, и на 1gb.ru.
92
22 июня 2007 года
Тень Пса
2.2K / / 19.10.2006
уже бы давно взял исходник PhpMyAdmin'а и посмотрел что да как :) устроил оценки вариантам решения ;)
8
22 июня 2007 года
mfender
3.5K / / 15.06.2005
Цитата: Бян
для PHP5 есть расширение mysqli
http://ru2.php.net/manual/ru/function.mysqli-multi-query.php


А знаешь, что бывает за разглашение тайн??? :D

6.0K
22 июня 2007 года
merlex
78 / / 25.02.2006
>для PHP5 есть расширение mysql

да, чето такое в доке по ПХП видел .... но вниманя не предал особо ... так как не везде сработает ИМХО.

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

8
22 июня 2007 года
mfender
3.5K / / 15.06.2005
Цитата:
mysqli->multi_query -- Performs a query on the database


Это говорит о том, скорее всего, что версии расширений не однояйцевые. И эта беда будет ещё долго преследовать всех. Поэтому на mysqli вообще не стоит полагаться ещё лет три. Поэтому никто его всерьёз не рассматривает. Вот когда до хостёров дойдёт, что это такое и зачем оно нужно, тогда можно использовать.

6.0K
22 июня 2007 года
merlex
78 / / 25.02.2006
>уже бы давно взял исходник PhpMyAdmin'а и посмотрел что да как

был такой порыв, потом когда все и так заработало, пропал :)
15
23 июня 2007 года
shaelf
2.7K / / 04.05.2005
>причем тут поставь phpmyadmin?, разумеется он там есть.
В задаче было сказао, что нужно занести в БД, а не сделать скрипт, который это бы делал.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог