|
|
|
| Делаю скрипт восстановления БД.
Его задача подцеплять gzip архив, и скармливать его данные функции mysql_query.
На текущий момент это выглядит так:
$gz=gzopen(arxiv10-13.sql.gz, "r");
$string=gzread($gz, 10485760); //читаем весь файл
$result=mysql_query($string);
echo mysql_error();
|
На экран выводится ошибка
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '; INSERT INTO 'arxiv' VALUES ('20','news','52'); INSERT INTO '
|
хотя, через phpmyadmin запрос проходит нормально.
Структура таблицы
CREATE TABLE 'arxiv' (
'id' smallint(6) NOT NULL auto_increment,
'table' tinytext NOT NULL,
'lastfield' bigint(20) NOT NULL default '0',
PRIMARY KEY ('id')
) ENGINE=MyISAM;
|
Прикладываю архив... сосбвенно, куда копать мне не очень понятно. | |
|
|
|
|
|
|
|
для: Loki
(23.10.2005 в 14:53)
| | Уберите кавычки в которых содержится название вашей таблицы. | |
|
|
|
|
|
|
|
для: codexomega
(23.10.2005 в 18:49)
| | Это глюк форума - там косые кавычки. | |
|
|
|
|
|
|
|
для: Loki
(23.10.2005 в 20:05)
| | Это не важно, вообще уберите их. | |
|
|
|
|
|
|
|
для: codexomega
(23.10.2005 в 20:11)
| | Убирать их нельзя по условию задачи: таблицы могут иметь названия, совпадающие с системными коммандами sql. По отдельности все запросы работают, а вот скопом - не хотят. | |
|
|
|
|
|
|
|
для: Loki
(23.10.2005 в 14:53)
| | А что находится перед
; INSERT INTO 'arxiv' VALUES ('20','news','52'); INSERT INTO
| ? | |
|
|
|
|
|
|
|
для: cheops
(23.10.2005 в 20:50)
| | Файл целиком в аттаче. | |
|
|
|
|
|
|
|
для: Loki
(23.10.2005 в 21:06)
| | А если взять содержимое дампа и засунуть в phpMyAdmin - тоже ошибка? | |
|
|
|
|
|
|
|
для: cheops
(23.10.2005 в 21:21)
| | Я че то примерно когда то пытался сделать. Прикол в том что нельзя в mysql_query() подставлять несколько запросов. А вот если построчно разбить на отдельные запросы, тогда все OK. | |
|
|
|
|
|
|
|
для: Евгений Петров
(23.10.2005 в 21:47)
| | Обидно... А построчно не получится: например, при экспорте форума присутствуют поля содержащие переводы строк.
Исхитрился сделать так: разбиваю в массив использую в качестве разделителя "');". После чего эту комбинацию подставляю в конец запроса. Вроде как в дампе не должно быть прямых кавычек... если только никто туда не засунет заэкранированные... Как поступить в этом случае - на знаю.
Или может в дампе сразу делать другие разделители... | |
|
|
|
|
|
|
|
для: Loki
(23.10.2005 в 23:06)
| | А проблема в разбивке? Хм... так вы разбивайте по регулярному выражению - их можно достаточно хитрыми сделать и учесть множество вариантов http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=1407 | |
|
|
|
|
|
|
|
для: cheops
(24.10.2005 в 13:29)
| | Посмотрел... любопытно. Но подобная последовательность может втретиться в текстовом поле (например, при экспорте этого форума). В общем, сделал я другой разделитель - теперь работает нормально... медленно, но надежно:) | |
|
|
|
|
|
|
|
для: Loki
(24.10.2005 в 13:54)
| | На самом деле не может, если все спец-символы внутри строк подвергаются экранированию. Напримр, тот же phpMyAdmin для каждого поста даёт строго одну строку. | |
|
|
|
|
|
|
|
для: cheops
(24.10.2005 в 21:03)
| | то есть по-хорошему, при архивации надо пропускать данные через addslashes, а при импорте через stripslashes? Как-то я об этом не подумал... надо будет сделать так. Спасибо! | |
|
|
|
|
|
|
|
для: cheops
(23.10.2005 в 21:21)
| | Я же написал, что phpmyadmin лопает это нормально:( | |
|
|
|