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;
    }
}

(Конечно, то же самое относится и ко второму поиску.)

Другие вопросы по тегам