Ошибка выполнения Perl-танцора - PullRequest
0 голосов
/ 25 июня 2018

Я пытался создать сайт с использованием Perl Dancer, ниже мой код.Это кажется правильным, но страница продолжает загружаться и никогда не вводит значения в базу данных.Когда я отменяю страницу, я получаю сообщение об ошибке "request to POST /appform crashed: Can't call method "execute" on an undefined value".Я не могу понять, что не так в коде.Если у вас есть другой код, пожалуйста, укажите.Я использую SQLite для базы данных.Есть база данных campus.db, и я вставляю значение в таблицу student.

post '/appform' => sub {

        my $q = CGI ->new;
        my $name = $q->param ("firstname");
        my $password = $q->param("password");
        my $mobile_no = $q->param("mobile");
        my $gender = $q->param("gender");
        my $email = $q->param("email");
        my $address = $q->param("address");
        my $sslc = $q->param("SSLC");
        my $hsc = $q->param("HSC");
        my $cgpa = $q->param("cgpa");
        my $languages = $q->param("lang");
        my $internships = $q->param("intern");
        my $preferred_loc = $q->param("country");
        my $sql = "insert into student(name,mobile_no,gender,email,address,sslc,hsc,cgpa,languages,internships,preferred_loc,password,applied_job,company_applied) values ('?','?','?','?','?','?','?','?','?','?','?','?','?','?');";
        my $sth = database->prepare($sql); 
        $sth->execute($name,$mobile_no,$gender,$email,$address,$sslc,$hsc,$cgpa,$languages,$internships,$preferred_loc,$password) or die $sth->errstr;
        #$sth->execute();   
        $sth-> finish;
        set_flash('New entry posted!');
            redirect '/';
    };

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

В дополнение к уже сделанным замечаниям, ваш вызов DBI prepare (), вероятно, не работает (добавьте проверку ошибок, чтобы выяснить, почему, например, my $sth = database->prepare('...') or die "DB error: " . database->errstr), и что вы используете CGI.pm в приложении Dancer (. .. не делайте этого, я удивлен, что это будет работать на всех - посмотрите документацию Dancer о том, как получить доступ к параметрам, отправленным вашим приложением), посмотрите также удобный метод quick_insert предоставляется Dancer :: Plugin :: Database / Dancer2 :: Plugin :: Database, так что вам вообще не нужно писать этот оператор SQL INSERT.

0 голосов
/ 26 июня 2018

Вы используете ключевое слово database, чтобы получить дескриптор базы данных.Я предполагаю, что это исходит от Dancer2 :: Plugin :: Database (было бы полезно, если бы вы могли включить такую ​​информацию в свой вопрос).

Ошибка говорит о том, что вывызов execute() для неопределенного значения.Вы звоните execute() по переменной $sth.Так что $sth не определено.Вы получаете $sth, вызывая prepare() для дескриптора базы данных, возвращенного из database().Похоже, что вызов prepare() не работает.Вы должны проверить возвращаемое значение этого вызова и выдать ошибку, если она не удалась.

Наиболее распространенная причина сбоя prepare() заключается в том, что вы пытаетесь скомпилировать инструкцию SQL, содержащую ошибку.Я не вижу никакой очевидной ошибки в вашем SQL, но стоит проверить ее, запустив ее вручную для вашей базы данных.

Я вижу, что вы используете параметры связывания в вашем операторе SQL.Это отличная идея, но, пожалуйста, обратите внимание, что вам не нужно заключать вопросительные знаки в ваш SQL - драйвер базы данных с этим справится.Я не думаю, что это является причиной вашей проблемы.

Я также вижу, что вы используете CGI.pm в вашем приложении Dancer для получения параметров запроса.Если честно, я немного удивлен, что это работает - но это ужасная идея.Dancer имеет свои ключевые слова, которые дадут вам эту информацию.Посмотрите query_parameters(), body_parameters() и route_parameters() в документации Dancer .

...