Не удалось запустить сеанс. Я уже смотрел мой код за последние пару часов, и я не могу понять, что с ним не так. Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда я ввожу имя пользователя и пароль, он просто перенаправляет меня на страницу входа, чтобы снова ввести информацию, когда она должна отображать securepage.php ..
Вот мой код:
loginproc.php page – Эта страница выполняет инструкции if и переходит прямо в другое
<?php // Inialize session session_start(); // Include database connection settings include('../../model/database.php'); // Retrieve username and password from database according to user's input $login = mysql_query("SELECT * FROM user WHERE (username = '" . mysql_real_escape_string($_POST['username']) . "') and (password = '" . mysql_real_escape_string($_POST['password']) . "')"); // Check username and password match if (mysql_num_rows($login) == 1) { // Set username session variable $_SESSION['username'] = $_POST['username']; // Jump to secured page header('Location: securedpage.php'); } else { // Jump to login page header('Location: index.php'); } ?>
Страница securepage.php
<?php // Inialize session session_start(); // Check, if username session is NOT set then this page will jump to login page if (!isset($_SESSION['username'])) { header('Location: index.php'); } ?> <html> <head> <title>Secured Page</title> </head> <body> <p>This is secured page with session: <b><?php echo $_SESSION['username']; ?></b> <br>You can put your restricted information here.</p> <p><a href="logout.php">Logout</a></p> </body> </html>
database.php страница
<?php $dsn = 'mysql:host=localhost;dbname=sports_db'; $username = ''; $password = ''; $options = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION); try { $db = new PDO($dsn, $username, $password, $options); } catch (PDOException $e) { $error_message = $e->getMessage(); include 'errors/db_error_connect.php'; exit; } function display_db_error($error_message) { global $app_path; include 'errors/db_error.php'; exit; } ?>
Вы не можете смешивать PDO и mysql. Вы создаете запрос в PDO
и используете mysql_*
Попробуйте изменить свой код на
<?php // Inialize session session_start(); // Include database connection settings include('../../model/database.php'); // Retrieve username and password from database according to user's input $stmt = $db->prepare("SELECT * FROM user WHERE (`username` = :username) and (`password` = :password)"); $result = $stmt->execute(array(':username'=>$_POST['username'],':password'=>$_POST['password'])); $num_rows = $stmt->rowCount(); // Check username and password match if ( $num_rows > 0) { // Set username session variable $_SESSION['username'] = $_POST['username']; // Jump to secured page header('Location: securedpage.php'); } else { // Jump to login page header('Location: index.php'); } ?>
в<?php // Inialize session session_start(); // Include database connection settings include('../../model/database.php'); // Retrieve username and password from database according to user's input $stmt = $db->prepare("SELECT * FROM user WHERE (`username` = :username) and (`password` = :password)"); $result = $stmt->execute(array(':username'=>$_POST['username'],':password'=>$_POST['password'])); $num_rows = $stmt->rowCount(); // Check username and password match if ( $num_rows > 0) { // Set username session variable $_SESSION['username'] = $_POST['username']; // Jump to secured page header('Location: securedpage.php'); } else { // Jump to login page header('Location: index.php'); } ?>
см. reference
Вероятно, проблема здесь:
if (mysql_num_rows ($ login) == 1) {
Используйте тройное уравнение, если вы хотите проверить целое число 1. Скорее всего, это связано с тем, что логин / провал не удается.
И это:
$ _SESSION ['username'] = $ _POST ['username'];
это плохая практика, даже если вы получите действительный ответ.
У меня есть для вас предложение:
1) Не храните данные, предоставленные пользователем, непосредственно в вашей переменной сеанса.
2) Сначала проверьте, существует ли учетная запись пользователя в вашей таблице, выберите соответствующую строку и затем сохраните полученные данные в переменной сеанса.