SQL вставка / обновление завершается неудачно, не вызывает ошибок
Всем полдня,
В настоящее время я пытаюсь вставить или обновить значения полей формы через параметры в MySQL после некоторой простой проверки. Форма отправляет, но фактически не выполняет никаких операций и не вызывает синтаксиса или ошибки подключения к базе данных. Я знаю, что моя строка соединения работает, потому что я извлек значения из нее для сравнения в коде перед вложенными блоками оценки, показанными ниже. Циклы foreach были вставлены как альтернативное средство проверки того, что значения действительно были изменены в таблице. Ваша помощь, как всегда, ценится:
my $dbusr = param("dbuser");
my $dbpw = param("dbpass");
my $dbmail = param("dbemail");
my $dbtel = param("dbphone");
my $postflag = param("Submit");
if ($dbusr ne "") {
$sth = $dbh->prepare("SELECT * FROM USER WHERE username LIKE ?");
$sth->execute('$dbusr');
warn( $DBI::errstr ) if ( $DBI::err );
my @results = $sth->fetchall_arrayref();
foreach(@results){
if ($dbusr eq $_){
$loopval = 1;
}
}
unless($loopval){
$sth = $dbh->prepare("INSERT INTO USER
(username, password, phone, email)
values
(?,?,?,?)");
$sth->execute($dbusr, $dbpw, $dbtel, $dbmail);
warn( $DBI::errstr ) if ( $DBI::err );
$sth = $dbh->prepare("SELECT * FROM USER WHERE username LIKE ?");
$sth->execute('$dbusr');
@results = $sth->fetchall_arrayref();
foreach(@results){
if ($dbusr eq $_){
$successflag = 1;
}
}
}
else{
$sth = $dbh->prepare("UPDATE USER
SET (password = ?, phone = ?, email = ?)
WHERE username = ?");
$sth->execute($dbpw, $dbtel, $dbmail, $dbusr);
warn( $DBI::errstr ) if ( $DBI::err );
$sth = $dbh->prepare("SELECT * FROM USER WHERE username LIKE ?");
$sth->execute('$dbusr');
@results = $sth->fetchall_arrayref();
foreach(@results){
if ($dbusr eq $_){
$successflag = 1;
}
}
}
}
2 ответа
Базовый Perl: '
строки в кавычках НЕ интерполируют переменные:
$sth->execute('$dbusr');
^-- ^---
Вы буквально проходите мимо $
, d
, b
и т. д... на ваш запрос в качестве значения заполнителя.
Пытаться
$sth->execute($dbusr); // note the lack of ' quotes
вместо.
Вы ищете для всего rows
с SELECT * FROM USER WHERE username LIKE ?
оператор, а затем выбирает все строки за один раз с
my @results = $sth->fetchall_arrayref();
Этот метод "возвращает ссылку на массив, который содержит одну ссылку на строку"., но вы рассматриваете возвращенное значение как список имен пользователей:
foreach(@results){
if ($dbusr eq $_){
$loopval = 1;
}
}
Чтобы сделать эту работу, вы должны просто получить username
столбец и обрабатывать возвращенные строки как ссылки. И, как вы ищете точные совпадения в базе данных заменить LIKE
с =
:
$sth = $dbh->prepare("SELECT username FROM USER WHERE username = ?");
$sth->execute($dbusr); # no quoting
die( $DBI::errstr ) if ( $DBI::err ); # what else to do if the execute fails?
my $results = $sth->fetchall_arrayref(); # an arrayref is returned
foreach(@$results){ # de-reference the array
if ($dbusr eq $_->[0]){ # each row is an arrayref, look in first element
$loopval = 1;
}
}
(Конечно, то же самое относится и ко второму поиску.)