#perl #model-view-controller #sqlite
#perl #модель-представление-контроллер #sqlite
Вопрос:
Последние пару дней я возился с CGI :: application и решил создать действительно простой форум: на первой странице отображаются все сообщения (только первого уровня, без ответов или чего-либо еще) и форма, которую можно использовать для создания нового сообщения.
Проблема, с которой я сталкиваюсь, заключается в том, что данные, которые вводятся в форму, никогда не вставляются в базу данных SQLite.
Вот вспомогательная процедура, с которой у меня возникли проблемы:
sub newpost {
my $self = shift;
if ( $self->param() ){
my $dbh = DBI->connect("dbi:SQLite:dbname=$database_file","","");
my $sth = $dbh->prepare("INSERT INTO posts (author, time, text) VALUES('testuser', '2011-10-23', 'This is a test!')");
$sth->execute();
$self->header_type('redirect');
$self->header_props(-url=> '?rm=viewall');
}
else {
my $tmpl_obj = $self->load_tmpl('newpost.html');
return $tmpl_obj->output();
}
Что происходит правильно, так это то, что при первом вызове режима запуска newpost выполняется код внутри инструкции else (загружается шаблон с формой). Действие для формы вызывает тот же режим выполнения, но теперь, когда параметры предоставляются, выполняется код в инструкции if . Я проверил сам код SQL, и он работает, так что должно быть что-то еще, что я просматриваю.
Кроме того, считается ли наилучшей практикой реализация логики формы таким образом?
Спасибо
Ответ №1:
Вы путаете $self->param()
с $self->query->param
. 1-й — это параметры уровня приложения для каждого запроса (которые вы можете установить в одном методе и использовать снова в другом методе), а 2-й — это параметры из строки запроса GET или POST тела запроса. Если вы ожидаете чего-то от пользователя, это будет $self->query->param
.
Кстати, $self->query
объект является обычным CGI
объектом, поэтому подробности см. В документации.