Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DBXi Вставка данных 
:(
    Опции темы
werzer
Дата 11.4.2011, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 11.4.2011

Репутация: нет
Всего: нет



Добрый день!

Начинаю использовать DBIx::Class на проекте, база Mysql. Хочу сделать insert  в базу вида:
INSERT INTO table (some_dtime) VALUES (FROM_UNIXTIME(?)): '1302037199'. 

Проблема собственно в аргументе "FROM_UNIXTIME(?)", и именно через вопросик,  то есть данные будет экранировать сама база. У меня получилось:

Schema->resultset('table')->                                                                                          
  create({  some_dtime  => \"FROM_UNIXTIME(1302037199)" }); 

Но в этом случае запрос получается вида (без экранирования базой):
INSERT INTO table (some_dtime) VALUES (FROM_UNIXTIME(1302037199))

Как сделать, чтобы данные экранировала база?

PS: Надо бы отредактировать название темы "DBXi Вставка данных" -> "DBIx Вставка данных"

Это сообщение отредактировал(а) werzer - 11.4.2011, 18:31
PM MAIL   Вверх
IceSunrise
Дата 11.4.2011, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 7.4.2008
Где: Санкт-Петербург

Репутация: 3
Всего: 3



werzer, А что вы хотите экранировать, там просто число?
Можете попробовать синтаксис, описанный здесь: link
PM MAIL   Вверх
werzer
Дата 11.4.2011, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 11.4.2011

Репутация: нет
Всего: нет



Цитата(IceSunrise @ 11.4.2011,  21:08)
werzer, А что вы хотите экранировать, там просто число?
Можете попробовать синтаксис, описанный здесь: link

Да, просто число. Сделал, как указано по ссылке, работает, но если указать в классе с данными:
__PACKAGE__->load_components(qw/InflateColumn::DateTime/);

то вылезает ошибка, что-то типа unblessed references при вызове метода ymd, завтра подробнее напишу ошибку.
PM MAIL   Вверх
IceSunrise
Дата 12.4.2011, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 7.4.2008
Где: Санкт-Петербург

Репутация: 3
Всего: 3



Цитата(werzer @ 11.4.2011,  22:04)
Да, просто число.

А зачем экранировать просто число? Пишите, как у вас есть
Код

Schema->resultset('table')->create({  some_dtime  => \"FROM_UNIXTIME($epoch)" });

Число и есть число, там экранировать нечего smile
PM MAIL   Вверх
werzer
Дата 12.4.2011, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 11.4.2011

Репутация: нет
Всего: нет



Цитата(IceSunrise @ 12.4.2011,  10:47)
Цитата(werzer @ 11.4.2011,  22:04)
Да, просто число.

А зачем экранировать просто число? Пишите, как у вас есть
Код

Schema->resultset('table')->create({  some_dtime  => \"FROM_UNIXTIME($epoch)" });

Число и есть число, там экранировать нечего smile

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

Вот ошибка возвращается, если вставить в класс директиву __PACKAGE__->load_components(qw/InflateColumn::DateTime/):

Can't call method "ymd" on unblessed reference at /usr/local/share/perl/5.10.1/DateTime/Format/MySQL.pm line 84.

Как эту ошибку побороть?

PM MAIL   Вверх
IceSunrise
Дата 12.4.2011, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 7.4.2008
Где: Санкт-Петербург

Репутация: 3
Всего: 3



Цитата(werzer @  12.4.2011,  11:31 Найти цитируемый пост)

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

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

Цитата(werzer @  12.4.2011,  11:31 Найти цитируемый пост)

Вот ошибка возвращается, если вставить в класс директиву __PACKAGE__->load_components(qw/InflateColumn::DateTime/):
Can't call method "ymd" on unblessed reference at /usr/local/share/perl/5.10.1/DateTime/Format/MySQL.pm line 84.
Как эту ошибку побороть?


А что вы делаете, в каком месте ошибка вылетает?
PM MAIL   Вверх
Logo
Дата 13.4.2011, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



Цитата

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


SQL injection

Цитата

Вот ошибка возвращается, если вставить в класс директиву __PACKAGE__->load_components(qw/InflateColumn::DateTime/):


Так используйте эту директиву

Код

$rs->create({ some_dtime => DateTime->from_epoch(epoch => 1302037199) });

PM MAIL   Вверх
werzer
Дата 13.4.2011, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 11.4.2011

Репутация: нет
Всего: нет



Цитата(IceSunrise @ 12.4.2011,  22:10)
Цитата(werzer @  12.4.2011,  11:31 Найти цитируемый пост)

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

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

Цитата(werzer @  12.4.2011,  11:31 Найти цитируемый пост)

Вот ошибка возвращается, если вставить в класс директиву __PACKAGE__->load_components(qw/InflateColumn::DateTime/):
Can't call method "ymd" on unblessed reference at /usr/local/share/perl/5.10.1/DateTime/Format/MySQL.pm line 84.
Как эту ошибку побороть?


А что вы делаете, в каком месте ошибка вылетает?

Ошибка вылезает вот тут:
Schema->resultset('table')->create({  some_dtime  => \["FROM_UNIXTIME(?)",  [some_dtime => $time]] })

Вызывать DateTime->from_epoch тоже не хочу, так как получится путаница с часовыми поясами.

Это сообщение отредактировал(а) werzer - 13.4.2011, 15:18
PM MAIL   Вверх
sir_nuf_nuf
Дата 13.4.2011, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 14
Всего: 31



werzer, (Виталий ?) если у тебя стоит inflate / deflate на колонке, то в create нужно передавать "объектное" значение, т.е. экземпляр DateTime.


Может так сработает ?
Код

my $row = $Schema->resultset('table')->new_result({ ..... });
$row->set_column(some_dtime  => \["FROM_UNIXTIME(?)",  [some_dtime => $time]]);
$row->insert;





--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
werzer
Дата 13.4.2011, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 11.4.2011

Репутация: нет
Всего: нет



Цитата(sir_nuf_nuf @ 13.4.2011,  16:28)
werzer, (Виталий ?) если у тебя стоит inflate / deflate на колонке, то в create нужно передавать "объектное" значение, т.е. экземпляр DateTime.


Может так сработает ?
Код

my $row = $Schema->resultset('table')->new_result({ ..... });
$row->set_column(some_dtime  => \["FROM_UNIXTIME(?)",  [some_dtime => $time]]);
$row->insert;

Да это я smile

В итоге заработало, как ты описал, спасибо! Но все равно DBIx хитрая штука smile
PM MAIL   Вверх
sir_nuf_nuf
Дата 14.4.2011, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 14
Всего: 31



Цитата(werzer @  13.4.2011,  18:37 Найти цитируемый пост)
 Но все равно DBIx хитрая штука

Не очень хитрая =)
Для чего она не удобная - так это длинные запросы.


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0790 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.