Не срабатывает аутентификация

243
22 июня 2017, 06:35

Привет всем! Помогите пожалуйста найти ошибку.

При аутентификации как видно из кода должны присваиваться значения глобальной переменной $_SESSION и происходить редирект на другую страницу. Но почему-то ничего не происходит.

init.php

<?php
error_reporting(-1);
ini_set('display_errors','On');
use Parsclick\Sessions\PersistentSessionHandler;
require_once '../vendor/autoload.php';
require_once __DIR__ . '/db_connect.php';
$handler = new PersistentSessionHandler($db);
session_set_save_handler($handler);
session_start();
$_SESSION['active'] = time();

login.php

<?php
require_once './includes/init.php';
if (isset($_POST['login'])) {
    $username = trim($_POST['username']);
    $pwd = trim($_POST['pwd']);
    $stmt = $db->prepare('SELECT pwd FROM `users` WHERE username = :username');
    $stmt->bindParam(':username', $username);
    $stmt->execute();
    $stored = $stmt->fetchColumn();
    if (password_verify($pwd, $stored)) {
        session_regenerate_id(true);
        $_SESSION['username'] = $username;
        $_SESSION['authenticated'] = true;
        if (isset($_POST['remember'])) {
            // create persistent login
            $autologin = new AutoLogin($db);
            $autologin->persistentLogin();
        }
        header('Location: restricted1.php');
        exit;
    } else {
        $error = 'Login failed. Check username and password.';
    }
}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Auto Login</title>
</head>
<body>
<h1>Persistent Login</h1>
<?php
if (isset($error)) {
    echo "<p>$error</p>";
}
?>
<form action="<?= $_SERVER['PHP_SELF']; ?>" method="post">
    <p>
        <label for="username">Username:</label>
        <input type="text" name="username" id="username">
    </p>
    <p>
        <label for="pwd">Password:</label>
        <input type="password" name="pwd" id="pwd">
    </p>
    <p>
        <input type="checkbox" name="remember" id="remember">
        <label for="remember">Remember me </label>
    </p>
    <p>
        <input type="submit" name="login" id="login" value="Log In">
    </p>
</form>
</body>
</html>

А просто страница login.php выдает 3 таких ошибки по отношению к трем свойствам

Strict standards: Parsclick\Sessions\MysqlSessionHandler and Parsclick\Sessions\PersistentProperties define the same property ($table_sess) in the composition of Parsclick\Sessions\PersistentSessionHandler. This might be incompatible, to improve maintainability consider using accessor methods in traits instead. Class was composed in /path/to/project/test.loc/Parsclick/Sessions/PersistentSessionHandler.php on line 65

и 2 ошибки по отношению к сессиям

Warning: session_start(): Cannot send session cookie - headers already sent by (output started at /path/to/project/test.loc/Parsclick/Sessions/PersistentSessionHandler.php:65) in /path/to/project/test.loc/test/includes/init.php on line 11

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /path/to/project/test.loc/Parsclick/Sessions/PersistentSessionHandler.php:65) in /path/to/project/test.loc/test/includes/init.php on line 11

Answer 1

По порядку.

В сообщениях, которые касаются login.php - вам там вполне понятно объясняют, что у вас в классах, которые вы используете, переопределяется свойство $table_sess - это позволительно, но в целом неверно. Найдите, где и в каких классах оно у вас объявлено, и оставьте только в одном из них, либо назовите его иначе в одном из классов, если хранимое там значение на самом деле обозначает не одно и то же.

В сообщениях, которые касаются сессий, вам точно также пишут, что все, касаемое заголовков http-ответа, должно быть передано до вывода тела ответа. Если по-русски, то то, что ваш браузер получает в headers (не путать с тегами head/header в html), веб-сервер должен отправить до того, как отправить собственно тело ответа, то есть в вашем случае это саму html-страницу, а точнее - сделать первый вывод чего бы то ни было, например вывести что-либо через echo или просто закрыть тег <?php ?> и напечатать после него какой-либо текст.

Если взять это за правило и выводить все, что должно быть в хедерах (а это и про сессии, и про кеширование, которые у вас упомянуты в ошибках), то все будет работать верно.

READ ALSO
yii2 проблемы с установкой

yii2 проблемы с установкой

Установил Composer, обновил его, установил yii2, перехожу в браузер для проверки,а вместо "приветствия" выдает следующие ошибки :

268
Как вывести только уникальные метки wordpress?

Как вывести только уникальные метки wordpress?

Как вывести только уникальные метки wordpress?

221
OneSignal отправить уведомление через php

OneSignal отправить уведомление через php

Этот код отправляет на устройство c идентификатором ids пуш уведомление

280
php формирование json для yandex карт

php формирование json для yandex карт

Не получается сформировать json из php:

341