У меня есть эта система входа. Формы отображаются, но прямо на index.php прямо при входе в систему с неправильными учетными данными. Нет сообщения об ошибке... ничего. Кто-нибудь знает, почему это происходит?
Вот мой код:
<?php
session_start();
if(isset($_POST['login'])) {
include_once("db.php");
$username = strip_tags($_POST['username']);
$password = strip_tags($_POST['password']);
$username = stripslashes($username);
$password = stripslashes($password);
$username = mysqli_real_escape_string($db, $username);
$password = mysqli_real_escape_string($db, $password);
$password = md5($password);
$sql = "SELECT * FROM users WHERE username='$username' LIMIT 1";
$query = mysqli_query($db, $sql);
$row = mysqli_fetch_array($query);
$id = $row['id'];
$db_password = $row['password'];
if($password == $db_password) {
$_SESSION['username'] = $username;
$_SESSION['id'] = $id;
header("Location: index.php");
} else {
echo "You didn't enter the correct details!";
}
}
?>
<html>
<head>
<title>Login</title>
</head>
<body>
<h1 style="font-family: Tahoma;">Login</h1>
<form action="index.php" method="post" enctype="multipart/form-data">
<input placeholder="Username" name="username" type="text" autofocus>
<input placeholder="Password" name="password" type="password">
<input name="login" type="submit" value="Login">
</form>
Является ли эта форма вашей страницей index.php? Действие формы - index.php, поэтому он отправляется на страницу индекса и никогда не запускает ваш код в POST. Удалите action="index.php"
из элемента формы, чтобы он помещался в текущий скрипт. Я предполагаю, что это отличается от того, как вы делаете 301 переадресацию при успешном входе в систему.
Несколько рекомендаций заключались бы в том, чтобы вывести exit()
после функции заголовка в перенаправление. Кроме того, вы можете установить переменную для ошибки формы и поместить ее в свою разметку. Вот обновленный скрипт:
<?php
session_start();
if(isset($_POST['login'])) {
include_once("db.php");
$username = strip_tags($_POST['username']);
$password = strip_tags($_POST['password']);
$username = stripslashes($username);
$password = stripslashes($password);
$username = mysqli_real_escape_string($db, $username);
$password = mysqli_real_escape_string($db, $password);
$password = md5($password);
$sql = "SELECT * FROM users WHERE username='$username' LIMIT 1";
$query = mysqli_query($db, $sql);
$row = mysqli_fetch_array($query);
$id = $row['id'];
$db_password = $row['password'];
if($password == $db_password) {
$_SESSION['username'] = $username;
$_SESSION['id'] = $id;
header("Location: index.php");
exit();
} else {
$error = "You didn't enter the correct details!";
}
}
?>
<html>
<head>
<title>Login</title>
</head>
<body>
<h1 style="font-family: Tahoma;">Login</h1>
<?php if (!empty($error)) echo '<div class="login-error">' . $error . '</div>'; ?>
<form method="post" enctype="multipart/form-data">
<input placeholder="Username" name="username" type="text" autofocus>
<input placeholder="Password" name="password" type="password">
<input name="login" type="submit" value="Login">
</form>
Надеюсь, это поможет!
Я также рекомендовал бы использовать драйвер PDO для MySQLi. Это может действительно помочь предотвратить внедрение SQL, особенно если вы изучаете и планируете развертывание в производственной среде.