Я пытаюсь выяснить, как заставить мой код работать с подготовленными операторами. Я понял весь процесс до того места, где я прокомментировал свой код. Что мне нужно сделать для правильной интеграции 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);
+ Изменить
$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() также освобождает дескриптор инструкции. Если текущий оператор имеет ожидающие или непрочитанные результаты, эта функция отменяет их, чтобы можно было выполнить следующий запрос.
exit()
предпочитает дальнейшее выполнение скрипта. Так что добавьте его ниже, если заявление не будет выполнено. И добавив его перед оператором if, мы бы предпочли, чтобы$stmt->num_rows
имел результатов, поэтому он всегда будет возвращать 0.