
Есть у меня дамп базы данных сделанный, например, через phpmyadmin. Имеет самый классический вид типа:
DROP TABLE IF EXISTS tbl_name;
CREATE TABLE tbl_name(
)...;
INSERT INTO tbl_name (...) VALUES (...);
и т.д.
И теперь вопрос: почему этот код нельзя просто передать функции mysql_query? На сколько я понимаю, она не умеет обрабатывать несколько запросов разделенных точкой с запятой.
Но может все-таки есть какой-то простой способ без велосипеда загрузить этот дамп средствами php?
Спустя 6 минут, 29 секунд (27.07.2010 - 22:51) Ice написал(а):
пробуйте несколько раз вызывать mysql_query
Спустя 11 минут, 7 секунд (27.07.2010 - 23:03) yurij__ написал(а):
поскольку все SQL инструкции находятся в одном файле, то мне придется его парсить, разбивая на куски (то есть отдельные запросы), а это как бы не очень охота. Правда, интуиция подсказывает, что лучше способа не найдется... Но хочется верить что я ошибаюсь

Спустя 2 минуты, 56 секунд (27.07.2010 - 23:05) sergeiss написал(а):
Если у тебя этот дамп имеет разумные пределы (т.е. ты не дойдешь до лимита использования памяти), то всё "парсенье" уберется в 1 строку
. Плюс потом сделать цикл выполнения скриптов.
PS. Вот она, эта одна строка:

PS. Вот она, эта одна строка:
$sqls=explode( ';', file_get_contents('имя_файла') );
Спустя 1 минута, 8 секунд (27.07.2010 - 23:07) dr_Lev написал(а):
mysqli может помочь решить твою проблему... а именно mysqli_multi_query
Спустя 1 минута, 43 секунды (27.07.2010 - 23:08) yurij__ написал(а):
Цитата |
Если у тебя этот дамп имеет разумные пределы (т.е. ты не дойдешь до лимита использования памяти), то всё "парсенье" уберется в 1 строку . Плюс потом сделать цикл выполнения скриптов. |
Вероятно я туплю, но как сделать парсенье в одну строку?
sergeiss, если бы предложенный Вами парсер был так хорош, не возникло бы сабжа.. А что будет если в тексте дампа встретится точка с запятой? она как бы может встретиться где-угодно, и вычислять все возможные варианты - не лучшее времяпровождение

Спустя 1 минута, 17 секунд (27.07.2010 - 23:10) sergeiss написал(а):
Цитата (yurij__ @ 28.07.2010 - 00:08) |
Вероятно я туплю, но как сделать парсенье в одну строку? |
Я чуть выше сделал уже приписку.
Спустя 2 минуты, 54 секунды (27.07.2010 - 23:12) yurij__ написал(а):
Цитата |
Я чуть выше сделал уже приписку. |
и я чуть выше сделал приписку

Спустя 2 минуты, 50 секунд (27.07.2010 - 23:15) yurij__ написал(а):
dr_Lev, а Ваш способ всем хорош, жалко неприменим к mysql. А сильно ли отличаются mysql и mysqli?
Спустя 49 минут, 53 секунды (28.07.2010 - 00:05) dr_Lev написал(а):
В mysqli есть практически все, что есть в mysql, и почти все фонкции/методы называются и вызываются также, только mysqli дает больше возможностей, чем mysql
Спустя 36 секунд (28.07.2010 - 00:06) SlavaFr написал(а):
в техте может конечно находится ";" но ";\r\n" находится не будет.
Алтернатива: Даеш денег и тебе дамп обычным способом через консоль загоняют.
читаем в цикле построчно sql
IF в начале строки "--" то пропускаем.
ELSE добавляем ее в переменную $буфер
IF в конце буфера ";\r\n" то делаем mysql_query и опусташаем $буфер
Алтернатива: Даеш денег и тебе дамп обычным способом через консоль загоняют.
Спустя 13 минут, 11 секунд (28.07.2010 - 00:19) yurij__ написал(а):
SlavaFr, пожалуй так и сделаю! Ничего другого, вероятно, для mysql не придумать.
Спустя 17 минут, 20 секунд (28.07.2010 - 00:36) SlavaFr написал(а):
Цитата (yurij__ @ 27.07.2010 - 21:19) |
SlavaFr, пожалуй так и сделаю! Ничего другого, вероятно, для mysql не придумать. |
да дело не в mysql, а в том, что у тебя прав нет через терминал на сервере работать.
Спустя 5 минут, 52 секунды (28.07.2010 - 00:42) yurij__ написал(а):
Да, да. Я имел ввиду для mysql средствами php.
Спустя 6 часов, 16 минут, 52 секунды (28.07.2010 - 06:59) sergeiss написал(а):
Еще вариант.
Насколько я вижу, у тебя по окончании запроса стоит точка с запятой и далее переход на новую строку. Поэтому в том парсере, что я указал, в качестве разделителя достаточно поставить ';\n', т.е. точку с запятой и следующий за ней знак "новая строка". Это-то вряд ли будет внутри запроса.
Если у тебя есть пробелы после точки с запятой перед "новой строкой"... Ну обработай, чтобы этого не было
Не так это и сложно. И это будет единственная "неудобная" комбинация, от которой надо избавиться.
PS. Внес поправку!!!
Строку ";\n" надо писать именно в двойных кавычках, иначе не сработает, как надо. А я сначала поторопился и написал в одинарных.
Насколько я вижу, у тебя по окончании запроса стоит точка с запятой и далее переход на новую строку. Поэтому в том парсере, что я указал, в качестве разделителя достаточно поставить ';\n', т.е. точку с запятой и следующий за ней знак "новая строка". Это-то вряд ли будет внутри запроса.
Если у тебя есть пробелы после точки с запятой перед "новой строкой"... Ну обработай, чтобы этого не было

$sqls=explode( ";\n", file_get_contents('имя_файла') );
PS. Внес поправку!!!
Строку ";\n" надо писать именно в двойных кавычках, иначе не сработает, как надо. А я сначала поторопился и написал в одинарных.
Спустя 3 часа, 53 минуты, 46 секунд (28.07.2010 - 10:53) Wird_34 написал(а):
А если там win-формат новой строки т.е. "\r\n"?
Спустя 2 часа, 24 минуты, 16 секунд (28.07.2010 - 13:17) SlavaFr написал(а):
тогда регулярное выражение
Спустя 2 часа, 38 минут, 58 секунд (28.07.2010 - 15:56) sergeiss написал(а):
Цитата (Wird_34 @ 28.07.2010 - 11:53) |
А если там win-формат новой строки т.е. "\r\n"? |
А кто мешает сначала загрузить файл в строку, проверить, какие комбинации "новой строки" имеются, а затем делить на элементы массива? Элементарно же это всё!!! И я думаю, что автор темы с этим справится.