Проблемы с танцором Perl - PullRequest
0 голосов
/ 02 июля 2018

Я создаю веб-сайт со страницей входа администратора, регистрацией для студентов, регистрацией в компании и формой заявки.

Я использую Perl Dancer Framework.

Форма заявки содержит:

Name
Mobile_no
Gender 
Password
Email 
Address
SSLC
HSC
CGPA
Proficient languages
Internships
Preferred location

Соответствующий код следующий для HTML:

    <!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="utf-8">

  <title> APPLICATION FORM </title>

<style>
*
{
    margin: 0;
    padding: 0;
}
.cont {
    background:url("/images/2.jpg");
    background-size: 100%;
    background-repeat: no-repeat;
    padding: 20px;
    height: 750px;
}
form 
{ 
    height: auto;
    border-radius:1px;
    margin: 1% auto;
    padding: 1%;
    background-color:darkgrey; 
    margin-left: 38%;
    width: 30%;
}
input[type=submit] {
    margin-left: 10%;
    background-color:#D14B57;
    color: white;
    padding: 12px 20px;
    border: none;
    border-radius: 4px;
    cursor: pointer;
}
input[type=submit]:hover {
  background-color:green;

}
</style>
</head>

<div class="cont">
  <form method="post">
 <h2 style="text-align: center; text-decoration:underline;" id="contactus">APPLICATION FORM </h2> <br>

   <label for="fname"><strong>Name*</strong></label>
    <input style="margin-left: 26%;" type="text" id="fname" name="name" placeholder="Your name..."> <br> <br>

    <label for="mno"><strong>Mobile Number*</strong></label>
    <input style="margin-left: 7%;" type="text" id="mno" name="mobile_no" placeholder="Your Mobile Number..."> <br> <br>

    <label><strong>Gender*</strong></label>
    <input style="margin-left: 22%;" type="radio" name="gender" value="male" >Male<br>
    <input style="margin-left: 39%;" type="radio" name="gender" value="female" >Female<br>
    <br>
     <label for="fname"><strong>Password*</strong></label>
     <input style="margin-left: 19%;"  type="password" name="password" id="password" pattern="(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{7,}"  title="at least one number and one uppercase and lowercase letter, and at least 7 characters" required></td>

     <br> <br>
     <label for="email"><strong>Email</strong></label>
     <input style="margin-left: 28%;" type="email" id="em" name="email" placeholder="Your MailId..."> <br> <br>

    <label for="add"><strong>Address*</strong></label> 
    <textarea style="margin-left: 21%;" id="address" name="address" style="height:50px"></textarea>
    <br> <br>

    <label for="mark1"><strong>SSLC %*</strong></label>
     <input style="margin-left: 20%;" type="text" id="sslc" name="sslc" maxlength="2"> <br> <br>

     <label for="mark2"><strong>HSC %*</strong></label>
     <input style="margin-left: 22%;" type="text" id="HSC" name="hsc" maxlength="2"> <br> <br>

    <label for="mark"><strong> CGPA* </strong></label>
     <input style="margin-left: 25%;" type="text" id="CGPA" name="cgpa" maxlength="3"> <br> <br>

   <label><strong>Proficient Languages*</strong></label> 
  <input style="margin-left: 12%;" type="checkbox" name="lang" value="C++">C and C++ <br>
  <input style="margin-left: 55%;" type="checkbox" name="lang" value="python">Python <br>
  <input style="margin-left: 55%;" type="checkbox" name="lang" value="java">Java<br>
  <input style="margin-left: 55%;" type="checkbox" name="lang" value="Php">PHP <br>
  <br>

    <label for="intern"><strong>Internships(if any)*</strong></label> 
    <textarea id="int" name="internships" style="height:50px"></textarea>
    <br> <br>

   <label for="country"><strong>Preferred location</strong></label>
    <select id="country" name="preferred_loc">
      <option value="chennai">Chennai</option>
      <option value="bombay">Bombay</option>
      <option value="bang">Bangalore</option>
      <option value="hyd">Hyderabad</option>
    </select> <br> <br>
    <br>
   <input type="submit" value="SUBMIT"> 
   <input style="margin-left: 10%;" type="reset" value="Reset">
    <a style="margin-left: 10%;" href=http://localhost:3000>BACK</a>
     </form>


</div>

Содержимое моего .pm файла:

package ors;
use Dancer ':syntax';
use Dancer::Plugin::Database;
use File::Spec;
use File::Slurp;
use Template;

set 'database'     => File::Spec->catfile(File::Spec->tmpdir(), 'campus.db');
set 'session'      => 'Simple';
set 'template'     => 'template_toolkit';
set 'logger'       => 'console';
set 'log'          => 'debug';
set 'show_errors'  => 1;
set 'startup_info' => 1;
set 'warnings'     => 1;
set 'username'     => 'admin';
set 'password'     => '';
set 'layout'       => 'main';

our $VERSION = '0.1';

get '/' => sub {
    template 'index';
};

get '/admin' => sub {
    template 'admin';
}; 

get '/student' => sub {
    template 'student';
};

get '/company' => sub {
    template 'company';
};

get '/appform' => sub {
    template 'appform';
};

my $flash;

sub set_flash {
       my $message = shift;

       $flash = $message;
}

sub get_flash {

       my $msg = $flash;
       $flash = "";

       return $msg;
}

sub connect_db {
       my $dbh = DBI->connect("dbi:SQLite:dbname=".setting('database')) or
               die $DBI::errstr;

       return $dbh;
}

sub init_db {
       my $db = connect_db();
       my $schema = read_file('./schema.sql');
       $db->do($schema) or die $db->errstr;
}

post '/appform' => sub {

        my $db = connect_db();
        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 = $db->prepare($sql); 
        $sth -> execute(params->{'name'},params->{'mobile_no'},params->{'gender'},params->{'email'},params->{'address'},params->{'sslc'},params->{'hsc'},params->{'cgpa'},params->{'languages'},params->{'internships'},params->{'preferred_loc'},params->{'password'}) or die $sth->errstr;
        #$sth->execute();   
        set_flash('New entry posted!');
            redirect '/';
    };

any ['get', 'post'] => '/student' => sub {

       my $err;
       my $db = connect_db();
       my $sql = 'select name and password from student WHERE name=?  AND password=?';
       my $sth = $db->prepare($sql) or die $db->errstr;
       $sth->execute();

       if ( request->method() eq "POST" ) {

       if ( params->{'name'} ne setting('name') ) {
                       $err = "Invalid username";
        }
       elsif ( params->{'password'} ne setting('password') ) {
                       $err = "Invalid password";
        }
       else {
              session 'logged_in' => true;
              set_flash('You are logged in.');
              return redirect '/';
            }
       }

       template 'add.tt', {
               'err' => $err,
       }
    };

any ['get', 'post'] => '/company' => sub {
       my $err;
       my $db = connect_db();
       my $sql = 'select name and password from company WHERE name=?  AND password=?';
       my $sth = $db->prepare($sql) or die $db->errstr;
       $sth->execute() or die $db->errstr;

       if ( request->method() eq "POST" ) {

       if ( params->{'name'} ne setting('name') ) {
                       $err = "Invalid username";
        }
       elsif ( params->{'password'} ne setting('password') ) {
                       $err = "Invalid password";
        }
       else {
              session 'logged_in' => true;
              set_flash('You are logged in.');
              return redirect '/';
            }
        }


       template 'add.tt', {
               'err' => $err,
       }
    };

any ['get', 'post'] => '/admin' => sub {
       my $err;
       my $db = connect_db();
       my $sql = 'select name and password from admin WHERE name=?  AND password=?';
       my $sth = $db->prepare($sql) or die $db->errstr;
       $sth->execute() or die $db->errstr;

       if ( request->method() eq "POST" ) {

       if ( params->{'name'} ne setting('name') ) {
                       $err = "Invalid username";
        }
       elsif ( params->{'password'} ne setting('password') ) {
                       $err = "Invalid password";
        }
       else {
              session 'logged_in' => true;
              set_flash('You are logged in.');
              return redirect '/';
            }
        }

       template 'add.tt', {
               'err' => $err,
       }  


};





true;

Проблема в том, что когда я пытаюсь заполнить форму заявки и ввести значение в базу данных, появляется сообщение об ошибке: Screenshot of the error

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Добро пожаловать на сайт. Как упоминал Хем, при публикации вопроса желательно использовать текст вместо изображений. Тем не менее, возможно, информация ниже будет полезна ...

Заполнители SQL и параметры привязки

Возможно, ваш запрос не выполнен, поскольку число параметров, которые вы связываете, не равно количеству заполнителей SQL. У вас есть 14 заполнителей - но вы связываете только 12 параметров в вашем выражении execute(...).

У вас есть такая же проблема в ваших /admin, /student и /company обработчиках маршрутов - где в каждом случае вы готовите оператор с двумя заполнителями - например,

my $sql = 'select name and password from admin WHERE name=?  AND password=?';
my $sth = $db->prepare($sql);

, но затем попытайтесь выполнить его без привязки каких-либо параметров:

$sth->execute();

Если вы используете заполнители в своем запросе, вы должны привязать параметры, используя либо $sth->bind_param(...), либо передав значения $sth->execute(...).

Плагин базы данных Dancer

Поскольку вы используете модуль Dancer 'Plugin :: Database', вам не нужно устанавливать новое соединение с базой данных при каждом запросе. Вместо этого модуль может подключиться для вас автоматически.

Вам просто нужно сначала определить соответствующие параметры базы данных в config.yml.

То есть, в вашем config.yml добавьте что-то вроде следующего (поскольку вы используете SQLite):

plugins:
    Database:
        driver: SQLite
        database: 'campus.db'

Затем замените

my $db = connect_db();
my $sth = $db->prepare($sql);

с

my $sth = database->prepare($sql);

Вы можете полностью удалить функцию db_connect(), как только вы это сделаете.

Крайне важно, чтобы параметры вашей базы данных были установлены правильно в вашем файле конфигурации заранее.

0 голосов
/ 02 июля 2018
my $sth = $db->prepare($sql);

$sth не определено, поскольку prepare не удалось, но вы пренебрегли проверкой на наличие ошибок. Пожалуйста, смотрите документацию для prepare.

Чтобы просто включить проверку ошибок везде, установите RaiseError в конструкторе:

DBI->connect("dbi:SQLite:dbname=".setting('database'), undef, undef, {RaiseError => 1}) …
...