Подготовленные заявления и mysqli_query / mysqli_num_rows?

1

Я пытаюсь выяснить, как заставить мой код работать с подготовленными операторами. Я понял весь процесс до того места, где я прокомментировал свой код. Что мне нужно сделать для правильной интеграции num_rows и части mysqli_query?

function login_check() {

    global $connection;

    $name = $_POST['name'];
    $password = $_POST['password'];

    $query = "SELECT id FROM members WHERE name = $name AND password = $password";
    $stmt = $connection->prepare($query);
    $stmt->bind_param('ss', $name, $password); 
    $stmt->execute();
    $stmt->close();

    // $result = mysqli_query($connection, $query);
    // $rows = mysqli_num_rows($result);

    if($rows > 0){
        header('location:../../success.php');
        exit;
    }

    else {
        header('location:../../failed.php');
        exit;
    }
}

То, что я пробовал:

$result = mysqli_query($connection, $stmt);
$rows = mysqli_num_rows($result);
Теги:

1 ответ

4
Лучший ответ

+ Изменить

$query = "SELECT id FROM members WHERE name = $name AND password = $password";

в

$query = "SELECT 'id' FROM 'members' WHERE 'name' = ? AND 'password' = ?";

Добавление backticks вокруг таблицы и столбцов предотвращает ошибку зарезервированных слов mysql.

Удалить $stmt->close();

if( $stmt->num_rows > 0 ) {
    $stmt->close();
    header('location:../../success.php');
    exit();
} else {
    $stmt->close();
    header('location:../../failed.php');
    exit();
}

Добавление $stmt->close() внутри if, если утверждение перед заголовком - лучшая практика в этом случае. Becasue добавляет его раньше, если инструкция приведет к $stmt->num_rows всегда возвращает 0; Добавляя его после того, как stat не будет работать, потому что exit() будет префанировать его выполнение.

Из документации:

Закрывает подготовленное выражение. mysqli_stmt_close() также освобождает дескриптор инструкции. Если текущий оператор имеет ожидающие или непрочитанные результаты, эта функция отменяет их, чтобы можно было выполнить следующий запрос.

  • 0
    То есть вы хотите добавить его перед оператором if? закрыть тогда если? Спасибо за часть документации.
  • 0
    @ Asperger нет внутри лучше, потому что exit() предпочитает дальнейшее выполнение скрипта. Так что добавьте его ниже, если заявление не будет выполнено. И добавив его перед оператором if, мы бы предпочли, чтобы $stmt->num_rows имел результатов, поэтому он всегда будет возвращать 0.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню