| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: Общие вопросы > DBXi Вставка данных |
| Автор: werzer 11.4.2011, 18:28 |
| Добрый день! Начинаю использовать 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 Вставка данных" |
| Автор: IceSunrise 11.4.2011, 21:08 |
| werzer, А что вы хотите экранировать, там просто число? Можете попробовать синтаксис, описанный здесь: http://search.cpan.org/~frew/SQL-Abstract-1.72/lib/SQL/Abstract.pm#Literal_SQL_with_placeholders_and_bind_values_(subqueries) |
| Автор: werzer 11.4.2011, 22:04 | ||
Да, просто число. Сделал, как указано по ссылке, работает, но если указать в классе с данными: __PACKAGE__->load_components(qw/InflateColumn::DateTime/); то вылезает ошибка, что-то типа unblessed references при вызове метода ymd, завтра подробнее напишу ошибку. |
| Автор: IceSunrise 12.4.2011, 10:47 | ||||
А зачем экранировать просто число? Пишите, как у вас есть
Число и есть число, там экранировать нечего |
| Автор: 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. Как эту ошибку побороть? |
| Автор: Logo 13.4.2011, 13:20 | ||||||
http://ru.wikipedia.org/wiki/SQL_injection
Так используйте эту директиву
|
| Автор: werzer 13.4.2011, 15:16 | ||||||
Ошибка вылезает вот тут: Schema->resultset('table')->create({ some_dtime => \["FROM_UNIXTIME(?)", [some_dtime => $time]] }) Вызывать DateTime->from_epoch тоже не хочу, так как получится путаница с часовыми поясами. |
| Автор: sir_nuf_nuf 13.4.2011, 16:28 | ||
| werzer, (Виталий ?) если у тебя стоит inflate / deflate на колонке, то в create нужно передавать "объектное" значение, т.е. экземпляр DateTime. Может так сработает ?
|
| Автор: werzer 13.4.2011, 18:37 | ||||
Да это я В итоге заработало, как ты описал, спасибо! Но все равно DBIx хитрая штука |
| Автор: sir_nuf_nuf 14.4.2011, 10:53 |
Не очень хитрая =) Для чего она не удобная - так это длинные запросы. |