Perl CGI не работает sql должным образом - PullRequest
0 голосов
/ 10 декабря 2018

Я работаю над базовой страницей регистрации, но я не могу получить проверку имени пользователя для запуска или фактической вставки в базу данных.На этой странице я беру информацию, которую я передаю со своей html-страницы, и сначала проверяю, есть ли имя пользователя там.Если нет, я перенаправляю.В противном случае я вставляю значения в БД и перенаправляю на новую страницу.Вывод, который я получаю, таков: output

Я не могу найти реальную проблему в моем коде ..

    #!/usr/bin/perl 
#This is going to be the user login check and will set a cookie

use DBI;
use CGI qw(:standard);
print "Content-type: text/html\n\n"; #Tells website to print content

use strict;

#Connection error 
sub showErrorMsgAndExit {
    print header(), start_html(-title=>shift);
    print (shift);
    print end_html();
    exit;
}

#Connecting to the database
my $dbUsername = "root";
my $dbPassword = "password";

my $dsn = "DBI:mysql:f18final:localhost";
my $dbh = DBI->connect($dsn, $dbUsername, $dbPassword, {PrintError => 0});

#error checking
if(!$dbh) {
    print header(), start_html(-title=>"Error connecting to DB");
    print ("Unable to connec to the database");
    print end_html();
    exit;
}


print header;
print start_html(-title=>'Registration Page');

#Get the information the user entered
my $username = param('username');
my $password = param('password');
my $name = param('name');

#first sql check to see if username is already taken
my $check = "SELECT * from tblusers WHERE login = $username";
my $sth = $dbh->prepare($check);
$sth->execute();
if($sth->fetchrow_array) {
    print "<p>The user already exists. You will be redirected to register page in 5 seconds.</p>";
    print qq{<meta http-equiv="refresh" content = "5; url=/var/www/html/register.html"};
} else {
    #prepare to enter the content into the db
    my $sql  = "INSERT INTO tblusers(login, password, name) VALUES($username, $password, $name)";
    my $sth = $dbh->prepare($sql);
    $sth->execute();
    print "<p>Successfuly registered. You will be redirected to login in 5 seconds.</p>";
    print qq{<meta http-equiv="refresh" content = "5; url=/var/www/html/login.html"};
}


print end_html();
exit;

РЕДАКТИРОВАТЬ: AЕще несколько подробностей для поста. Я запустил chmod на register.cgi и сделал perl register.cgi, и это был выход.enter image description here HTML-файл состоит только из формы:

enter image description here

Моя таблица sql выглядит следующим образом.(Я добавил первую учетную запись вручную в MySQL Workbench) enter image description here

1 Ответ

0 голосов
/ 10 декабря 2018

Просто для суммирования комментариев икегами в одном ответе ...

У вас есть ошибки в ваших SQL-запросах.Строковые переменные должны быть заключены в кавычки при передаче в запросе.Это приведет к ошибке в базе данных, но вы не увидите ее, потому что вы не установили атрибут RaiseError на свой дескриптор, поверх которого вы отключили PrintError.

Включить управление ошибками при подключении к базе данных:

my $dbh = DBI->connect($dsn, $dbUsername, $dbPassword, {RaiseError => 1});

Чтобы избежать проблемы с цитированием и одновременно защитить код от внедрения SQL, используйте параметры связывания.

При поиске пользователя:

my $check = "SELECT * from tblusers WHERE login = ?";
my $sth = $dbh->prepare($check);
$sth->execute($username);

При создании нового пользователя:

my $sql  = "INSERT INTO tblusers(login, password, name) VALUES(?, ?, ?)";
my $sth = $dbh->prepare($sql);
$sth->execute($username, $password, $name);
...