Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Странное поведение phpmyadmin (http://forum.oszone.net/showthread.php?t=303866)

inzaim 12-08-2015 11:53 2540558

Странное поведение phpmyadmin
 
При снятии дампа с mysql через phpmyadmin получаю на выходе
Код:

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
DROP TABLE IF EXISTS `files`;
CREATE TABLE IF NOT EXISTS `files` (
  `disk` varchar(255) default NULL,
  `hl` varchar(255) default NULL,
  `ll` varchar(255) default NULL,
  `extensions` varchar(255) default NULL,
  `date` datetime default NULL,
  `size` double default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `files` VALUES ('C:', '\\Users\\admin\\Documents\\filemonsql\\dir\\', 'files', '.xml', '2015-08-07 11:13:00', 389);
INSERT INTO `files` VALUES ('C:', '\\Users\\admin\\Documents\\filemonsql\\dir\\', '07.08.2015', '.xml', '2015-08-07 16:04:00', 561);
INSERT INTO `files` VALUES ('C:', '\\Users\\admin\\Documents\\filemonsql\\', 'mysqldump', '.exe', '2008-02-13 13:00:00', 2146944);
INSERT INTO `files` VALUES ('C:', '\\Users\\admin\\Documents\\filemonsql\\', 'files', '.sql', '2015-08-07 11:35:00', 0);
INSERT INTO `files` VALUES ('C:', '\\Users\\admin\\Documents\\filemonsql\\', 'DirToXML', '.bat', '2015-08-07 15:59:00', 5375);
INSERT INTO `files` VALUES ('C:', '\\Users\\admin\\Documents\\filemonsql\\dir\\', 'files', '.xml', '2015-08-07 11:13:00', 389);

Но когда при помощи скрипта
Код:

chcp 65001
echo -- > C:\Users\admin\Documents\filemonsql\dir\%date%.sql
echo SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; >> C:\Users\admin\Documents\filemonsql\dir\%date%.sql
echo DROP TABLE IF EXISTS `files`; >> C:\Users\admin\Documents\filemonsql\dir\%date%.sql
echo CREATE TABLE IF NOT EXISTS `files` ( >> C:\Users\admin\Documents\filemonsql\dir\%date%.sql
echo  `disk` varchar(255) default NULL, >> C:\Users\admin\Documents\filemonsql\dir\%date%.sql
echo  `hl` varchar(255) default NULL, >> C:\Users\admin\Documents\filemonsql\dir\%date%.sql
echo  `ll` varchar(255) default NULL, >> C:\Users\admin\Documents\filemonsql\dir\%date%.sql
echo  `extensions` varchar(255) default NULL, >> C:\Users\admin\Documents\filemonsql\dir\%date%.sql
echo  `date` datetime default NULL, >> C:\Users\admin\Documents\filemonsql\dir\%date%.sql
echo  `size` double default NULL >> C:\Users\admin\Documents\filemonsql\dir\%date%.sql
echo ) ENGINE=MyISAM DEFAULT CHARSET=utf8; >> C:\Users\admin\Documents\filemonsql\dir\%date%.sql

 for /f "delims=" %%a in ('dir %1 /S /B /A:-D-L') do @(
 >nul ping -n 1 -w 1 ""
 >>"C:\Users\admin\Documents\filemonsql\dir\%date%.sql" echo INSERT INTO `files` VALUES ('%%~da', '\%%~pa\', '%%~na', '%%~xa', '%%~ta', %%~za^)^;
 )
@pause

Собираю содержимое каталога или диска, то на выходе получаю немного отличающуюся информацию:
Код:

DROP TABLE IF EXISTS `files`;
CREATE TABLE IF NOT EXISTS `files` (
  `disk` varchar(255) default NULL,
  `hl` varchar(255) default NULL,
  `ll` varchar(255) default NULL,
  `extensions` varchar(255) default NULL,
  `date` datetime default NULL,
  `size` double default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `files` VALUES ('C:', '\\Users\admin\Documents\filemonsql\\', '07.08.2015', '.sql', '07.08.2015 16:11', 557);
INSERT INTO `files` VALUES ('C:', '\\Users\admin\Documents\filemonsql\\', 'DirToXML', '.bat', '11.08.2015 15:59', 5001);
INSERT INTO `files` VALUES ('C:', '\\Users\admin\Documents\filemonsql\\', 'DirToXML_rezerv', '.bat', '07.08.2015 15:59', 5375);
INSERT INTO `files` VALUES ('C:', '\\Users\admin\Documents\filemonsql\\', 'impotTOmysql', '.bat', '07.08.2015 16:42', 389);
INSERT INTO `files` VALUES ('C:', '\\Users\admin\Documents\filemonsql\\', 'mysql', '.bat', '07.08.2015 16:53', 56);
INSERT INTO `files` VALUES ('C:', '\\Users\admin\Documents\filemonsql\\', 'mysqldump', '.exe', '13.02.2008 13:00', 2146944);
INSERT INTO `files` VALUES ('C:', '\\Users\admin\Documents\filemonsql\\', 'spy off', '.bat', '10.08.2015 16:37', 3955);
INSERT INTO `files` VALUES ('C:', '\\Users\admin\Documents\filemonsql\dir\\', '10.08.2015', '.xml', '11.08.2015 10:19', 37955313);
INSERT INTO `files` VALUES ('C:', '\\Users\admin\Documents\filemonsql\dir\\', '11.08.2015', '.sql', '11.08.2015 16:00', 1370);

При попытке засунуть инструментами phpmyadmin дамп в базу, то в строке с адресом расположения файла пропадают двойные слешы, а одинарный просто пропадает и в бд я имею на выходе следующую строку
Код:

\UsersadminDocumentsfilemonsqldir\
Что за ерись и как её побороть?

greg zakharov 12-08-2015 18:04 2540797

Дык может дело не в пыхадмине, а в командном файле? И потом, для чего нужен пыхадмин, когда есть кошерный MySQL Workbanch (речь ведь о мускуле, верно?)?

inzaim 17-08-2015 10:18 2542529

Попробовал изменить подход и все сделать через cmd, но не тут то было.
Поясню логику свою логику. Если не идет через РНРмайадмин, то возможно ошибка где-то в самом майадмине. Решил напрямую обращаться через mysql.exe.

Сформировал информацию для БД скриптом:
Код:

: устанавливаем кодировку UTF-8.
: Кодировка необходима для корректного открывания и импорта полученного *.XML в программу Excel
chcp 65001
: Тут формируется правильный заголовок для *.bat файла.
: Обратите внимание на символ ^. Этот символ позволяет нам выводить в echo специальные символы.
: Символ ^ делает "экранирование" специальных символов, и они печатаются к нормальный текст.
echo -- > C:\Users\admin\Documents\filemonsql\dir_output\%date%.bat
echo SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; >> C:\Users\admin\Documents\filemonsql\dir_output\%date%.bat
: Структура таблицы `files`
echo DROP TABLE IF EXISTS `files`; >> C:\Users\admin\Documents\filemonsql\dir_output\%date%.bat
echo CREATE TABLE IF NOT EXISTS `files` ( >> C:\Users\admin\Documents\filemonsql\dir_output\%date%.bat
echo  `disk` varchar(255) default NULL, >> C:\Users\admin\Documents\filemonsql\dir_output\%date%.bat
echo  `hl` varchar(255) default NULL, >> C:\Users\admin\Documents\filemonsql\dir_output\%date%.bat
echo  `ll` varchar(255) default NULL, >> C:\Users\admin\Documents\filemonsql\dir_output\%date%.bat
echo  `extensions` varchar(255) default NULL, >> C:\Users\admin\Documents\filemonsql\dir_output\%date%.bat
echo  `date` datetime default NULL, >> C:\Users\admin\Documents\filemonsql\dir_output\%date%.bat
echo  `size` double default NULL >> C:\Users\admin\Documents\filemonsql\dir_output\%date%.bat
echo ) ENGINE=MyISAM DEFAULT CHARSET=utf8; >> C:\Users\admin\Documents\filemonsql\dir_output\%date%.bat
: В этой части начинается магия.
: Для понимания того, что тут написано используйте help для команды for
: В скобках мы кладем команду dir, которая запускается с s-рекурсией по всем подпапкам, b-вывод полных путей до файлов с именами файлов, x-позволяет нам без ошибок, если мена файлов очень длинные, продолжить выполнение скрипта. Х-сократит слишком длинные имена, без потери связи.
: после do выполняем echo, которое выводит нам необходимую информацию из DIR, разбивая её по ключам из команды FOR, записывая вывод в файл.
: Двойная >> необходимо, чтобы дозаписывалась\писалась каждая прошенная строка
 for /f "delims=" %%a in ('dir %1 /S /B /A:-D-L') do @(
 >nul ping -n 1 -w 1 ""
 >>"C:\Users\admin\Documents\filemonsql\dir_output\%date%.bat" echo INSERT INTO `files` VALUES ('%%~da', '%%~pa', '%%~na', '%%~xa', '%%~ta', %%~za^)^;
 )
: Вызываем импорт sql в базу данных через mysql.exe
%~dp0mysql.bat

На выходе получаю:
Код:

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
DROP TABLE IF EXISTS `files`;
CREATE TABLE IF NOT EXISTS `files` (
  `disk` varchar(255) default NULL,
  `hl` varchar(255) default NULL,
  `ll` varchar(255) default NULL,
  `extensions` varchar(255) default NULL,
  `date` datetime default NULL,
  `size` double default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `files` VALUES ('C:', '\\Users\\admin\\Documents\\filemonsql\\', '14.08.2015', '.bat', '14.08.2015 15:55', 996);
INSERT INTO `files` VALUES ('C:', '\\Users\\admin\\Documents\\filemonsql\\', 'DirToSQL', '.bat', '17.08.2015 09:45', 3298);
INSERT INTO `files` VALUES ('C:', '\\Users\\admin\\Documents\\filemonsql\\', 'DirToXML_rezerv', '.bat', '07.08.2015 15:59', 5375);
INSERT INTO `files` VALUES ('C:', '\\Users\\admin\\Documents\\filemonsql\\', 'mysql', '.bat', '17.08.2015 09:43', 123);
INSERT INTO `files` VALUES ('C:', '\\Users\\admin\\Documents\\filemonsql\\dir_output\\', '14.08.2015', '.bat', '14.08.2015 16:00', 991);
INSERT INTO `files` VALUES ('C:', '\\Users\\admin\\Documents\\filemonsql\\dir_output\\', '17.08.2015', '.bat', '17.08.2015 09:45', 991);

Полученные данные запускаются в БД вот этим скриптом:
Код:

chcp 65001
C:\AppServ\MySQL\bin\mysql.exe -uroot -pPASSWORD --default-character-set=utf8 samba < %~dp0dir_output\%date%.bat

На выходе получаю ошибку:
Код:

ERROR at line 12: Unknown command '\U'.
Но как только одинарные \ меняются на двойные \\, то все чудесным образом начинает работать. Как добавить их через скрипт, подскажите. Парсить БД на выходе и менять символ \ на \\ не предлагать )))
Дело в одинарном слеше.


Время: 21:42.

Время: 21:42.
© OSzone.net 2001-