Как работать с сессиями в php?

Добрый день,

Пишу небольшой проектик на чистом php, ранее не пробовал - использовал slim, laravel, bitrix, орм-ы всякие. И как-то не задумывался о работе сессий.

Сейчас делаю костыльную авторизацию (просто чтобы была). И наткнулся на проблему.

Я так понимаю, чтобы работать с сессиями, нужно прописать session_start()? А где это сделать? Я вставляю его перед



Так получается:
<?if(!$_SESSION)session_start();?>
<!DOCTYPE html>
<html>
<head>


Но вместо сессий получаю ошибки:
1) Undefined variable $_SESSION in /var/www/html/public/template/header.php
2) session_start(): Session cannot be started after headers have already been sent

Читать я умею, вижу, что пишет что заголовки уже были отправлены. Даже пробовал гуглить. Везде люди просто ставят session_start() в середину кода, им советуют перенести перед и у них сразу всё работает. У меня, как видите - не помогло)

Спасите пожалуйста)
  • Вопрос задан
  • 111 просмотров
Решения вопроса 1
vekov
@vekov Автор вопроса
Проблема была довольно таки наглядная. Заключалась в выводе ошибок и лишней проверке.

Использовал error_reporting(E_ERROR | E_PARSE);
Чтобы не выводились предупреждения о том, что переменная не определена.

А потом почитав немного еще доков по сессии, решил что проверка в общем-то лишняя. Оставил просто session_start(); Потому что она не только запускает новую сессию, но и продолжает существующую. Следовательно в доп проверке - нет смысла.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Aco
@Aco
Заклинатель кода
При запуске сессии выставляется кука (id сессии), которая передаётся в заголовке ответа. Поэтому сессия требует что бы заголовки не были отправлены. Можете выключить установку кук сессией
ini_set('session.use_cookies', '0');

Вообще не рекомендую использовать нативные сессии PHP, там много граблей. И на одну граблю уже наступили. Будут еще.
Ответ написан
iamdivine
@iamdivine
if (!isset($_SESSION)
session_start();

Но не советую так делать. Бестолковая проверка

Вообще сначала надо присвоить сессии значение, например после авторизации
if (isset($_POST['auth'])) {
    if($func->checkPassword($_POST['login'], $_POST['password'])) {
        $_SESSION[name] = $_POST['login'];
        header("Location: cp.php");
    }
    else
        $msg = "Не верный логин или пароль";
}

Тут у меня функция проверки пароля через password_verify
if($func->checkPassword($_POST['login'], $_POST['password'])) {

Соответственно после авторизации создастся сессия в которую записан login человека который ввел в форму свое имя
далее допустим создадим файл cp.php
И нам не надо чтобы без авторизации он зашел туда т.е. ставим проверку
if(!isset($_SESSION['name']) {
//Любые манипуляции если он не залогинен
//например кинем на login.php
header('Location: login.php')
}

isset - проверка на установленное значение переменной т.е. если ее не существует, то код в скобках работает
если все ок то можем дальше делать что хотим
У тебя проблема в том, что ты проверяешь массив $_SESSION хотя если ты не авторизован его нет + ты его не заполнил как заполнил я (name)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы