Обновите строку БД с помощью Perl CGI - PullRequest
0 голосов
/ 13 декабря 2018

Я пытаюсь обновить свою таблицу sql новыми значениями, введенными пользователем.По какой-то причине команда sql не обновляет мою базу данных.Я получаю правильные значения, которые я проверил.Вот мой код

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

use DBI;
use CGI qw(:standard);

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=>'Add Classes');

#Get the information the user entered
my $id = param('classid');
my $className = param('classname');
my $department = param('department');
my $classnum = param('classnum');
my $grade = param('grade');
my $credits = param('credit');
print "$id $className, $department, $classnum, $grade, $credits";
#first sql check to see if username is already taken
my $check = "UPDATE tblclasses(classname, department, classnum, grade, credits) VALUES (?, ?, ?, ?, ?) WHERE classID = $id";
my $sth = $dbh->prepare($check);
$sth->execute($className, $department, $classnum, $grade,$credits);
print "<h1>Success</h1>";
print "<form action=http://localhost/cgi-bin/edit.pl method = 'post'>";
print "<input type = 'submit' name = 'submit' value = 'Update Another'>";
print "</form>";
print "<form action=http://localhost/cgi-bin/actions.pl method = 'post'>";
print "<input type = 'submit' name = 'submit' value = 'Back to actions'>";
print "</form>";


print end_html();
exit;

Когда я пытаюсь запустить команду sql в инструментальной среде mysql, она успешно обновляет строку.В чем моя проблема?

Ответы [ 2 ]

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

В синтаксисе вашего оператора SQL есть ошибка:

UPDATE tblclasses(classname, department, classnum, grade, credits) 
VALUES (?, ?, ?, ?, ?)
WHERE classID = $id

Должно быть написано:

UPDATE tblclasses
SET classname = ?, 
       department = ?,
       classnum = ?,
       grade = ?,
       credits = ?
WHERE classID = ?

См. документы mysql .

Дополнительные примечания (как прокомментировал также @Grinnz):

  • вы всегда должны «использовать строгий»

  • вы должны установить DBIатрибут «RaiseError» равен 1 в вашей базе данных или дескрипторе (ах) оператора;следовательно, все ошибки DBI становятся фатальными;отключение «RaiseError» и «PrintErrror» приводит к тому, что DBI не умирает от ошибок и не сообщает о них, поэтому необходимо вручную проверять код возврата каждого вызова DBI, чтобы убедиться в его работоспособности - см. Документы DBI * 1020.*

  • вы должны привязать все переменные в вашем операторе SQL к аннулированию SQL-инъекции (вы не привязали $ id, я изменил это в приведенном выше запросе)

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

Не зная СУБД, я не могу быть уверен на 100%, но похоже, что вы смешали синтаксис для вставки и команды обновления.Правильный синтаксис для обновления должен быть следующим:

UPDATE tblclasses
set
  classname = ?,
  department = ?,
  classum = ?,
  grade = ?,
  credits = ?
WHERE classID = $id

Кроме того, для чего бы это ни стоило, вы также должны иметь возможность передавать переменную $id в качестве параметра, а не интерполировать ее.Теоретически это будет лучше для базы данных, так как она будет компилироваться один раз и выполнять один и тот же оператор SQL снова и снова, только с разными значениями переменной связывания:

my $check = qq{
  UPDATE tblclasses
  set
    classname = ?,
    department = ?,
    classum = ?,
    grade = ?,
    credits = ?
  WHERE classID = ?
};

my $sth = $dbh->prepare($check);
$sth->execute($className, $department, $classnum, $grade,$credits, $id);
...