CGI ::Application и SQLite

#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 объектом, поэтому подробности см. В документации.