Этот урок набрал набрал достаточно большое количество комментариев и дальнейшее его комментирование отключено. Если вы хотели убедиться в правильности выполнения ДЗ или у вас возник вопрос по уроку, посмотрите ранее добавленные комментарии, кликнув по кнопке ниже. Скорее всего вы найдете там то, что искали. Если это не помогло - задайте вопрос в чате в телеграме - https://t.me/php_zone
fantasyz 31.03.2018 в 02:37

удаление

if (!empty($_COOKIE)) {
    setcookie('login', $login, -10, '/');
    setcookie('password', $password, -10, '/');
    header('Location: /cookie/index.php');
}

проверка

if (!empty($_COOKIE)) {
    header('Location: /cookie/index.php');
}
ivashkevich 31.03.2018 в 13:40

Хорошо, всё норм. Только для удаления cookie можно в качестве значения вообще передать пустую строку:

setcookie('login', '', -10, '/');
[email protected] 06.11.2020 в 21:45

Откуда у Вас берётся адрес header('Location: /cookie/index.php') у меня там пустота.

ivashkevich 08.11.2020 в 15:03

где там?

[email protected] 08.11.2020 в 15:48

if (!empty($_COOKIE)) {
header('Location: /cookie/index.php');
}
пусто в папке cookie

ivashkevich 08.11.2020 в 15:53

Ну это конкретно этот ученик видимо положил все свои файлы этого урока в папку cookie. В уроке мы ее не создавали. У вас будут другие пути.

ivashkevich 03.04.2018 в 18:49

А нет, не норм. Проверка проверяет только наличие cookie. При этом не гарантируется, что пользователь авторизован.

fantasyz 03.04.2018 в 21:29
if (!empty($_COOKIE['login'] && $_COOKIE['password'])) {
    header('Location: /cookie/index.php');
} 

вот так по идее гарантируется

ivashkevich 04.04.2018 в 19:11

Нет, так гарантируется только то, что в cookie есть какие-то данные, но не гарантируется, что эти данные принадлежат какому-то пользователю.

В общем, нужно попытаться их использовать для логина, и если логин успешен, то тогда уже редиректить. Иначе - считать пользователя неавторизованным.

fantasyz 05.04.2018 в 00:46
require __DIR__ . '/auth.php';

if (!empty($_COOKIE)) {
    $login = $_COOKIE['login'];
    $password = $_COOKIE['password'];
    if (checkAuth($login, $password)) {
        header('Location: /cookie/index.php');
    }
}
ivashkevich 05.04.2018 в 06:12

Вот, теперь логика правильная. Единственное что не учли - в cookie может что-то лежать, но не будет ключей login и password. В таком случае будет warning.

Нужно предусмотреть такой кейс и в переменную login положить пустую строку, если $_COOKIE['login'] не существует:

$login = $_COOKIE['login'] ?? '';

С паролем аналогично.

fantasyz 05.04.2018 в 22:11

понял, с горем пополам осилил дз)), точнее с вашей помощью), спасибо большое!

ivashkevich 05.04.2018 в 22:17

Не за что. Главное, что вы пробуете. Это 99% успеха :)

[email protected] 06.11.2020 в 21:47

Ваш код сработал, дело в том, что у меня непонятно где /cookie/index.php, я поставил свой адрес и всё хорошо, спасибо.

1nSide 03.05.2018 в 12:24

logout.php

<?php

setcookie('login', '$login', -10, '/');
setcookie('password' , '$password', -10, '/');
header('location: indexCookie.php' );
1nSide 03.05.2018 в 12:25

Во втором задании уже была проверка

ivashkevich 04.05.2018 в 05:55

При простом переходе (без отправки POST-запроса) не будет у вас никакой проверки. Задание требует выполнения проверки при любом запросе.

1nSide 03.05.2018 в 12:41

а где пароли хешировать? это если пользователь вошел то сделать чтобы они хешировались?

ivashkevich 04.05.2018 в 07:29

Знаете, я переборщил с этим заданием. С последними двумя параграфами пока только ознакомьтесь (я их только что подправил). Усовершенствуем систему чуть позже.

[email protected] 12.05.2018 в 08:21
function getUserLogin(): ?string
{
    $loginFromCookie = $_COOKIE['login'] ?? '';
    $passwordFromCookie = $_COOKIE['password'] ?? '';

    if (checkAuth($loginFromCookie, $passwordFromCookie)) {
        return $loginFromCookie;
    }

    return null;
}

Пишет, что ошибка в ?string на знак ? указывает, почему?

ivashkevich 12.05.2018 в 09:51

Версия PHP 7.1? Если ниже - то не заработает.

[email protected] 12.05.2018 в 10:30

CTRL + ALT + S -> Languages & Frameworks -> PHP. Там выбрана 7.1, еще есть ниже версии и выше 7.2. Может 7.2 выбрать?

ivashkevich 12.05.2018 в 13:42

PhpStorm - это только редактор. Ошибка возникает во время выполнения скрипта, значит менять нужно версию интерпретатора. Если Вы всё делаете по урокам, то версию нужно менять в настройках OpenServer. Повторите уроки как работает PHP и установка и настройка OpenServer.

[email protected] 12.05.2018 в 14:05

Спасибо за ответ. Буду разбираться. И спасибо вам за ваши уроки! Отличные и реально быстро понимаешь, что да как)

ivashkevich 12.05.2018 в 15:11

Спасибо за отзыв) Удачи в прохождении)

[email protected] 12.05.2018 в 10:31
Parse error: syntax error, unexpected '?' in C:\OpenServer\OSPanel\domains\autorizacion.loc\www\auth.php on line 15

вот что пишет

Fox-24 14.08.2018 в 19:08

Спасибо за еще один урок!)

<?php

// Создайте страницу для разлогинивания - logout.php.
// При переходе на неё должны удаляться cookie с ключами login и password и выполняться редирект на главную страницу.
// В качестве ответа предоставьте полный код файла logout.php.

if (!empty($_COOKIE['login'])) {
    // Удаляем Cookie
    setcookie('login', $login, -10, '/');
    setcookie('password', $login, -10, '/');
    header('Location: /autorization/index.php');
}

У меня php 5.4, так что..)

//Сейчас при переходе авторизованного пользователя на страницу login.php открывается форма авторизации.
//Сделайте предварительную проверку того, что пользователь уже авторизован. И если он является авторизованным, перенаправляйте его на главную страницу.
// В качестве ответа на это задание предоставьте только код, который вы добавили в файл login.php.

if (!empty($_COOKIE)) {
    require __DIR__ . '/auth.php';
    if (isset($_COOKIE['login'])) {
        $login = $_COOKIE['login'];
    } else {
        // присваиваем $login значение '' если $_COOKIE['login'] равен NULL
        $login = '';
    }
    if (isset($_COOKIE['password'])) {
        $password = $_COOKIE['password'];
    } else {
        // присваиваем $password значение '' если $_COOKIE['password'] равен NULL
        $password = '';
    }

    $password = $_COOKIE['password'];
    if (checkAuth($login, $password)) {
        header('Location: /autorization/index.php');
    }
}
ivashkevich 14.08.2018 в 20:46
  1. Можно не проверять перед удалением кукисов:
    if (!empty($_COOKIE['login'])) {
  2. Вот эта строка может накидать warning-ов (которая вне условия):
    $password = $_COOKIE['password'];
Fox-24 14.08.2018 в 22:00
  1. Да, спасибо:)
  2. Забыл почистить код..

    require __DIR__ . '/auth.php';
    if (isset($_COOKIE['login'])) {
        $login = $_COOKIE['login'];
    } else {
        // присваиваем $login значение '' если $_COOKIE['login'] равен NULL
        $login = '';
    }
    if (isset($_COOKIE['password'])) {
        $password = $_COOKIE['password'];
    } else {
        // присваиваем $password значение '' если $_COOKIE['password'] равен NULL
        $password = '';
    }

    if (checkAuth($login, $password)) {
        header('Location: /autorization/index.php');
    }
ivashkevich 16.08.2018 в 21:45

Отлично

dom1r 18.08.2018 в 16:35

В комментариях уже прочитал, что проверку куки можно опустить и в принципе unset тоже, но:

<?php
//logout.php
if (isset($_COOKIE['login'])) {
    unset($_COOKIE['login']);
    unset($_COOKIE['password']);
    setcookie('login', null, -1, '/');
    setcookie('password', null, -1, '/');
    header('Location: /index.php');
} else {
    return false;
}

Сначала просто проверял isset-ом далее редиректил, в комментариях вышел прочел, подправил:

//login.php
if (isset($_COOKIE['login']) && isset($_COOKIE['password'])) {
    require __DIR__ . '/auth.php';
    $login = $_COOKIE['login'];
    $password = $_COOKIE['password'];

    if (checkAuth($login, $password)) {
        header('Location: /index.php');
    }

}

Также не понятные языковые конструкции вроде этих:

function getUserLogin(): ?string

Понятно что возвращаемое значение должно быть строкой, но не понятен вопросительный знак.

Также и здесь:

$loginFromCookie = $_COOKIE['login'] ?? '';
ivashkevich 20.08.2018 в 23:09

Вот это бессмысленно:

    unset($_COOKIE['login']);
    unset($_COOKIE['password']);

Вопросительный знак означает, что помимо строки может вернуться null.

function getUserLogin(): ?string

?? - null coalescing operator. Если перед ним null - то вернет значение из правой части, иначе - значение слева.

$loginFromCookie = $_COOKIE['login'] ?? '';
[email protected] 29.10.2022 в 17:16

вторую заданию же мы уже делали

RusTaylor 30.08.2018 в 20:38
if (!empty($_COOKIE['login'] && !empty($_COOKIE['password']))){
        $login = $_COOKIE['login'];
        $password = $_COOKIE['password'];
        if (checkAuth($login,$password)){
            header('Location:/index.php');
        }
    }

У меня вот такая проверка куки получилась,только при переходе в login.php всё равно требует вводить пароль, хотя куки есть

ivashkevich 01.09.2018 в 13:35

Проверьте дебаггером, где ошибка.

RusTaylor 04.09.2018 в 20:36

В панели разработчика пишет что не даёт куки файлам вставить пароль и логин

ivashkevich 05.09.2018 в 23:25

Напиши в личку в ВК или Телеге.

ivashkevich 26.12.2018 в 23:44

Ниже Вам подсказали)

Bogdan 26.12.2018 в 16:14
if (!empty($_COOKIE['login'] && !empty($_COOKIE['password']))){

а здесь все ок? скобки правильно расставлены?

ivashkevich 26.12.2018 в 23:44

Именно здесь ошибка)

artemjeka 10.09.2018 в 15:39
  1. logout.php

    setcookie('login', '', -1, '/');
    setcookie('password', '', -1, '/');
    /**
    * У меня папка этого задания называется 23 в локальном сервере phpzone, то есть phpzone/23
    * по этому я сначала ставлю / после logout.php а потом поднимаюсь до дирректории повыше ../ и перехожу в index.php
    */
    header("Location: " . $_SERVER['REQUEST_URI'] . "/../index.php");
  2. В начале login.php добавил:

    require __DIR__ . '/auth.php';
    if (isset($_COOKIE['login']) && isset($_COOKIE['password'])) {
        if (checkAuth($_COOKIE['login'], $_COOKIE['password'])) {
            header('Location: ' . $_SERVER['REQUEST_URI'] . '/../index.php');
        }
    }

Сначала переписал на require_once потом понял, что там еще подключается usersDB и если там данные изменятся то не получится авторизоваться и исправил этот косяк за собой.

ivashkevich 10.09.2018 в 23:24

Можно просто Location: /index.php
И для первого и для второго случаев. А так - норм.

artemjeka 11.09.2018 в 16:58

Я забыл написать у меня локальный сервер phpzone а папка с заданием 23 и того phpzone/23/ по этому если я напишу "Location: /index.php" то перекинет на phpzone.

Benya 20.09.2018 в 21:11
<?php
setcookie('login', $login, time()-3600, '/');
setcookie('password', $password, time()-3600, '/');
header('Location: /index.php');
ivashkevich 22.09.2018 в 20:28

Норм!

Benya 22.09.2018 в 16:12
<?php
require __DIR__ . '/auth.php';
$login = getUserLogin();

if  ($login === null) {
    if (!empty($_POST)) {

        $login = $_POST['login'] ?? '';
        $password = $_POST['password'] ?? '';

        if (checkAuth($login, $password)) {
            setcookie('login', $login, 0, '/');
            setcookie('password', $password, 0, '/');
            header('Location: /index.php');
        } else {
            $error = 'Ошибка авторизации';
        }

    }
}else {
    header('Location: /index.php');
}
?>
ivashkevich 22.09.2018 в 20:29

Отлично!

SBTesla 26.09.2018 в 08:30
<?php
//проверяем переданны ли данные и подключаем файл авторизации
if (!empty($_POST)) {
     require __DIR__ . '/auth.php';

     //заносим переданые данные в переменные
     $login = $_COOKIE['login'] ?? '';
     $password = $_COOKIE['password'] ?? '';

     /*проверяем попали ли данные в куки и какие, устанавливаем
     время жизни и директорию*/
     if (checkAUth($login, $password)) {
          setcookie('login', $login, 0, '/');
          setcookie('password', $password, 0, '/');
          header('location: index.php');
     } else {
          $error = 'Ошибка Авторизации';
     }

}

?>

2

<?php
/* удаление cookie , устанавливаем время 
и направляем пользователя на главную страницу
*/
setcookie('login', $login, time() -3600, '/');
setcookie('password', $password, time()-3600, '/');
header('location: /index.php');
ivashkevich 27.09.2018 в 23:10
  1. нужно проверять не $_POST а $_COOKIE
  2. 100 секунд может не хватить, лучше сразу на час назад отбрасывать, если у пользователя косяки со временем
SBTesla 28.09.2018 в 09:13

Ага сори поправил,а 100 секунд посоветовали на стаке поставить сказали что ставить на час это костыли, вобще в идеале говорили про -1, но я не совсем понял про -1

ivashkevich 28.09.2018 в 09:18

Перечитайте домашку и посмотрите что вы делаете - проверяете наличие куки, а потом данные POST-запроса - это не имеет смысла.

antoxa 24.10.2018 в 08:50

Добрый день! Спасибо за урок, возник вопрос, ответь пожалуйста с точки зрения максимальной безопасности.
Сгенерировали auth_token, записали его в базу при входе на сайт и в куки к пользователю.
Дальше при повторном посещении сайта пользователем, сравниваем этот токен и если он совпадает с тем что в базе, логинем пользователя.
Допустим этот токен крадут, вставляют себе в куки и посещают сайт. Происходит логин уже поддельного пользователя.
Как должен выглядеть алгоритм правильно и безопасно чтоб даже если украдут куки не смогли войти?

ivashkevich 26.10.2018 в 08:52

Самый простой вариант - сохранять в базу еще и IP, для которого этот токен создавался. Но есть и более изощренные способы защиты. Стоит устанавливать на сайте SSL-сертификат и cookie передавать только по зашифрованному каналу. Еще стоит запретить куки для JS - всё это можно сделать с помощью setcookie - почитайте документацию по этой функции.

antoxa 26.10.2018 в 22:05

Спасибо за ответ.
Проверять IP будет плохо для пользователя, он может меняться.
Целый день гуглил сегодня)
В итоге вот к чему пришел: При логине через логин пароль, генерируем токен и пишем в куки и в базу, так же пишем user agent в базу.
При повторном заходе смотрим есть ли токен в куках, если есть, ищем такой в базе, если находим, то сравниваем user agent если все совпадает, то логинем пользователя, ставим переменную в сессию и обновляем токен.
++ как Вы сказали SSL и httponly в true.

Поправьте пожалуйста если что не так)

ivashkevich 26.10.2018 в 22:10

В целом - лучше. Но вообще - если будут красть куки, то подделать UserAgent - вообще не проблема. Потому что куки всегда крадутся через какой-нибудь сторонний ресурс, получить на этом ресурсе юзерагент - вообще не проблема. Продвинутые защищенные системы могут строиться на совокупности сразу нескольких характеристик - UserAgent, расширение экрана, язык и версия системы, IP, и еще куча всего.

antoxa 27.10.2018 в 09:00

Тут смысл в том что при логине пользователя токен поменяется.
И куками можно воспользоваться пока токен не поменялся.
Плюс на сколько я понял при использовании SSL куки можно украсть только в зашифрованном виде, верно?

ivashkevich 27.10.2018 в 15:20

Нет. Украсть куки можно не только перехватом трафика между пользователем и сайтом. Есть XSS атаки. Если интересуетесь темой безопасности, можете прочитать вот эту вводную статью =)

CarfikDK 31.10.2018 в 12:24

1)

if(!empty($_COOKIE)) {
    setcookie('login', $login, 1, '/');
    setcookie('password', $password, 1, '/');
    header('Location: login.php');
}

2)

if(!empty($_COOKIE)){
    header('Location: index.php');
}
ivashkevich 01.11.2018 в 22:51
  1. Что будет, если я зайду на страничку логаута, не будучи залогиненным?
  2. Наличие куки еще не значит, что пользователь авторизован! Нужна нормальная проверка того, что в куки пришло.
stokato 05.11.2018 в 14:57

Создайте страницу для разлогинивания - logout.php. При переходе на неё должны удаляться cookie с ключами login и password и выполняться редирект на главную страницу. В качестве ответа предоставьте полный код файла logout.php.

<?php
setcookie('login','0',time() - 3600);
setcookie('password','0',time() - 3600);
header('Location: index.php');

Сейчас при переходе авторизованного пользователя на страницу login.php открывается форма авторизации. Сделайте предварительную проверку того, что пользователь уже авторизован. И если он является авторизованным, перенаправляйте его на главную страницу. В качестве ответа на это задание предоставьте только код, который вы добавили в файл login.php.

<?php
//Задание 2
if(!empty($_COOKIE['login']) && !empty($_COOKIE['password'])){
    header('Location: index.php');
}

if (!empty($_POST)) {
    require __DIR__ . '/auth.php';

    $login = $_POST['login'] ?? '';
    $password = $_POST['password'] ?? '';

    if (checkAuth($login, $password)) {
        setcookie('login', $login, 0, '/');
        setcookie('password', $password, 0, '/');
        header('Location: /index.php');
    } else {
        $error = 'Ошибка авторизации';
    }
}
?>
<html>
<head>
    <title>Форма авторизации</title>
</head>
<body>
<?php if (isset($error)): ?>
    <span style="color: red;">
    <?= $error ?>
</span>
<?php endif; ?>
<form action="/login.php" method="post">
    <label for="login">Имя пользователя: </label><input type="text" name="login" id="login">
    <br>
    <label for="password">Пароль: </label><input type="password" name="password" id="password">
    <br>
    <input type="submit" value="Войти">
</form>
</body>
</html>
ivashkevich 05.11.2018 в 21:44

Для заголовка Location лучше указывать абсолютный путь:

Location: /index.php

Так точно перенесет на index.php в корне сайта.

if(!empty($_COOKIE['login']) && !empty($_COOKIE['password'])){
    header('Location: index.php');
}

Наличие Cookie в браузере ещё не означает, что пользователь авторизован. Если они есть, нужно их еще проверить.

stokato 07.11.2018 в 07:56
if(!empty($_COOKIE['login']) && !empty($_COOKIE['password'])){
    if(checkAuth($_COOKIE['login'], $_COOKIE['password'])){
        header('Location: /index.php');
    }
}

Спасибо, поправил.

ivashkevich 08.11.2018 в 10:32

Хорошо. После отправки header-а location можно сразу завершить работу скрипта с помощью die().

virtual2018 21.11.2018 в 20:15

Неплохое задание, единственная претензия, что используются конструкции, которые хоть и имеют общую тему с уже пройденным материалом, но я думаю требуют некоторого акцента на них:
1) такая строка кода: function checkAuth(string $login, string $password): bool
начиная с версии PHP7 позволяет указать нам тип возвращаемого значения функции (аналогичны мы использовали типизацию входных данных при изучении функций). И по аналогии при использовании _declare(stricttypes=1) мы сможем включить строгую типизацию.
2) строка: function getUserLogin(): ?string как уже отвечал автор курса, указывает что возвращаемое значение может быть или строкой или NULL.
текст ссылки
3) строка: $loginFromCookie = $_COOKIE['login'] ?? '', это еще одно нововведение 7 версии,
можно назвать другой записью тернарного оператора, но более правильно Оператор объединения с null (null coalescing), логика простая - "Выражение (expr1) ?? (expr2) вычисляется так: expr2, если expr1 равен NULL и expr1 в противном случае"
текст ссылки
1 задание

<?php
setcookie('login', '', 0, '/');
setcookie('password', '', 0, '/');
header('Location: /index.php');

2 задание

if (!empty($_COOKIE)) {
    require __DIR__ . '/auth.php'; 
    if (isset($_COOKIE['login']) && isset($_COOKIE['password'])) {
        if (checkAuth($_COOKIE['login'], $_COOKIE['password'])) {
            header('Location: /index.php');
        }
    }
}
ivashkevich 22.11.2018 в 09:40

Отличное дополнение!

avansis1 23.11.2018 в 17:23

Ввожу верные логин/пароль - выдается следующая ошибка:
Parse error: syntax error, unexpected '?' in C:\OSPanel\domains\myproject.loc\www\auth.php on line 14

Памагите(

ivashkevich 24.11.2018 в 21:45

Переводить ошибку пробовали?

avansis1 25.11.2018 в 08:31

Да, уже решил, где то выше описание было)

[email protected] 03.12.2018 в 05:34
require __DIR__.'/authorization.php';
if (!empty($_COOKIE['login']) && !empty($_COOKIE['password']) &&
    checkInvUser($_COOKIE['login'], $_COOKIE['password']))
   {
    header('Location: /index.php');
   }
ivashkevich 03.12.2018 в 10:03

Правильно.

Bogdan 26.12.2018 в 16:01

Создайте страницу для разлогинивания - logout.php. При переходе на неё должны удаляться cookie с ключами login и password и выполняться редирект на главную страницу. В качестве ответа предоставьте полный код файла logout.php

setcookie('login', '', 1, '/');
setcookie('password', '', 1, '/');
header('Location: /index.php');

Сейчас при переходе авторизованного пользователя на страницу login.php открывается форма авторизации. Сделайте предварительную проверку того, что пользователь уже авторизован. И если он является авторизованным, перенаправляйте его на главную страницу. В качестве ответа на это задание предоставьте только код, который вы добавили в файл login.php.

if (isset($_COOKIE['login'])
        && isset($_COOKIE['password'])) {
        header('Location: /index.php');
    }
ivashkevich 26.12.2018 в 23:40
  1. ОК
  2. Наличие cookie в браузере еще не означает, что пользователь авторизован.
Bogdan 27.12.2018 в 20:11

на счет второго задания, где я мыслю не правильно. Как я видел задание. У нас есть страница авторизации, человек вводит свои данные, проходит авторизацию, куки с паролем и логином сохранились. Дальше он закрывает браузер заходит снова на нужный сайт, и я просто поднимаю его куки с паролем и логином, хотя вот тут коненчо можно повторную проверку запилить на совпадение пароля и логина с куки с теми что в базе... наверное вот эту проверку мне и стоило сделать)) Сам ответил на свой вопрос

ivashkevich 28.12.2018 в 21:09

Всё именно так)

N9PIX 30.01.2019 в 11:26

1)

<?php
if (empty($_POST)) {
    setcookie('login', $login, -10, '/');
    setcookie('password', $login, -10, '/');
    $login = $_COOKIE['login'] ?? '';
    $password = $_COOKIE['password'] ?? '';
    if (empty($_POST)) {
        header('Location: index.php');
    }
}

2) Не справился. Но разобрал код не буду кидать, взял с коментов
Иван, здесь вы подключаете версию 7.0, а для работы используется уже 7.1. (Методом тыка исправил ошибку с ?string)

ivashkevich 01.02.2019 в 23:40

Привет.
1) На страничке для разлогинивания не должно быть POST-запроса. Это простой GET-запрос. В качестве значений куки login и password стоит указать пустые строки, а не логин (зачем?). Кроме того, if с таким же условием внутри другого if - это бессмысленная проверка. Если выполнится первый, то и второй пройдет.
2) Хорошо, что разобрался. P.S. Меня зовут Артём)

excent63 30.01.2019 в 16:45

Добрый день! Спасибо за очередной урок:
1 задание:

<?php
require __DIR__ . '/auth.php';
if(isset($_COOKIE)) {
    $login = setcookie('login');
    $password = setcookie('password');
    header('location: /index.php');
}

В index:

<? if ($login !== null):?>
        Добро пожаловать, <?=$login?>!
            <form action="/logout.php" method="post">
                <input type="submit" value="Выйти">
            </form>
ivashkevich 01.02.2019 в 23:41

Привет. isset($_COOKIE) - не показывает того, авторизован ли пользователь.

excent63 02.02.2019 в 17:21

А так?
1
В logout.php

if(!empty($_COOKIE)) {
    $login = setcookie('login');
    $password = setcookie('password');
    header('location: /index.php');
}

2
Вверху login.php

if (!empty($_COOKIE['login']) && !empty($_COOKIE['password'])){
    header('location: /index.php');
}
ivashkevich 03.02.2019 в 23:44

Проверка empty и проверка наличия логина и пароля в cookie не означает, что пользователь авторизован. Это можно узнать, только сравнив эти значения с действительными логином и паролем.

Bugaga159 01.02.2019 в 20:52

Задание 1

setcookie('login', '');
setcookie('password', '');
header('Location: /index.php');

Задание 2

if(!empty($_COOKIE['login']) && !empty($_COOKIE['password'])){
    require __DIR__ . '/auth.php';
    $login = $_COOKIE['login'];
    $password = $_COOKIE['password'];
    if (checkAuth($login, $password)){
        header('Location: /index.php');
    }
}
ivashkevich 01.02.2019 в 23:42

ОК!

excent63 06.02.2019 в 20:23

Наконец то понял какую именно нужно проводить проверку. Вроде этот код отрабатывает как нужно , спасибо за разъяснение !!!

if (!empty($_COOKIE['login']) && !empty($_COOKIE['password'])){
        require __DIR__ . '/auth.php';
        $login = $_COOKIE['login'];
        $password = $_COOKIE['password'];
    if(checkAuth($login, $password)){
        header('location: /index.php');
    }
}
[email protected] 07.02.2019 в 21:40
<?php
    require __DIR__ .'/login.php';
    setcookie('login', '', 0, '/');
    setcookie('password', '', 0, '/');
    header('Location: /index.php');
?>
ivashkevich 07.02.2019 в 21:52

Чет не работает.

ivashkevich 07.02.2019 в 21:53

Никогда не изменяйте значения элементов служебных массивов!

Fellini 07.03.2019 в 17:43

Logout

<?php
setcookie('login', FALSE);
setcookie('password',FALSE);
header('Location: /index.php');

Checking if already logged in

<?php
require __DIR__.'/auth.php';
if (getUserLogin() !== null) {
    header ('Location: /index.php');
ivashkevich 09.03.2019 в 19:26

ОК!

[email protected] 11.03.2019 в 17:30

А можете дать код в файле auth.php для версии php 7.0 ? На php 7.2 текущий код работает, а вот на php 7.0 начинает "спотыкаться" об знак вопроса в коде (на 18 строчке в ваших исходниках).

[email protected] 11.03.2019 в 18:50

Или хотя бы подскажите, что значит строчка в auth.php:
function getUserLogin(): ?string
У вас в 9 уроке нашел справку только по такому синтаксису:
условие ? результат_если_true : результат_если_false
Но в вашем auth.php нет ни двоеточия между двумя результатами, ни самих двух результатов.

ivashkevich 11.03.2019 в 21:25

Это значит что тип возвращаемого значения либо string, либо null

[email protected] 11.03.2019 в 19:10

Нашел уже в комментариях, что значит "?". Это понятно. Теперь другой вопрос - можно ли код:
function getUserLogin(): ?string
реализовать по-другому, чтобы он работал и в PHP ранее PHP 7.1?

ivashkevich 11.03.2019 в 21:26

Можно убрать тип возвращаемого значения. Но вообще, используйте последнюю версию PHP.

[email protected] 12.03.2019 в 07:32

Да, действительно убрал "?string", оставил только "function getUserLogin()", все заработало. Ребят, всем у кого PHP ниже 7.1, выдает ошибку на "?" в файле auth.php, просто уберите "?string", ну и также уберите двоеточие после function getUserLogin(), будет работать.

ashfedor 11.03.2019 в 19:20
 первое
if (!empty($_COOKIE)) {
    require __DIR__ . '/auth.php';

    $login = $_COOKIE['login'] ?? '';
    $password = $_COOKIE['password'] ?? '';

    if (checkAuth($login, $password)) {
        setcookie('login', '', -10, '/');
        setcookie('password', '', -10, '/');
        header('Location: /index.php');
    }
} header('Location: /index.php');

второе
if (!empty($_COOKIE)) {
    require __DIR__ . '/auth.php';
    $login = $_COOKIE['login'] ?? '';
    $password = $_COOKIE['password'] ?? '';

    if (checkAuth($login, $password)) {
        header('Location: /index.php');
    }
}
ivashkevich 11.03.2019 в 21:27

Отлично

[email protected] 11.03.2019 в 19:25

logout.php

<?php

setcookie('login', '', -1, '/');
setcookie('password', '', -1, '/');
header('Location: index.php');

login.php

if (isset($_COOKIE['login']) && isset($_COOKIE['password'])) {
    if ($_COOKIE['login'] !== '' && $_COOKIE['password'] !== '') {
        header('Location: index.php');
    }
}
ivashkevich 11.03.2019 в 21:28

login: наличие куки с логином и паролем еще не означает, что пользователь авторизован (то есть что они валидные).

[email protected] 11.03.2019 в 21:30

А как проверить валидность?

ivashkevich 11.03.2019 в 21:35

У нас есть функция checkAuth

[email protected] 11.03.2019 в 19:29

И еще все-таки интересно есть ли где-нибудь в интернете справка по такому синтаксису:
function getUserLogin(): ?string
Я не нашел. А что "Вопросительный знак означает, что помимо строки может вернуться null" услышал только от Вас. А вы откуда такой информацией обладаете?

ivashkevich 11.03.2019 в 21:29
[email protected] 12.03.2019 в 07:34

Спасибо большое. Сам почему-то не нашел.

Grewi 21.03.2019 в 01:50

Первое задание:

require __DIR__.'/auth.php';
setcookie('login',"",time() - 3600,'/');
setcookie('password' ,"",time() - 3600,'/');
header('location:/index.php');

Во втором задании сделал так:

if (!empty($_COOKIE)) {
    require __DIR__ . '/auth.php';
    $log = $_COOKIE['login']??'';
    $pass = $_COOKIE['password']??'';

    if (checkAuth($log, $pass)) {
        $userYes = true;
    }
} else {
    $userYes = false;
}

По логике авторизованный пользователь не должен быть на этой странице, а уж если пришел, то форму авторизации можно скрыть условиями (как в index.php) и вывести ссылку с переходом на другую страницу или предложить разлогиниться.

<!doctype html>
<html lang="en">
<head>
    <title>Вход</title>
</head>
<body>
<?php if ($userYes === false): ?>
<form action="/login.php" method="post">
    <label for="login">Имя пользователя: </label><input type="text" name="login" id="login">
    </br></br>
    <label for="password">Пароль: </label><input type="text" name="password" id="password">
    </br></br>
    <input type="submit" value="Войти">
    <?php echo '</br></br>'.$error.' <a href="/logout.php">Сброс</a>'; ?>
</form>
<?php else: ?>
<p>Вы уже авторизованы </br></br> <a href="/">Перейти на главную</a> </br></br><a href="/logout.php">Выйти</a></p>
<?php endif; ?>
</body>
</html>
ivashkevich 23.03.2019 в 22:19

Красава.

XXX 24.03.2019 в 23:45

$loginFromCookie = $_COOKIE['login'] ?? ''; Что означают два вопросительных знака подряд?

XXX 25.03.2019 в 22:59

Сделал код как у Вас в уроке. Выбивают ошибку Parse error: syntax error, unexpected '?' in W:\domains\myproject.loc\www\auth.php on line 17.

После удаление знака вопроса в 17 строке кода выбивает следующую ошибку.

Fatal error: Uncaught TypeError: Return value of getUserLogin() must be of the type string, null returned in W:\domains\myproject.loc\www\auth.php on line 26
( ! ) TypeError: Return value of getUserLogin() must be of the type string, null returned in W:\domains\myproject.loc\www\auth.php on line 26
Call Stack
#   Time    Memory  Function    Location
1   0.0001  343664  {main}( )   ...\index.php:0
2   0.0003  344808  getUserLogin( ) ...\index.php:3
Dump $_SERVER
$_SERVER['REMOTE_ADDR'] =
string '127.0.0.1' (length=9)
$_SERVER['REQUEST_METHOD'] =
string 'GET' (length=3)
Dump $_SESSION
$_SESSION['*'] =
undefined
Dump $_REQUEST

После удаления типа стринг возращаемого значения функции в 17 строке все работает.

ivashkevich 27.03.2019 в 11:35

А зачем вы удалили знак вопроса, не разобравшись для чего он? =)
https://www.php.net/manual/ru/migration71.new-features.php

Boodoo 05.04.2019 в 18:23

logout.php

<?php
    $login = $_COOKIE['login'];
    $password = $_COOKIE['password'];

    setcookie('login', $login, time() - 10, '/');
    setcookie('password', $password, time() -10, '/');
    header('Location: /');

login.php

if(!empty($_COOKIE['login'])) {
        header('Location: /');
    }
ivashkevich 06.04.2019 в 11:41

Наличие логина в куки еще не означает, что пользователь авторизован. Он с помощью специальных расширений в браузере какие захочет может наставить.

Boodoo 06.04.2019 в 13:35

Еще пароль в проверку писать?

ivashkevich 06.04.2019 в 13:49

Наличие какого-то пароля в куках ещё не говорит о том, что логин и пароль верные, и пользователь действительно авторизован.

Boodoo 06.04.2019 в 14:15
if(!empty($_COOKIE['login']) && !empty($_COOKIE['password'])) {
        require __DIR__ . '/auth.php';
        $login = $_COOKIE['login'];
        $password = $_COOKIE['password'];
        if(checkAuth($login, $password)) {
            header('Location: /');
        }
    }
ivashkevich 06.04.2019 в 14:39

Правильно

Dram 24.04.2019 в 08:32

Ну и ладно, что убил на это целый день, зато решил :))

<?php

$array = require __DIR__ . '/usersDB.php';
$a = $_COOKIE['password'];
$b = $_COOKIE['login'];
foreach ($array as $password) {
    if ($password['password'] === $a && $password['login']===$b){

        header('Location: /index.php');
    }
}
ivashkevich 25.04.2019 в 07:42

Нужно проверить сначала, есть ли в $_COOKIE такой ключ, прежде чем использовать.

Dram 25.04.2019 в 07:44

Не совсем понял - в чем ошибка?

ivashkevich 25.04.2019 в 07:47

Если в массиве не будет одного из ключей, то при обращении по нему будет ошибка

Dram 25.04.2019 в 08:45

Все равно не понимаю вашу мысль.

  1. Мы проверяем валидность логина и пароля из куки. Если все ок - редирект на главную.
  2. Если логин или пароль не совпадают - просто предложение к авторизации остается.
    Я сейчас специально авторизовался и затем опять перешел на страницу логина - получил редирект. Тут же меняю логин в куке на заведомо неверный - иду на страницу логина и меня просят авторизоваться.
    Так в чем ошибка?

P.S. это же только верхняя часть всего кода файла логин....

ivashkevich 25.04.2019 в 11:46

Ещё раз говорю - при обращении к значению массива по несуществующему ключу будет ошибка.

Dram 25.04.2019 в 11:48

Приведите пожалуйста пример, ну не догоняю я :(

artemship 30.04.2019 в 13:17

Задание 1:

<?php
setcookie('login', '', time() - 3600, '/');
setcookie('password', '', time() - 3600, '/');
header('Location: /index.php');

Задание 2:

<?php
require __DIR__ . '/auth.php';
$login = getUserLogin();

if ($login !== null) {
    header('Location: /index.php');
} else {
    if (!empty($_POST)) {
        $login = $_POST['login'] ?? '';
        $password = $_POST['password'] ?? '';
        if (checkAuth($login, $password)) {
            setcookie('login', $login, 0, '/');
            setcookie('password', $password, 0, '/');
            header('Location: /index.php');
        } else {
            $error = 'Ошибка авторизации';
        }
    }
}
ivashkevich 30.04.2019 в 16:52

Отлично!

[email protected] 12.05.2019 в 13:26
if (!empty($_COOKIE)) {
      setcookie('login',$login,-10,'/');
      setcookie('password',$password,-10,'/');
      header('Location:/index.php');
  }
if (!empty($_COOKIE)) {
    header('Location: /index.php');
}
ivashkevich 12.05.2019 в 13:43

Наличие куки ещё не говорит о том, что пользователь авторизован.

[email protected] 12.05.2019 в 13:49

То есть мне надо писать если $-Cookie[login] = user то тогда перекидывать на главную ну и пароль так же или сравнивать с переменными $login и $password

ivashkevich 12.05.2019 в 15:03

У вас для этого есть готовая функция уже. Только перед ее вызовом нужно проверить, что в куках действительно есть эти значения.

[email protected] 12.05.2019 в 21:08
f (!empty($_COOKIE)) {
    require __DIR__ . '/auth.php';
    $login = $_COOKIE['login'];
    $password = $_COOKIE['password'];
    if (checkAuth($login,$password)) {
        header('Location: /index.php');
    }
}

долго думал но наконец до меня дошло как это сделать

ivashkevich 12.05.2019 в 23:42

Опять не проверяете массив на наличие ключей! Нельзя быть уверенным что здесь

$_COOKIE['login']

что-то есть. Рискуете нарваться на ошибку каждый раз. Устал уже писать об одном и том же.

[email protected] 13.05.2019 в 00:24

Всмысле? Я же проверяю если куки не пустой то пишу проверку логина и пароля

ivashkevich 13.05.2019 в 00:29

Нет проверки на то, что в массиве $_COOKIE вообще есть ключ login или password.

Moskva 02.06.2019 в 12:01

Разлогинивание:

if(!empty($_COOKIE)){
    setcookie('login', '',  - 1, '/');
    setcookie('password', '',  - 1, '/');
    header('Location:/index.php');
}

Проверка авторизации:

require __DIR__ . '/auth.php';
if(!empty($_COOKIE)){
    $login = $_COOKIE['login'] ?? '';
    $password = $_COOKIE['password'] ?? '';
    if(checkAuth($login, $password)){
        header('Location: /index.php');
    }
}
ivashkevich 03.06.2019 в 18:12

Про разлогинивание - наличие данных в куки, еще не означает, что пользователь авторизован. Мало ли, чего он там себе напихал в записи.

Moskva 26.06.2019 в 15:58

Значит просто их удалить?

<?php
    setcookie('login', '',  - 1, '/');
    setcookie('password', '',  - 1, '/');
    header('Location:/index.php');
?>
ivashkevich 27.06.2019 в 19:04

Нет. Это значит, что нужно убедиться, что он действительно авторизован.

esqrx 13.06.2019 в 03:59

//1


<?php

if (isset($_COOKIE)) {
    setcookie('login', $login, -1, '/');
    setcookie('password', $password, -1, '/');
    header('Location: /index.php');
} else {
    header('Location: /index.php');
}
ivashkevich 13.06.2019 в 19:41

(isset($_COOKIE)) - всегда вернёт true

esqrx 13.06.2019 в 04:26

//2

require __DIR__ . '/auth.php';
if (isset($_COOKIE)) {
    $login = $_COOKIE['login'] ?? '';
    $password = $_COOKIE['password'] ?? '';
    if (checkAuth($login, $password)) {
        header('Location: /index.php');
    }
}
ivashkevich 13.06.2019 в 19:41

Всё ок, кроме той же ошибки, что и выше

bratko 13.06.2019 в 13:21

У меня вопрос по данному коду:

<?php
require __DIR__ . '/auth.php';
$login = getUserLogin();
?>
<html>
<head>
    <title>Главная страница</title>
</head>
<body>
<?php if ($login === null): ?>
<a href="/login.php">Авторизуйтесь</a>
<?php else: ?>
Добро пожаловать, <?= $login ?>
<br>
<a href="/logout.php">Выйти</a>
<?php endif; ?>
</body>
</html>

Я не пойму, как в данном случае скрываются те или иные строки html, вот ты прописал:

<?php if ($login === null): ?>

и выводится именно это:

<a href="/login.php">Авторизуйтесь</a>

Мы же получается пишем обычный html код уже за пределами <?php ?> и как он улавливает данные условия?

bratko 13.06.2019 в 14:06

Просто я для себя представлял правильным примерно так:

<body>

<?php

if ($login === null){
    echo '<a href="/login.php">Авторизуйтесь</a>';
} else {
    echo 'Добро пожаловать' . $login . '<br>' . '<a href="/logout.php">Выйти</a>';
}

?>
</body>

и понимал как работает, а по твоему коду не совсем понял, но походу просто надо это запомнить и выучить что так тоже можно и всё?

ivashkevich 13.06.2019 в 19:44

Да. Так просто можно и это надо запомнить.

Bizzzon 11.07.2019 в 21:43

1

unset($_COOKIE);
header("Location: /login.php");

Файл logout.php
2

<?php
if (!empty($_POST)) {
    require __DIR__ . '/auth.php';
    $login = $_POST['login'] ?? '';
    $password = $_POST['password'] ?? '';
    if (checkAuth($login, $password)) {
        setcookie('login', $login, 0, '/');
        setcookie('password', $password, 0, '/');
        header('Location: /index.php');
    } else {
        $error = 'Ошибка авторизации';
    }
} else{
    header("Location /index.php");
}

?>
ivashkevich 12.07.2019 в 05:41
  1. Зачем все куки удалили? Нужно только login и password.
  2. Задание совсем другое. У вас страница логина не работает, просто отправляет на главную.
AlexxxEy 19.07.2019 в 01:17

Удаление

setcookie("login", $login, time()-3600);
setcookie("password", $password, time()-3600);
header('Location:/index2.php');

Проверка

require __DIR__ . '/auth.php';
if(!empty($_COOKIE['login']) && !empty($_COOKIE['password']))
{ if (checkAuth($_COOKIE['login'], $_COOKIE['password'])){
    header('Location:/index2.php');
}
}
ivashkevich 19.07.2019 в 07:02
  1. Для чего в качестве значений куки устанавливаются значения переменных?
kvakazuabr 23.07.2019 в 22:47
1
if (!empty($_COOKIE)) {
        require __DIR__ . '/auth.php';

        setcookie('login', $login, '/');
        setcookie('password', $password, '/');
        header('Location: /index.php');
    }
2
if(!isset($_COOKIE)) {
    require __DIR__ . '/auth.php';

    $login = $_COOKIE['login'] ?? '';
    $password = $_COOKIE['password'] ?? '';

    if(checkAuth($login, $password)) {
      header('Location: /index.php') ;
    }  
}
ivashkevich 24.07.2019 в 06:30
  1. Наличие cookie ещё не означает, что пользователь авторизован.
    require __DIR__ . '/auth.php';

    Файл для чего подключаете? Там ведь только функция.

        setcookie('login', $login, '/');
        setcookie('password', $password, '/');

    Откуда взяться переменным $login и $password? Будет ошибка.
    Бред полный.

  2. Вообще непонятно что. Читаем по строкам:
    if(!isset($_COOKIE)) {

    Если куки нет, то...

    $login = $_COOKIE['login'] ?? '';

    Пытаемся взять значение из куки.
    Бред! Переделывайте. Хоть бы проверили, что работает, перед тем как отправлять это сюда.

Blook 27.07.2019 в 10:13

Logout (Исправил код, убрав проверку на наличие кук в теге body)

<?php 
    require __DIR__ . '/auth.php';

    if (!empty($_COOKIE)) {
        $loginFromCookie = $_COOKIE['login'] ?? '';
        $passwordFromCookie = $_COOKIE['password'] ?? '';

        if(isAuth($loginFromCookie, $passwordFromCookie)) {
            setcookie('login', '', time() - 3600, '/');
            setcookie('password', '', time() - 3600, '/');
            header('Location: index.php');
        }
    }
?>
<html>
<head>
    <title>logout</title>
</head>
<body>
    <p>Вы не авторизованы.</p>
</body>
</html>    

login

if (!empty($_COOKIE)) {
    require __DIR__ . '/auth.php';
    $loginFromCookie = $_COOKIE['login'] ?? '';
    $passwordFromCookie = $_COOKIE['password'] ?? '';

    if(isAuth($loginFromCookie, $passwordFromCookie)) {
        header('Location: index.php');
    }
}
ivashkevich 27.07.2019 в 11:11
    <?php if(empty($_COOKIE)):?>
    <p>Вы не авторизованы.</p>
    <?php endif ?>

Пользователь может быть неавторизованным, даже если куки у него есть. Например, если данные в куках неправильные

Blook 28.07.2019 в 17:06

поправил

ivashkevich 28.07.2019 в 18:30

Супер!

[email protected] 13.08.2019 в 17:03

в logout.php

<?php

setcookie('login', '', time() - 1, '/');
setcookie('password', '', time() - 1, '/');
header('Location: /index.php');

?>

А в index.php если пользователь авторизован добавил ссылку на Logout.php

<?php if ($login != null): ?>
            Добро пожаловать, <?= $login ?>
            <br><br>
            <a href="/logout.php">Выйти</a>
        <?php else: ?>
            <a href="/login.php">Авторизуйтесь</a>
        <?php endif; ?>

Проверка:

if (!empty($_COOKIE)) {
    require __DIR__ . '/auth.php';
    $login = $_COOKIE['login'];
    $password = $_COOKIE['password'];
    if (checkAuth($login, $password)) {
        header('Location: /index.php');
    }
}
ivashkevich 13.08.2019 в 19:38

Отлично!

Vladimir96 31.08.2019 в 20:25
//Первое задание: logout.php
    setcookie('login', $_COOKIE['login'], time() - 1, '/');
    setcookie('login', $_COOKIE['password'], time() - 1, '/');
    header('Location: /index.php');
//Второе задание: login.php добавил в начало кода 
    $userIsAuthor = require __DIR__ . '/usersDB.php';

    $checkLogin = $_COOKIE['login'] ?? '';
    $checkPassword = $_COOKIE['password'] ?? '';

    foreach ($userIsAuthor as $value) {
        if ($checkLogin === $value['login'] && $checkPassword === $value['password']) {
            header('Location: /index.php');
        }
    }
ivashkevich 31.08.2019 в 21:08

На странице с логаутом не нужно проверять ничего. Сейчас у вас если туда незалогиненный пользователь зайдет, он там останется.
Во втором задании как раз надо проверять. Перечитайте задание и переделайте всё.

Vladimir96 01.09.2019 в 15:37

Первое задания исправил. Спасибо)
Второе задание не понял, что там поправлять?
Я действовал по такой логике:
1) Проверил наличие куки и вложил в переменную.
2) И если две эти переменные true, то перевожу на страницу index.php.

ivashkevich 02.09.2019 в 04:53

Во втором задании наличие куки ещё не означает что пользователь авторизован. Я могу прямо в хроме у себя любые куки насоздавать.

Vladimir96 02.09.2019 в 19:59

Поправил, посмотрите пожалуйста)

ivashkevich 02.09.2019 в 20:08

$userIsAuthor as $value - плохие имена переменных. Абсолютно не отражают того, что в них на самом деле хранится.

Vladimir96 02.09.2019 в 20:17

окей понял, кстати случайно обнаружил, что в logout.php все таки нужна проверка, иначе если пользователь нажимает правую кнопку мыши на ссылку рарзлогинивания в index.php, то может из выпадающего меню выбрать "Копировать адрес ссылки", вставить ссылку в браузер, перейти на logout.php и ему выдаст кучу ошибок, так как не было проверки.
Я оформил вот так, если пользователь не залогинен, то его перебросит на login.php

    $_COOKIE['login'] = $_COOKIE['login'] ?? '';
    $_COOKIE['password'] = $_COOKIE['password'] ?? '';

    setcookie('login', $_COOKIE['login'], time() - 1, '/');
    setcookie('login', $_COOKIE['password'], time() - 1, '/');
    header('Location: /index.php');
ivashkevich 02.09.2019 в 20:20

Так, стоп. Нафига туда текущее значение куки передавать? Для разлогинивания надо их убрать. Передав null, например.

Vladimir96 02.09.2019 в 20:22

туда это куда?

ivashkevich 02.09.2019 в 20:25
setcookie('login', $_COOKIE['login'], time() - 1, '/');

Для логаута. Передавать в куки в качестве значения текущее значение куки - ерунда какая-то. Передавай туда null.

Vladimir96 02.09.2019 в 20:30

нихера себе подробность)) теперь все сошлось, спасибо) я и понятия не имел, что можно null передать)

ivashkevich 02.09.2019 в 20:31

:)

Dreft 02.09.2019 в 16:52

Задача 1.

<?php
setcookie('login', '', time() - 30 * 24 * 60 * 60, '/');
setcookie('password', '', time() - 30 * 24 * 60 * 60, '/');
header('Location: /');

Задача 2.

<?php
require __DIR__ . '/auth.php';
if (!empty($_COOKIE['login']) && !empty($_COOKIE['password'])) {
    $login = $_COOKIE['login'];
    $password = $_COOKIE['password'];
    if (checkAuth($login, $password)) {
        header('Location: /index.php');
    }
}
if (!empty($_POST)) {
    $login = $_POST['login'] ?? '';
    $password = $_POST['password'] ?? '';
    if (checkAuth($login, $password)) {
        setcookie('login', $login, time() + 30 * 24 * 60 * 60, '/');
        setcookie('password', $password, time() + 30 * 24 * 60 * 60, '/');
        header('Location: /index.php');
    } else {
        $error = 'Ошибка авторизации';
    }
}
?>
ivashkevich 02.09.2019 в 18:50
  1. Что за -0?
  2. Если куки установлены, это ещё не означает что пользователь авторизован. Нужно так же проверить их на валидность.
Dreft 02.09.2019 в 19:02

Не понимаю, с чем их сравнивать.

ivashkevich 02.09.2019 в 19:10

В checkAuth передать

Dreft 02.09.2019 в 19:38

Все, доехал, поправил.

Я почему-то пытался вклинить проверку не туда.

ivashkevich 02.09.2019 в 20:05

Ок. Только вместо нуля нужно передавать какое-то нормальное значение. Иначе после закрытия браузера авторизация будет слетать.

Dreft 02.09.2019 в 20:12

Поправил.

ivashkevich 02.09.2019 в 20:13

Супер

XXX 07.09.2019 в 16:46
<?php
setcookie('login', '', -999, '/');
setcookie('password', '', -999, '/');
header('Location: /index.php');
require __DIR__.'/auth.php';
if(null !== (getUserLogin())){
    header('Location: /index.php ');
}
ivashkevich 09.09.2019 в 20:38

Ок, только (getUserLogin()) не нужно оборачивать в скобки. И Yoda condition я не одобряю.

AleksandrNenashev 07.09.2019 в 21:12

w меня ругается на знак ? в файле \auth.php on line 18 вот сама строка - function getUserLogin(): ?string. Если убираю ? то все работает нормально. Почему так происходит?

XXX 08.09.2019 в 17:28

Скорее всего ты используешь старую версию php

ivashkevich 09.09.2019 в 20:39

Нужна более новая версия php

AleksandrNenashev 07.09.2019 в 21:32
<?php
if (!empty($_COOKIE)) {
    require __DIR__ . '/auth.php';

    $login = $_COOKIE['login'] ?? '';
    $password = $_COOKIE['password'] ?? '';

    if (checkAuth($login, $password)) {
        header('Location: /index.php');
    }
}
?>
ivashkevich 09.09.2019 в 20:39

Ок

AleksandrNenashev 07.09.2019 в 21:34

Почему многие указывают в строках setcookie('login', $login, -10, '/'); число -10?

XXX 08.09.2019 в 17:28

Число не имеет значение. Если будет со знаком минус куки удалятся.

ivashkevich 09.09.2019 в 20:40

Посмотри официальную документацию.

AleksandrNenashev 08.09.2019 в 18:34

Значит мой ответ неправильный?

<?php
if (!empty($_COOKIE)) {
    require __DIR__ . '/auth.php';

    $login = $_COOKIE['login'] ?? '';
    $password = $_COOKIE['password'] ?? '';

    if (checkAuth($login, $password)) {
        header('Location: /login.php');
    }
}
?>
ivashkevich 09.09.2019 в 20:32

Если пользователь авторизован, то отправить его на страницу авторизации. Бред, конечно.

AleksandrNenashev 09.09.2019 в 23:44

Второй код был с изменениями просто не увидел. До него отправил правильный.

shrineofamana 10.09.2019 в 07:13

1 задание:

setcookie('login', null, -1, '/');
setcookie('password', null, -1, '/');
header('refresh: 1; url=index.php');

2 задание:

require_once __DIR__ . '/auth.php';
$login = $_COOKIE['login'] ?? '';
$password = $_COOKIE['password'] ?? '';
if (checkAuth($login, $password)) {
    header('location: /index.php');
}

Во втором задании столкнулся с несколькими ошибками, было интересно их решить и почитать заодно документацию.

ivashkevich 10.09.2019 в 12:58
if (checkAuth($login, $password)): {
    header('location: /index.php');
}
endif;

Это синтаксис для шаблонов. В коде его не используют.

shrineofamana 10.09.2019 в 13:06

Спасибо, исправлено.

ivashkevich 10.09.2019 в 20:45

В комментарии ничего не изменилось

Ooleg 17.09.2019 в 12:12

logout.php

<?php
setcookie('login', '', time() - 1, '/');
setcookie('password', '', time() -1, '/');
header('Location: /index.php');

добавил в login.php

require __DIR__ . '/auth.php';
$loginFromCookie = $_COOKIE['login'] ?? '';
$passwordFromCookie = $_COOKIE['password'] ?? '';

if (checkAuth($loginFromCookie, $passwordFromCookie)) {
    header('Location: /index.php');
}
ivashkevich 18.09.2019 в 17:41

Отлично

[email protected] 27.09.2019 в 12:52
 $login = $_POST['login'] ?? '';
    $password = $_POST['password'] ?? '';

Что за два вопроса после логина и пароля ?

dliashchenko 29.09.2019 в 23:23

logout.php

<?php
unset($_COOKIE['login'], $_COOKIE['password']);
setcookie('login', null, -1, '/');
setcookie('password', null, -1, '/');
header('location: /login.php');

login.php

<?
function redirectIndex() {
    header('Location: /index.php');
}

if (isset($_COOKIE['login'], $_COOKIE['password'])){
    redirectIndex();
}

Исправил на:

$loginFromCookie = $_COOKIE['login'] ?? '';
$passwordFromCookie = $_COOKIE['password'] ?? '';

if (checkAuth($loginFromCookie, $passwordFromCookie)){
    header('Location: /index.php');
}

вынес в начало login.php

<?
require __DIR__.'/auth.php';

из условия

if (!empty($_POST)){
   ...
}
ivashkevich 30.09.2019 в 00:39

Если куки установлены, это ещё не означает что пользователь авторизован. Нужно так же проверить их на валидность.

H3licoptero 06.10.2019 в 11:10
Первое задание.

if (!empty($_COOKIE['login']) && !empty($_COOKIE['password'])) {
    setcookie('login', '', time() -3600,'/');
    setcookie('password', '', time() -3600, '/');
    header('Location: /index.php');
}

Второе задание.

if (!empty($_COOKIE['login']) && !empty($_COOKIE['password'])) {
    require __DIR__ . '/auth.php';
    $login = $_COOKIE['login'];
    $password = $_COOKIE['password'];
    if (checkAuth($login, $password)) {
        header('Location: /index.php');
    }
}
ivashkevich 06.10.2019 в 11:17

Супер

Death4el 07.10.2019 в 12:22

От нечего делать добавил кнопку регистрации,защита от повторного ника,защита от пасса<5 символов,переписал БД на текстовик(ибо пока не подходил к работе с бд,сори за ужасный код )

reg.php
<?php

if (!empty($_POST))
{
    $checker=true;
    $secondChecker=true;
    $newLogin = $_POST['newLogin'];
    $newPassword = $_POST['newPassword'];
    if(iconv_strlen($newPassword)<6)
    {
        $error = 'Пароль должен быть больше 5-ти символов!';
        $checker=false;
        $secondChecker=false;
    }

    $fp = fopen("bd.txt", "r");
    if (($fp) && ($secondChecker))
    {
        while (!feof($fp))
        {
            $mytext = fgets($fp, 999);
            $checkar = explode(" ", $mytext);
            $max=sizeof($checkar);
            for($i=0;$i<$max;$i++)
            {
                $check=explode(":",$checkar[$i]);
                if($check[0]==$newLogin)
                {
                    $error = 'Такой логин уже существует';
                    $checker=false;
                    break;

                }

            }
        }
    }
    fclose($fp);

    if($checker)
    {
        $fp = fopen("bd.txt", "a");
    $mytext = "{$newLogin}:{$newPassword} "; // Исходная строка
    $test = fwrite($fp, $mytext); // Запись в файл
    fclose($fp);
    setcookie('login', $newLogin, 0, '/');
    setcookie('password', $newPassword, 0, '/');
    header('Location: /indexlog.php');
    fclose($fp);
}
}

?>

<html>
<head>
    <title>Форма регистрации</title>
</head>
<body>
<?php if (isset($error)): ?>
    <span style="color: red;">
    <?= $error ?>
</span>
<?php endif; ?>
<form action="/reg.php" method="post">
    <label for="newLogin">Введите имя пользователя: </label><input type="text" name="newLogin" id="newLogin">
    <br>
    <label for="newPassword">Введите пароль: </label><input type="text" name="newPassword" id="newPassword">
    <br>
    <input type="submit" value="Регистрация">
</form>
<form action="/loginlog.php">
    <p><button name="">Я вспомнил!</button></p>
</form>
</body>
</html>

функция для парса в форме лог:пас с текстовика(в auth.php)
<?php
function checkAuth(string $login, string $password): bool
{
    $fp = fopen("bd.txt", "r");
    if ($fp)
    {
        while (!feof($fp))
        {
            $mytext = fgets($fp, 999);
            $checkar = explode(" ", $mytext);
            $max=sizeof($checkar);
            for($i=0;$i<$max;$i++)
            {
            $check=explode(":",$checkar[$i]);
            if(($check[0]==$login) && ($check[1]==$password))
            {
                return true;
            }

            }
        }
        }
    fclose($fp);
    return false;
}
ivashkevich 07.10.2019 в 16:21

Пойдет, молодец

Evilinside 18.10.2019 в 11:18

Здравствуйте. Не совсем понимаю почему в файле usersDB мы просто возвращаем массив? Почему не создать там переменную(массив) и не подключить файл уже в auth? И что означает в данном случае ? после функции getUserLogin(): ?string, да и ?? после

$loginFromCookie = $_COOKIE['login'] ?? '';
$passwordFromCookie = $_COOKIE['password'] ?? '';

Тоже не понятно, вроде нигде про это в курсе не говорилось, а тут бац и появляется. Тоже самое и про if():; else:; endif. Можно, конечно, нагуглить, но для меня это выбивается из всего курса. Мы используем те конструкции, которыми ниразу не пользовались в теме, которые даже не упоминались.
В общем, для меня весь урок в целом - это одно большое пятно.
Было всё по порядку: шли по тропинке небольшими шагами и вдруг решили перепрыгнуть на другую тропинку.

ivashkevich 18.10.2019 в 12:34
ivashkevich 18.10.2019 в 12:35

По вашему первому вопросу не понял в чем разница.

Evilinside 18.10.2019 в 12:38

Имел в виду, что значит "?" после функции перед string.
И для чего мы используем "??" после $passwordFromCookie

ivashkevich 18.10.2019 в 12:41

Я же написал вам ссылки. Прочитать странички по ним вместо вас?

Evilinside 18.10.2019 в 12:43

Пардон, случилось недопонимание.

ivashkevich 18.10.2019 в 14:20

Ок)

[email protected] 20.10.2019 в 19:09

Я правильно понимаю,что у нас и в базе хэш и в куках,как их тогда сравнивать?

ivashkevich 20.10.2019 в 20:56

В базе хранится хэш пароля. Он проверяется при отправке логина и пароля. То есть проверка происходит с открытым паролем. Если проверка пройдена, создаётся специальный токен. Он сохраняется и в базе, и в браузере пользователя. И при последующих запросах проверка уже происходит путем обычного сравнения этого токена из куки и значением в базе.

[email protected] 22.10.2019 в 21:56

Cпасибо за ответ,а то было ощущение что что-то упускаю) Вроде картина сложилась,а маленького кусочка не хватало)

sar16520 21.10.2019 в 13:38

1 задание

<?php
require __DIR__. '/usersDB.php';

if (!empty($_COOKIE)) {
    setcookie("login", $login, -10, '/');
    setcookie("pw", $pw, -10, '/');
    header('location: index.php');
} else {
    header('location: index.php');
}

2е задание

if(!empty($_COOKIE['login']) && !empty($_COOKIE['pw'])){
    header('location: index.php');
}
ivashkevich 21.10.2019 в 17:26

Наличие куки ещё не означает, что пользователь авторизован. Опять используются неопределенные переменные $login и $pw. И снова это приводит к ошибкам, но нет, вам же непонятно с первого раза что нужно включить показ ошибок. Разочаровали вы меня. Пока не разберётесь с показом нотисов дальше проверять не буду. Чем дальше тем хуже. Непонимание происходящего растет как снежный ком.

ivashkevich 22.10.2019 в 22:14

Если всё ещё не получается - напиши мне в личку в ВК или в телеге.

mavrito 26.10.2019 в 07:38

1)

<?php
    setcookie('login', '', time() -3600, '/');
    setcookie('password', '', time() -3600, '/');
    header('Location: ./index.php');

2)

if (!empty($_COOKIE)) {
    header('Location: ./index.php');
}

Буду благодарен за подсказки и попровки!

mavrito 26.10.2019 в 07:42

Посмотрел коммент выше, уже понял свою ошибку во втором задании :) пойду исправлять)

ivashkevich 26.10.2019 в 07:49

Хорошо) не торопитесь

mavrito 26.10.2019 в 07:52
if (!empty($_COOKIE['login']) && !empty($_COOKIE['password'])) {
    require __DIR__ . './auth.php';
    $login = $_COOKIE['login'];
    $password = $_COOKIE['password'];
    if (checkAuth($login, $password)){
        header('Location: ./index.php');
    }
}

Допер что нужно сделать проверку на валидность, исправил, все работает так же:)
Интересно все таки в чем же разница между моим первым решением и вторым. Для чего мы делаем проверку? У нас ведь в cookie после авторизации хранится только один login и один password, после выхода без проверки на валидность мы их удалили и cookie пуст. Можно пояснить разницу далеким?:)

[email protected] 01.11.2019 в 15:22

Что такое return [] ? Как бы массив, который будет сам себя возвращать ?

ivashkevich 02.11.2019 в 03:39

Идите по курсу, не забегайте вперёд. Массивы ничего не могут возвращать.х

[email protected] 01.11.2019 в 20:52

у меня ошибка: пишет заголовки уже отправлены

ivashkevich 02.11.2019 в 03:41

Значит где-то до передачи заголовков вы уже сделали вывод данных. Функция setcookie должна вызываться до echo.

andreskrip 16.11.2019 в 14:55
//страница logout.php
<?php
require __DIR__ . '/auth.php';

$login = $_COOKIE['login'] ?? '';
$password = $_COOKIE['password'] ?? '';

if (checkAuth($login, $password)) {
    setcookie('login', '', -10, '/');
    setcookie('password', '', -10, '/');
    header('Location: /index.php');
} else {
    echo 'Вы не были авторизованы' . '<br>';
    echo '<a href="/">Вернуться на главную</a>';
}
ivashkevich 17.11.2019 в 14:14

Отлично

andreskrip 16.11.2019 в 15:21

Решил продолжить условие из урока, где проверяются данные пришедшие через пост-запрос. Получается либо человек неавторизован и заходит туда с этой целью, и тогда идет проверка массива пост, либо же если пост-запрос пустой, проверяются куки на предмет авторизации и идет редирект на главную. Если где-то накосячил - поправьте в суждении)

<?php
//проверка авторизации в login.php
require __DIR__ . '/auth.php';
if (!empty($_POST)) {

    $login = $_POST['login'] ?? '';
    $password = $_POST['password'] ?? '';

    if (checkAuth($login, $password)) {
        setcookie('login', $login, 0, '/');
        setcookie('password', $password, 0, '/');
        header('Location: /index.php');
    } else {
        $error = 'Ошибка авторизации';
    }
} else {
    $login = $_COOKIE['login'] ?? '';
    $password = $_COOKIE['password'] ?? '';

    if (checkAuth($login, $password)) {
        header('Location: /index.php');
    }
}
?>
ivashkevich 17.11.2019 в 14:18

Всё правильно понял. Отлично!

Salexandr 30.12.2019 в 01:06

logout.php

<?php
setcookie('login', '', time() - 3600, '/');
setcookie('password', '', time() - 3600, '/');
header('location: /index.php');
ivashkevich 03.01.2020 в 03:44

Отлично

Salexandr 30.12.2019 в 01:09

редирект авторизованного пользователя с login.php (фрагмент)

<?php
require __DIR__ . '/auth.php';
if (!empty($_COOKIE)){
  $login = $_COOKIE['login'] ?? '';
  $password = $_COOKIE['password'] ?? '';
  if (checkAuth($login, $password)) {
    header ('location: /index.php');
  }
}
ivashkevich 03.01.2020 в 03:44

Отлично

YuraG 15.01.2020 в 08:12
//logout.php

<?php

$login = $_COOKIE['login']?? '';
$password = $_COOKIE['password']?? '';

if (!empty($login) && !empty($password)) {
    setcookie('login', '', 0, '/');
    setcookie('password', '', 0, '/');
}
header('Location: /cookie/avtorized/index.php');

//added code to the login.php
//перенес require с функции в начало
<?php

require __DIR__ . '/auth.php';

if (!empty(getUserLogin())) {
    header('Location: /cookie/avtorized/index.php');
}
ivashkevich 18.01.2020 в 05:57

Отлично

eNergy 15.01.2020 в 14:57

logout.php

<?php
    setcookie('login', '', 0, '/');
    setcookie('password', '', 0, '/');
    header('Location: /index.php');

login.php

<?php
    if ($_COOKIE['login']) {
        header('Location: /index.php');
    }
    if (!empty($_POST)) {
        require __DIR__ . '/auth.php';

        $login = $_POST['login'] ?? '';
        $password = $_POST['password'] ?? '';

        if (checkAuth($login, $password)) {
            setcookie('login', $login, 0, '/');
            setcookie('password', $password, 0, '/');
            header('Location: /index.php');
        } else {
            $error = 'Ошибка авторизации';
        }
    }
?>
<!DOCTYPE html>
<html>
<head>
    <title>Форма авторизации</title>
</head>
<body>
    <?php if (isset($error)): ?>
<span style="color: red;">
    <?= $error ?>
</span>
<?php endif; ?>
<form action="/login.php" method="post">
    <input type="text" name="login">
    <input type="password" name="password">
    <input type="submit" value="Войти">
</form>
</body>
</html>
ivashkevich 18.01.2020 в 06:09

Супер!

ChelovekAndrey 04.02.2020 в 23:15

//logout.php

setcookie('login', '' , 0, '/');
setcookie('password', '', 0, '/');
header('Location: /index.php');

//Проверка авторизации

if(isset($_COOKIE['login'],$_COOKIE['password'])){
    require __DIR__. '/auth.php';
    checkAuth($_COOKIE['login'],$_COOKIE['password'])?header('Location: /index.php'):'';
}
ivashkevich 11.02.2020 в 14:52

Тернарный оператор используется для возврата значения, а не для проверки условий. Переделайте на if

ChelovekAndrey 11.02.2020 в 22:44

Переделал

if(isset($_COOKIE['login'],$_COOKIE['password'])){
    require __DIR__. '/auth.php';
    if(checkAuth($_COOKIE['login'],$_COOKIE['password'])){
    header('Location: /index.php');
    }
}
ivashkevich 12.02.2020 в 13:10

Супер!

Fornit 22.02.2020 в 17:14
  1. Создайте страницу для разлогинивания - logout.php
    <?php
    function logoutAuth(){
    setcookie('login', '', time() - 10);
    setcookie('password', '', time() - 10);
    header("Location: /index.php");
    }
    logoutAuth();
    ?>
  2. Сделайте предварительную проверку того, что пользователь уже авторизован

    <?php
    if (!empty($_POST)){
    require __DIR__ . '/auth.php';
    
    $login = $_POST['login'];
    $password = $_POST['password'];
    
    if (checkAuth($login, $password)){
        setcookie('login', $login, 0, '/');
        setcookie('password', $password, 0, '/');
        header("Location: /index.php");
    } else{
        $error = 'Ошибка авторизации';
    }
    } else {
    require __DIR__ . '/auth.php';
    if (!(getUserLogin() === null)){
        $login = $_COOKIE['login'] ?? '';
        $password = $_COOKIE['password'] ?? '';
        header("Location: /index.php");
    }
    }
    ?>
ivashkevich 25.02.2020 в 07:30
  1. Для чего реализовали в виде функции?
  2. А если эти данные не пришли в запросе?
    $login = $_POST['login'];
    $password = $_POST['password'];

    Тогда здесь будет ошибка. Всегда нужно проверять входные данные!

if (!(getUserLogin() === null)){

проще так:

if (getUserLogin() !== null) {
    $login = $_COOKIE['login'] ?? '';
    $password = $_COOKIE['password'] ?? '';

Для чего эти переменные? Следом же редирект выполняется. После отправки хедера Location не имеет смысла дальше выполнять код. Следует сразу использовать конструкцию die.

Evilinside 13.03.2020 в 13:59

Здравствуйте. У меня возник вопрос касательно '/'- если мы указываем '/какой-то файл' - то мы имеем в виду, что данный файл в данной папке, верно? В таком случае, при отправке формы при поставленном слэше action="/какой-то файл" - пхпшторм пишет "cannot resolve file 'какой-то файл', а без слэша всё норм. В чём дело объясните, пожалуйста ?

ivashkevich 14.03.2020 в 20:19

Привет. Ты в курсе как работают абсолютные и относительные ссылки.

Evilinside 16.03.2020 в 14:46

До сего момента думал, что знаю. И всё равно не могу понять почему action = "/..."- не работает у меня. Допустим у меня есть 2 файла,лежащие в 1ой директории, index.php и form.php. В form.php есть форма с action = "/index.php" - и через слэш не работает, хотя оба файлы находятся в 1ой директории.Даже если прописать целиком весь путь до файла "/папка_где_лежат_файлы/upload.php" все равно та же ошибка "cannot resolve file". Объясните почему?

ivashkevich 16.03.2020 в 20:02

Они у вас в корневой папке сайта? Вы веб-сервер используете?

Evilinside 16.03.2020 в 20:48

Да, os использую, оба файла находятся в /OS/domains/myproject.loc/www/request/

ivashkevich 17.03.2020 в 06:08

напишите в личку

Evilinside 17.03.2020 в 08:44

Хорошо

Evilinside 13.03.2020 в 17:26
//1ое задание:
setcookie('login','',0,'/');
setcookie('password','',0,'/');
header('location: index.php');

//2ое задание:
if (!empty($_COOKIE)) {
    require __DIR__ . "/authorization.php";
    $login = $_COOKIE['login'] ?? '';
    $pass = $_COOKIE['password'] ?? '';
    if (checkAuth($login, $pass)) {
        header('location: index.php');
    }
}
ivashkevich 14.03.2020 в 20:22

Location с большой буквы пишется. Лучше указывать абсолютный путь до страницы редиректа. Или относительный, но начинающийся с /

[email protected] 29.03.2020 в 11:59
<?php
setcookie('login', '', 0, '/');
setcookie('password', '', 0, '/');
header('Location: /index.php');
ivashkevich 29.03.2020 в 12:54

Отлично

studentDev 08.04.2020 в 13:06
//logout.php
if(isset($_COOKIE)) {
  setcookie('login', '', -10, '/');
  setcookie('password', '', -10, '/');
  header('Location: /index.php');
}
//login.php
if(isset($_COOKIE['login']) && isset($_COOKIE['password']) {
  header('Location: /index.php');
}

Проверил, вроде бы работает стабильно :/

ivashkevich 08.04.2020 в 15:00

Наличие куки с логином и паролем еще не означает, что пользователь авторизован. Я могу их прямо в браузере создать и написать там что угодно.

studentDev 10.04.2020 в 09:12
//login.php

if(isset($_COOKIE)) {
   $loginCheck = $_COOKIE['login'] ?? '';
   $passwordCheck = $_COOKIE['password'] ?? '';
   if(getUserLogin($loginCheck, $passwordCheck)) {
    header('Location: /index.php');
  }
}

Вот так?

ivashkevich 10.04.2020 в 13:10
if(isset($_COOKIE)) {

это условие всегда выполнится, в нем нет смысла

Почему getUserLogin а не checkAuth?

WarLikeLaux 11.04.2020 в 15:12

logout.php

setcookie('login', '', 0, '/');
setcookie('password', '', 0, '/');
header('Location: ./index.php');

login.php

if (!empty($_POST)) {
// here's code
} elseif (isset($_COOKIE['login']) && isset($_COOKIE['password'])) {
    header('Location: ./index.php');
}
ivashkevich 11.04.2020 в 21:32
if (!empty($_POST)) {
// here's code
} 

Это что за ерунда? Такого в решении, присылаемом на проверку, быть не должно.

Если куки установлены, это ещё не означает что пользователь авторизован. Нужно так же проверить их на валидность.

[email protected] 13.04.2020 в 19:52

Сначала залогинился под admin, index.php меня поприветствовал, потом, ради интереса, не выполняя loginout залогинился под user. index.php меня снова поприветствовал, но уже как user, посмотрел переданные куки, есть только куки для user, куки админа пропали, так и должно быть?
Веб-браузер удалил старые куки?

ivashkevich 14.04.2020 в 19:15

Заменил

Fill 13.04.2020 в 20:55
<?php
//logout.php
require __DIR__ . '/auth.php';

$login = $_COOKIE['login'] ?? '';
$password = $_COOKIE['password'] ?? '';

if (checkAuth($login, $password)) {
    setcookie('login', '', 1, '/');
    setcookie('password', '', 1, '/');
    header('Location: /index.php');
} else {
    echo '<a href="/index.php">Вы небыли авторизованы</a>';
}

//-----------------------------------

<?php
//Логика login.php
require __DIR__ . '/auth.php';

$login = $_COOKIE['login'] ?? '';
$password = $_COOKIE['password'] ?? '';

if (checkAuth($login, $password)) {
    header('Location: /index.php');
} elseif (!empty($_POST)) {
    $login = $_POST['login'] ?? '';
    $password = $_POST['password'] ?? '';

    if (checkAuth($login, $password)) {
        setcookie('login', $login, 0, '/');
        setcookie('password', $password, 0, '/');
        header('Location: /index.php');
    } else {
        $error = 'Ошибка авторизации';
    }
}
?>
ivashkevich 14.04.2020 в 19:16

Отлично, только ?> в конце файла не нужен.

Fill 14.04.2020 в 20:05

Спасибо за ответ! Это я знаю, только там не конец файла, это конец блока php, далее идет блок html

ivashkevich 14.04.2020 в 20:22

А, точно. Тогда норм)

Timurik 16.04.2020 в 11:03

logout.php

setcookie('login', '', 0, '/');
setcookie('password', '', 0, '/');
header('Location: /index.php');

login.php у меня 2 варианта:
1.

if (!empty($_COOKIE)) {
    header('Location: /index.php');
}

2.

if (!empty($_COOKIE)) {
    require __DIR__ . '/auth.php';
    $login = $_COOKIE['login'] ?? '';
    $password = $_COOKIE['password'] ?? '';
    if (checkAuth($login, $password)) {
        header('Location: /index.php');
    }    
}

второй мне нравится больше, в первом не происходит проверка логина и пароля. Подскажите какой вариант лучше использовать.

ivashkevich 16.04.2020 в 11:06

Второй правильный. Причину вы сами написали)

Timurik 16.04.2020 в 11:09

Спасибо!

Timurik 18.04.2020 в 15:32

Я нашел ошибку, если оставить код:

if (!empty($_COOKIE)) {
    require __DIR__ . '/auth.php';
    $login = $_COOKIE['login'] ?? '';
    $password = $_COOKIE['password'] ?? '';
    if (checkAuth($login, $password)) {
        header('Location: /index.php');
    }    
}

то при не пустом Cookie, при условии что логина и пароля там нет возникает ошибка
В результате я исправил код на :

if (!empty($_COOKIE)) {
    if ((!empty($_COOKIE['login'])) && (!empty($_COOKIE['password']))) {
        require __DIR__ . '/auth.php';
        $login = $_COOKIE['login'] ?? '';
        $password = $_COOKIE['password'] ?? '';
        if (checkAuth($login, $password)) {
            header('Location: /index.php');
        }
    }
}

проверте пожалуйста.

ivashkevich 18.04.2020 в 20:07

Прям ошибка, или просто код лишний раз выполнится? Это две разные вещи. Тогда уж сразу проверять наличие ключей, не проверять пустоту массива в целом.

Timurik 18.04.2020 в 20:32

Возможно я неправильно излагал проблему.
Выдавало ошибку в файле auth.php

function checkAuth(string $login, string $password): bool

когда в функцию приходил null ($login=null,$password=null).
Я предполагаю, что из-за отличая класса (приходит не 'string') выводилась критическая ошибка.
Подскажите правильно ли я понял.

Вот такая ошибка выводилась:

Fatal error: Cannot redeclare checkAuth() (previously declared in C:\Server\OSPanel\domains\myproject1.loc\www\auth.php:3) in C:\Server\OSPanel\domains\myproject1.loc\www\auth.php on line 3
ivashkevich 19.04.2020 в 07:38

Ошибка вообще про другое. Вы бы хоть перевести её попробовали.

Timurik 19.04.2020 в 08:59

А кажется я разобрался, проблема в том что функция обЪявляется несколько раз
вот полный код:

if (!empty($_COOKIE)) {
    if ((!empty($_COOKIE['login'])) && (!empty($_COOKIE['password']))) {
        require __DIR__ . '/auth.php';
        $login = $_COOKIE['login'] ?? '';
        $password = $_COOKIE['password'] ?? '';
        if (checkAuth($login, $password)) {
            header('Location: /index.php');
        }
    }
}

if (!empty($_POST)) {
    require __DIR__ . '/auth.php';

    $login = $_POST['login'] ?? '';
    $password = $_POST['password'] ?? '';

    if (checkAuth($login, $password)) {
        setcookie('login', $login, 0, '/');
        setcookie('password', $password, 0, '/');
        header('Location: /index.php');
    } else {
        $error = 'Ошибка авторизации';
    }
}

т.е. файл auth.php я вызывается 2 раза в случае если $_COOKIE и $_POST одновременно не пустые. Лучше наверно до if вызвать файл auth.php один раз, а из конструкций if исключить.
Поправте если я не правильно понял.

ivashkevich 19.04.2020 в 15:45

Верно, ошибка именно об этом. Поэтому при подключении файлов, в которых что-то определяется (например, функция) нужно быть предельно аккуратным. И использовать require_once и include_once.

Timurik 19.04.2020 в 17:42

Огромное спасибо!!!

[email protected] 16.04.2020 в 16:59

logout.php

<?php
setcookie('login', '', time() - 10, '/');
setcookie('password', '', time() - 10, '/');
header('Location: /index.php');

login.php (ADDED)

if (!empty($_COOKIE)) {
    $cookieLogin = $_COOKIE['login'] ?? '';
    $cookiePassword = $_COOKIE['password'] ?? '';
    if (checkAuth($cookieLogin, $cookiePassword)) {
        header('Location: /cookie/index.php');
    }
}

Списал с примера, если честно, не совсем понятно, что это за подпапка cookie в адресе /cookie/index.php ? Обойтись можно и без нее, вроде как я попробовал, но все равно интересно

ivashkevich 17.04.2020 в 08:48

С какого момента перестали понимать? На этом этапе довольно странно списывать, всё слишком просто.

n.yurasheva 16.04.2020 в 17:07

1) logout.php

<?php
if (!empty($_COOKIE)) {
    setcookie('login', "", time() -360, '/');
    setcookie('password', "", time() -360, '/');
    header('Location: index.php');
}

2) login.php

<?php
if (empty($_COOKIE['login']) && empty($_COOKIE['password'])) {
    if (!empty($_POST)) {
        require __DIR__ . '/auth.php';

        $login = $_POST['login'] ?? '';
        $password = $_POST['password'] ?? '';

        if (checkAuth($login, $password)) {
            setcookie('login', $login, 0, '/');
            setcookie('password', $password, 0, '/');
            header('Location: index.php');
        } else {
            $error = 'Ошибка авторизации';
        }
    }
}else {
    header('Location: index.php');
}
?>
<html>
<head>
    <title>Форма авторизации</title>
</head>
<body>

<?php if (isset($error)): ?>
    <span style="color: red;">
    <?= $error ?>
</span>
<?php endif; ?>

<form action="login.php" method="post">
    <label for="login">Имя пользователя: </label><input type="text" name="login" id="login">
    <br>
    <label for="password">Пароль: </label><input type="password" name="password" id="password">
    <br>
    <input type="submit" value="Войти">
</form>
</body>
</html>
ivashkevich 17.04.2020 в 08:50
    setcookie('login', "", time() -360, '/');

Строки пишутся в одинарных кавычках.

В остальном всё отлично!

[email protected] 29.04.2020 в 18:47

Код для проверки, является ли пользователь уже авторизованным.

if ($_SERVER['REQUEST_METHOD'] === 'GET' && !empty($_COOKIE['login']) && !empty($_COOKIE['password'])) {
    if (checkAuth($_COOKIE['login'], $_COOKIE['password'])) {
        header('Location: index.php');
    }
}

Код для разлогинивания.

<?php
setcookie('login', '', 0, '/');
setcookie('password', '', 0, '/');
header('Location: index.php');
ivashkevich 29.04.2020 в 20:35
$_SERVER['REQUEST_METHOD'] === 'GET'

Это для чего?

[email protected] 29.04.2020 в 21:10

Я подумала, что если пользователь уже авторизован и просто загружает страничку, то запрос к серверу идет с помощью метода GET. И на основе этого мы можем сделать вывод, что пользователь уже авторизован, поскольку в противном случае к серверу шел запрос с помощью POST. Это неверно? Как тогда сделать более правильно?

ivashkevich 30.04.2020 в 06:24

Вполне норм, просто хотел от вас это услышать)

titelivus 02.05.2020 в 14:13

1.

<?php

if (!empty($_COOKIE)) {
    setcookie('login', '', 0, '/');
    setcookie('password', '', 0, '/');
}

header('Location: /index.php');
?>

2.

<?php

if (!empty($_COOKIE)) {
    require_once __DIR__ . '/auth.php';

    $login = $_COOKIE['login'] ?? '';
    $password = $_COOKIE['password'] ?? '';

    if (checkAuth($login, $password)) {
        header('Location: /index.php');
    }
}
if (!empty($_POST)) {
    require_once __DIR__ . '/auth.php';

    $login = $_POST['login'] ?? '';
    $password = $_POST['password'] ?? '';

    if (checkAuth($login, $password)) {
        setcookie('login', $login, 0, '/');
        setcookie('password', $password, 0, '/');
        header('Location: /index.php');
    } else {
        $error = 'Ошибка авторизации';
    }
}
?>
<html>
<head>
    <title>Форма авторизации</title>
</head>
<body>
<?php if (isset($error)): ?>
    <span style="color: red;">
    <?= $error ?>
</span>
<?php endif; ?>
<form action="/login.php" method="post">
    <label for="login">Имя пользователя: </label><input type="text" name="login" id="login">
    <br>
    <label for="password">Пароль: </label><input type="password" name="password" id="password">
    <br>
    <input type="submit" value="Войти">
</form>
</body>
</html>
ivashkevich 02.05.2020 в 16:33

Закрывающий тег ?> в конце файла не нужен.

if (!empty($_COOKIE)) {
    setcookie('login', '', 0, '/');
    setcookie('password', '', 0, '/');
}

Для чего проверка массива куки на пустоту?

titelivus 02.05.2020 в 16:41

Если вдруг пользователь лично сам перейдет на http://myproject.loc/logout.php при этом у него не было изначально куки файлов от этого сайта. Без проверки на пустоту мы просто так установим ему куки =)

ivashkevich 03.05.2020 в 20:45

Это страшно?

[email protected] 04.05.2020 в 08:56

Разлогиниваемся:

<?php
setcookie('login', "", 0, '/');
setcookie('password', "", 0, '/');
header('Location: index.php');

А вот с проверкой непонятное что-то. Чтобы я не делал - не перенаправляет на главную автоматически. Только после нажатия кнопки Submit

<?php
if (!empty($_POST)) {

    require __DIR__ . '/Auth/auth.php';

    if (getUserLogin() !== null) {
        header ('Location: index.php');
    }

        $login = $_POST['login'] ?? '';
        $password = $_POST['password'] ?? '';

    if (checkAuth($login, $password)) {
        setcookie('login', $login, 0, '/');
        setcookie('password', $password, 0, '/');
        header('Location: index.php');
    } else {
        $error = 'Ошибка авторизации';
    }
}
?>
<html lang="ru">
<head>
    <title>Форма авторизации</title>
</head>
<body>
<?php
if (isset($error)): ?>
    <span style="color: red;">
    <?= $error ?>
</span>
<?php endif; ?>
<form action="login.php" method="post">
    <label for="login">Имя пользователя: </label><input type="text" name="login" id="login">
    <br>
    <label for="password">Пароль: </label><input type="password" name="password" id="password">
    <br>
    <input type="submit" value="Войти">
</form>
</body>
</html>
ivashkevich 06.05.2020 в 13:29
setcookie('login', "", 0, '/');

Строки пишутся в одинарных кавычках!

        header ('Location: index.php');

На этом можно работу скрипта завершать. Дальнейшее выполнение не имеет смысла.

[email protected] 06.05.2020 в 16:59
Строки пишутся в одинарных кавычках!

Это точно мне?

Я не понял, почему не работал прошлый код. Но вот так - заработало:

?php

if (isset($_COOKIE['login']) && isset($_COOKIE['password'])) {
    require_once __DIR__ . '/Auth/auth.php';

    if (getUserLogin() !== null) {
        header ('Location: index.php');
        }
}

if (!empty($_POST)) {

    $login = $_POST['login'] ?? '';
    $password = $_POST['password'] ?? '';

    require_once __DIR__ . '/Auth/auth.php';

    if (checkAuth($login, $password)) {
        setcookie('login', $login, 0, '/');
        setcookie('password', $password, 0, '/');
        header('Location: index.php');
    } else {
        $error = 'Ошибка авторизации';
    }
}
?>
ivashkevich 06.05.2020 в 20:07

Это точно мне?

Да, мое сообщение написано прямо под куском кода, где строка в двойных кавычках.

ivashkevich 06.05.2020 в 20:10

Повторюсь. После отправки заголовка с локейшеном дальше можно не выполнять код и ставить return. У вас же дальше проверяется post запрос...

    if (getUserLogin() !== null) {
        header ('Location: index.php');
        }

Отступы поехали, будьте внимательнее

[email protected] 07.05.2020 в 05:18

Спасибо!

2yeezy4me 05.05.2020 в 10:25

1.

<?php
setcookie('login', '', 0, '/');
setcookie('password', '', 0, '/');
header('Location: /index.php');

2.

if (!empty($_COOKIE)) {
    require __DIR__ . '/auth.php';
    if (isset($_COOKIE['login']) && isset($_COOKIE['password'])) {
        if (checkAuth($_COOKIE['login'], $_COOKIE['password'])) {
            header('Location: /index.php');
        }
    }
}
ivashkevich 06.05.2020 в 13:44

Можно сразу проверять

if (isset($_COOKIE['login']) && isset($_COOKIE['password'])) {

и только после этого подключать auth.php

Sviatoslav 08.05.2020 в 20:39

logout.php

<?php

if (!empty($_COOKIE)) {
    setcookie('login', $login, -1, '/');
    setcookie('password', $password, -1, '/');
    header('Location: /index.php');
}

Перенаправление (Признаюсь, что подсмотрел код в комментах. Сначала сделал просто проверку на непустые глобальные $_COOKIE['login'] и $_COOKIE['password'] и сразу перенаправление)

if (!empty($_COOKIE['login']) && !empty($_COOKIE['password'])) {
    require __DIR__ . '/auth.php';

    $login = $_COOKIE['login'] ?? '';
    $password = $_COOKIE['password'] ?? '';

    if (checkAuth($login, $password)) {
        header('Location: /index.php');
    }
}
ivashkevich 09.05.2020 в 06:17
setcookie('login', $login, -1, '/');

Для удаления куки в качестве значения нужно указывать пустую строку

Sviatoslav 09.05.2020 в 12:45

Исправил

<?php

if (!empty($_COOKIE)) {
    setcookie('login', '', -1, '/');
    setcookie('password', '', -1, '/');
    header('Location: /index.php');
}
ivashkevich 10.05.2020 в 09:00

Отлично

[email protected] 09.05.2020 в 00:13

1

setcookie('login','', 0, '/');
    setcookie('password','', 0, '/');
    header('Location: /index.php');

исправил

2 сам только 50% (догадался только проверить наличие куки)

if(!empty($_COOKIE['login']) && !empty($_COOKIE['password'])){
    require __DIR__ . '/auth.php';
    $login = $_COOKIE['login'];
    $password = $_COOKIE['password'];
    if (checkAuth($login, $password)){
        header('Location: /index.php');
    }
}
ivashkevich 09.05.2020 в 09:29

Для удаления куки в качестве значения нужно передавать пустую строку

[email protected] 11.05.2020 в 08:22

Никак не могу разобраться. Все время выходит сообщение об ошибке.

Warning: require(C:\Users\User\Downloads\OSPanel\domains\myproject.loc\www/usersDB.php): failed to open stream: No such file or directory in C:\Users\User\Downloads\OSPanel\domains\myproject.loc\www\auth.php on line 4

Fatal error: require(): Failed opening required 'C:\Users\User\Downloads\OSPanel\domains\myproject.loc\www/usersDB.php' (include_path='.;C:\php\pear') in C:\Users\User\Downloads\OSPanel\domains\myproject.loc\www\auth.php on line 4

ivashkevich 12.05.2020 в 07:56

Пишет, что файла нет

[email protected] 12.05.2020 в 10:42
<?php 
if (!empty($_COOKIE)) {
    setcookie('login', '', time(), '/');
    setcookie('password', '', time(), '/');
    header('Location: /index.php');
}
[email protected] 12.05.2020 в 10:45

Задание №1
Задание №2

[email protected] 12.05.2020 в 12:12
<?php
if (!empty($_COOKIE)) {
    require __DIR__ . '/auth.php';
    $login = $_COOKIE['login'];
    $password = $_COOKIE['password'];
    if (checkAuth($login, $password)) {
        header('Location: /index.php');
    }
}
ivashkevich 13.05.2020 в 07:17

Наличие куки еще не означает, что пользователь авторизован.

Пройдите дополнительный урок Обработка форм в PHP и исправьте ошибки

ivashkevich 13.05.2020 в 07:16

Наличие куки еще не означает, что пользователь авторизован.

[email protected] 14.05.2020 в 08:30
Я попробовал таким путем.
<?php
require __DIR__ . '/auth.php';
$login = getUserLogin();

if ($login === null) {
    if (!empty($_POST)) {

        $login = $_POST['login'] ?? '';
        $password = $_POST['password'] ?? '';

        if (checkAuth($login, $password)) {
            setcookie('login', $login, 0, '/');
            setcookie('password', $password, 0, '/');
            header('Location: /index.php');
        } else {
            $error = 'Ошибка авторизации';
        }

    }
} else {
    header('Location: /index.php');
}
ivashkevich 14.05.2020 в 13:16

Логин - ОК.
Остаётся логаут поправить.

[email protected] 14.05.2020 в 14:29
//logout.php
<?php 
    setcookie('login', '', 0, '/');
    setcookie('password', '', 0, '/');
    header('Location: /index.php');

Без проверки куки на пустоту.

ivashkevich 14.05.2020 в 15:14

А для чего проверка на наличие куки?

happyviolence 12.05.2020 в 21:36
//logout.php
?php
setcookie('login', '', 0, '/');
setcookie('password', '', 0, '/');
header('Location: /index.php');

//login.php
//предварительная проверка, что пользователь уже авторизован
<?php
require __DIR__ . '/auth.php';
if (!empty(getUserLogin())) {
    header('Location: /index.php');
}
ivashkevich 13.05.2020 в 07:23

Отлично

IePyton 15.05.2020 в 15:29
// первое задание
<?php
setcookie('login', '', 0, '/');
setcookie('password', '', 0, '/');
header('Location: index.php');

//второе задание
if (!empty($_COOKIE['login'])) {
    header('Location: index.php');
}
ivashkevich 15.05.2020 в 18:39

Наличие куки еще не означает что пользователь авторизован

IePyton 16.05.2020 в 10:20

тогда можно добавить проверку функцией

if (!empty($_COOKIE)) {

    require __DIR__ . '/auth.php';

    $login = $_COOKIE['login'] ?? '';
    $password = $_COOKIE['password'] ?? '';

    if (checkAuth($login, $password)) {
        header('Location: index.php');
    }
}
ivashkevich 16.05.2020 в 12:29

Норм!

[email protected] 03.06.2020 в 00:09

Это вы обобщенно? Просто, если опираться на конкретно нашу ситуацию, то куки создаются только в случае авторизации, а значит и их наличие означает, что пользователь авторизован, верно?

ivashkevich 03.06.2020 в 09:03

Нет. Я могу прямо в браузере себе каких угодно куки насоздавать и они не будут иметь никакого отношения к логике сайта.

IePyton 25.05.2020 в 17:24

Предыдущую домашку сдавал - в комментах.
Новая домашка - https://codingzone.io/problems/13/solution/1334

ivashkevich 26.05.2020 в 10:16

Можно обойтись одним массивом - https://codingzone.io/ru/problems/13/solution/867

IePyton 26.05.2020 в 10:46

как так?(
я пишу невероятно сложные решения, в то время когда есть решения проще и короче

ivashkevich 27.05.2020 в 17:40

Это просто опыт) В программировании, как и в других творческих вещах, нужно отсекать лишнее

[email protected] 03.06.2020 в 00:32

logout

setcookie('login', '', 0, '/');
setcookie('password', '', 0, '/');
header('location: /index.php');

login

При подкюченном auth.php.
if (checkAuth($_COOKIE['login'], $_COOKIE['password']) == true){
    header('Location: /index.php');
}

Отсюда вопрос, имеет ли значение, с точки зрения оптимизации кода - подключать файлы только при соблюдении определенных условий, например:

if(!empty($_POST)) {
    require __DIR__ . '/auth.php';}

Или просто в шапке сразу размещать? Или не имеет значения?

ivashkevich 03.06.2020 в 09:05
if (checkAuth($_COOKIE['login'], $_COOKIE['password']) == true){

А где проверка на то, что эти ключи вообще в массиве есть?

С точки зрения оптимизации - имеет. Но нужна эта оптимизация или нет - это уже другой вопрос.

[email protected] 03.06.2020 в 23:58

А где проверка на то, что эти ключи вообще в массиве есть?

Не протестил как следует... checkAuth же не принимает значение NULL...
В таком случае:

if(!empty($_COOKIE['login'] and $_COOKIE['password'])) {
    if (checkAuth($_COOKIE['login'], $_COOKIE['password']) == true) {
        header('Location: /index.php');
    }
}

По поводу задачи на CZ
Вроде как написал рабочий алгоритм (судя по тестам в ИДЕ), однако CZ настойчиво выдает уведомление о "неопределенной переменной" и не хочет меня проверять.
Раньше справлялся с такими ошибками, а тут просто не знаю, чего от меня хотят.
https://codingzone.io/problems/13/solution/1959

ivashkevich 04.06.2020 в 06:59
if(!empty($_COOKIE['login'] and $_COOKIE['password'])) {

Это так не работает. Если хотя бы один из ключей не будет присутствовать, будет ошибка. Оператор and не используется.

Пройдите дополнительный урок Обработка форм в PHP и исправьте ошибки

ivashkevich 04.06.2020 в 07:01

о "неопределенной переменной"

неправда. Ошибка о другом. Переведите ошибку, настройте дебаггер, включите показ нотисов у себя на локальном сервере и найдите проблему. До тех пор алгоритм не является рабочим.

[email protected] 05.06.2020 в 23:48

по первому замечанию

if(isset($_COOKIE['login'], $_COOKIE['password'])) {
    if (checkAuth($_COOKIE['login'], $_COOKIE['password']) == true) {
        header('Location: /index.php');
    }
}

по поводу задачи
Да, я неправильно перевел.
Неопределенное смещение, ибо я обращался к несуществующей переменной.
Изменил код, добавил вместо проверки на null проверку на наличие (isset).
Все заработало, но СZ на третьем шаге проверки ругается и утверждает странные для меня вещи.

Input:
-8 -3 -6 -2 -5 -4
Expected output:
-2
Actual output:
-7

То есть по мнению вашего робота в массиве есть сумма подряд идущих чисел равная -2.
Хотя такой суммы нет.
Я так понимаю, что робот просто взял самое большое число.
Но ведь условие задачи найти именно сумму.
Я прав, что робот не прав?)
https://codingzone.io/ru/problems/13/solution/2055

[email protected] 05.06.2020 в 23:57

Ну, если все-же я неправильно понял условие задачи и само число исходного массива тоже нужно учитывать, то:
https://codingzone.io/ru/problems/13/solution/2058
Продолжу обучение.

ivashkevich 06.06.2020 в 08:47
    if (checkAuth($_COOKIE['login'], $_COOKIE['password']) == true) {

зачем сравнивать true с true?)

    if (checkAuth($_COOKIE['login'], $_COOKIE['password'])) {
ivashkevich 06.06.2020 в 08:48

Последовательность из одного числа.

[email protected] 06.06.2020 в 10:11

Спасибо за проверку.

Hellbound 04.06.2020 в 00:18

logout.php

<?php
setcookie('login', '', 0, '/');
setcookie('password', '', 0, '/');
header('Location: /index.php');

login.php

<?php
require __DIR__ . '/auth.php';

if (!empty($_POST)) {

    $login = $_POST['login'] ?? '';
    $password = $_POST['password'] ?? '';

    if (checkAuth($login, $password)) {
        setcookie('login', $login, 0, '/');
        setcookie('password', $password, 0, '/');
        header('Location: /index.php');
    } else{
        $error = 'Ошибка авторизации';
    }
} elseif (!empty($_COOKIE['login']) && $_COOKIE['password']) {
    if (checkAuth($_COOKIE['login'], $_COOKIE['password'])) {
        header('Location: /index.php');
    }
}
?>

Задача - https://codingzone.io/problems/13/solution/1961

ivashkevich 04.06.2020 в 07:05

Что в if, что в else одна и та же строка:

    require __DIR__ . '/auth.php';

можно вынести за пределы условия

Hellbound 04.06.2020 в 17:23

Исправил

ivashkevich 06.06.2020 в 08:08

Отлично

[email protected] 09.06.2020 в 14:47

Проверка

require __DIR__ . '/auth.php';

if (!empty($_COOKIE)) {
    $login = $_COOKIE['login'] ?? '';
    $password = $_COOKIE['password'] ?? '';
    if (checkAuth($login, $password)) {
        header('Location: /cookie/index.php');
    }
}
ivashkevich 10.06.2020 в 12:23

Отлично

[email protected] 09.06.2020 в 14:48

Удаление

<?php
if (!empty($_COOKIE)) {
    setcookie('login', '', -10, '/');
    setcookie('password', '', -10, '/');
    header('Location: /cookie/index.php');
}
ivashkevich 10.06.2020 в 12:23

Отлично

UtillitE 18.07.2020 в 16:13

Привет, так правильно будет?
logout.php

<?php
header('Location: /index.php');
setcookie('login','', 0, '/');
setcookie('password','', 0, '/');
UtillitE 18.07.2020 в 16:30

Артём, такой вопрос. Почему на меня ругается программа? Я добросовестно скопировала с твоего урока программы, но почему-то при переходе на index.php выдаёт ошибку Parse error: syntax error, unexpected '?' in C:\open_server\OpenServer\domains\myproject.loc\www\auth.php on line 16
В чём может быть проблема?
В файле auth.php убирала ? перед string (function getUserLogin(): ?string) и заменяла null на пустую строку (return null;). в общем программа работает, единственное, что нет главной страницы с просьбой Авторизируйтесь. Надеюсь, понятно объяснила проблему.

UtillitE 18.07.2020 в 17:59

Нашла в комментариях, как решить проблему.

ivashkevich 20.07.2020 в 02:24

Нужно выбрать версию PHP не ниже 7.1

ivashkevich 20.07.2020 в 02:24

Да. Только строки пишутся в одинарных кавычках

UtillitE 22.07.2020 в 10:53

login.php

<?php
if (!empty($_POST)) {
    require __DIR__ . '/auth.php';
    if (!empty(getUserLogin())) {
        header("Location: index.php");
    }
    $login = $_POST['login'] ?? '';
    $password = $_POST['password'] ?? '';

    if (checkAuth($login, $password)) {
        setcookie('login', $login, 0, '/');
        setcookie('password', $password, 0, '/');
        header('Location: /index.php');
    } else {
        $error = 'Ошибка авторизации';
    }
VitaliyB 24.07.2020 в 11:39

2.
А почему так не пойдёт?

if (!empty($_COOKIE['login'] && $_COOKIE['password'])) {
    header('Location: /index.php');
}

2(b)

if (!empty($_COOKIE)) {
    require __DIR__ . '/auth.php';
    $login = $_COOKIE ['$login'] ?? '';
    $password = $_COOKIE ['$password'] ?? '';
    header('Location: /checkauth/index.php');
}
ivashkevich 25.07.2020 в 19:44
if (!empty($_COOKIE['login'] && $_COOKIE['password'])) {

empty работает не так. Если этих ключей не будет, возникнет ошибка. Пройдите дополнительный урок Обработка форм в PHP и исправьте.

    $login = $_COOKIE ['$login'] ?? '';

после $_COOKIE пробел не нужен

Для чего во втором решении все эти манипуляции? По факту если есть любые куки происходит редирект.

VitaliyB 26.08.2020 в 15:01

ок

ivashkevich 27.08.2020 в 08:39

??

Ysup 04.10.2020 в 19:39

// главная страница index.php
<?php

require __DIR__ . '/auth.php';
$login = getUserLogin();

$userAlreadyReg = $_GET['userAlreadyReg']; 
$userNo = $_GET['userNo'];

?>

<html>
<head>
    <title>Главная страница</title>
</head>
<body>
<br>
    <?php if ($userAlreadyReg): ?>
    <?= $userAlreadyReg.', '. $login ?> <br>
    <a href="logout.php">Выйти</a>

    <?php elseif ($userNo): ?>
    <?= $userNo ?><br>
    <a href="/login.php">Авторизуйтесь</a>

<?php endif; ?>
</body>
</html>

// Страница для определения логики logical.php 

<?php 

// Если пользователь случайно пытается зайти на сайт, то сравниваем отправленный Логин с cookie
if ($_POST['login'] === $_COOKIE['login']) {
    $userAlreadyReg = 'Вы уже зарегистрированы';    
    header('Location: /index.php?userAlreadyReg=' . $userAlreadyReg);

} elseif (!empty($_POST)) {

//если сравнение выше, не соответствует, проверяем правильные ли логин и пароль были переданы
require __DIR__ . '/auth.php';

    $login = $_POST['login'] ?? '';
    $password = $_POST['password'] ?? '';

   if (checkAuth($login, $password)) {   

    $userAlreadyReg = 'Добро пожаловать';
    setcookie('login', $login, 0, '/');
    setcookie('password', $password, 0, '/');       
    header('Location: /index.php?userAlreadyReg=' . $userAlreadyReg);  
        // если авторизация прошла успешно, устанавливаем cookie с ключами login и password

    } else {// если нет, создаем переменную userNo

    $userNo = 'Логин или пароль не верный';     
    header('Location: /index.php?userNo=' . $userNo);
    }
} 

?> 

// Страница Авторизации login.php 

<!DOCTYPE html>
<html>
<head>
    <title>Авторизация</title>
</head>
<body>

<form action="/logical.php/" method="post">
    <label for="login">Имя пользователя: </label>
    <input type="text" name="login" id="login"><br>    
    <label for="password">Пароль: </label>
    <input type="password" name="password" id="password"><br>   
    <input type="submit" value="Войти">
</form>

</body>
</html>

// Страница удаления cookie logout.php 

<?php
    setcookie('login', "", 0, "/"); 
    setcookie('password', "", 0, "/");
    header('Location: /login.php');
?>

Артём, посмотрите пожалуйста, всё ли нормально. 
ivashkevich 06.10.2020 в 07:51

Рекомендую ознакомиться с другими решениями в комментариях. Как-то всё переусложнено.

Пройдите дополнительный урок Обработка форм в PHP и исправьте ошибки (обращаетесь к ключам массива, которых может не быть).

    setcookie('login', "", 0, "/"); 

Для строк используются одинарные кавычки!

Проблема с форматированием. Делайте отступы и переносы как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L

MikeSiebel 04.10.2020 в 23:24

Добрый день!
logout.php

if (!empty($_COOKIE)) {
    setcookie('login', '', 0, '/');
    setcookie('password', '', 0, '/');
    header('Location: /ws_lessons/index.php');
}

login.php

if (!empty($_COOKIE)) {
    $login = $_COOKIE['login'] ?? '';
    $password = $_COOKIE['password'] ?? '';
    if (checkAuth($login, $password)) {
        header('Location: /ws_lessons/index.php');
    }
}
ivashkevich 06.10.2020 в 07:52

Норм!

GeoOK 07.10.2020 в 09:21

Здравствуйте!

Пытался сделать для разлогинивания задержку с помощью sleep, с выводимой надписью: "До свидания, имя пользователя", но программа тормозится до вывода строки, хотя сам оператор находится после. А потом происходит быстрый переход на login.php, так что ничего прочитать не успеваешь.

logout.php

<?php
require __DIR__ . '/auth.php';
$login = checkCookie();
?>
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Выход</title>
</head>
<body>
<?php if (!empty($login)): ?>
    <?php
    setcookie('login', '', 1, '/');
    setcookie('password', '', 1, '/');
    header('Location: /homeworks/authCookie/index.php');
    ?>
<?php else: header('Location: /homeworks/authCookie/index.php'); ?>
<?php endif; ?>
</body>
</html>

login.php

<?php
if (!isset($_COOKIE['login']) && !isset($_COOKIE['password'])) {
    if (!empty($_POST)) {
        require __DIR__ . '/auth.php';

        $login = $_POST['login'];
        $password = $_POST['password'];

        if (checkAuth($login, $password)) {
            setcookie('login', $login, 0, '/');
            setcookie('password', $password, 0, '/');
            header('Location: /homeworks/authCookie/index.php');
        } else {
            $error = 'Ошибка авторизации';
        }
    }
} else {
    header('Location: /homeworks/authCookie/index.php');
}
?>
ivashkevich 07.10.2020 в 19:33

Конечно, sleep тормозит формирование страницы на стороне сервера. Вам нужно сделать это с помощью JS. Пример

GeoOK 08.10.2020 в 02:43

Понял. Попробую. Спасибо!

[email protected] 09.10.2020 в 00:54

В куках хранить логин??? Пароль???

ivashkevich 12.10.2020 в 07:33

Привет. Это обучающий пример, показывающий как работать с куки, дальше будет объяснено почему так делать не стоит и будут примеры с auth token

Sergey503 31.10.2020 в 02:33

logout.php

if (empty($_POST)) {
    $login = $_POST['login'] ?? '';
    $password = $_POST['password'] ?? '';

    setcookie('login', $login, time() - 3600, '/');
    setcookie('password', $password, time() - 3600, '/');
    header('Location: /index.php');
}

login.php

require __DIR__ . '/auth.php';

if (!empty($_COOKIE['login']) && !empty($_COOKIE['password'])) {
    if (checkAuth($_COOKIE['login'], $_COOKIE['password'])) {
        header('Location: /index.php');
        die();
    }
} elseif (!empty($_POST)) {

    $login = $_POST['login'] ?? '';
    $password = $_POST['password'] ?? '';

    if (checkAuth($login, $password)) {
        setcookie('login', $login, time() + 3600, '/');
        setcookie('password', $password, time() + 3600, '/');
        header('Location: /index.php');
    } else {
        $error = 'Ошибка авторизации';
    }
}
ivashkevich 31.10.2020 в 06:51

Отлично!

Alhimi 31.10.2020 в 11:37

logout.php

<?php
setcookie('login', null, 0, '/');
setcookie('password', null, 0, '/');
header('Location: /index.php');
?>

login.php

<?php
require __DIR__ . '/auth.php';
if (!empty($_POST))
{
    $login = $_POST['login'] ?? '';
    $password = $_POST['password'] ?? '';

    if (checkAuth($login, $password)) {
        setcookie('login', $login, 0, '/');
        setcookie('password', $password, 0, '/');
        header('Location: /index.php');
    } else {
        $error = 'Ошибка авторизации';
    }
}
if (!empty($_COOKIE['login']) && !empty($_COOKIE['password'])) {
    header('Location: /index.php');
}
?>
ivashkevich 31.10.2020 в 16:21

Ок. А где $error используется?

Alhimi 31.10.2020 в 16:47

В дальнейшем коде с html в body. просто здесь не написал, так как его оставил как в уроке...

<?php if (isset($error)): ?>
<span style="color: red;">
    <?= $error ?>
</span>
ivashkevich 02.11.2020 в 20:25

Ок

pixel 08.11.2020 в 20:19
<?php
    //logout.php
    setcookie('login');
    setcookie('password');
    header('Location: /index.php');

//login.php
    if (!empty($_COOKIE)){
        require __DIR__ . '/auth.php';
        $login = getUserLogin();
        if ($login !== null){
            header('Location: /index.php');
        }
    }
ivashkevich 09.11.2020 в 19:16

Отлично!

[email protected] 16.11.2020 в 08:52

Здравствуйте, у меня при решении задачи "Максимальная сумма подряд идущих чисел" появляется Notice: Undefined offset: 6 in /app/code-9182964404086915278.php on line 10

$nums = explode(' ', $line);
$max = max($nums);
$value = 0;

for($x = 0; $x <= count($nums); $x++){
$value = $value + $nums[$x];

if($max < $value){
    $max = $value;
} elseif ($value < 0){
    $value = 0;
}

}
if($max == 0){
$max = max($nums);
}
echo $max;

ivashkevich 17.11.2020 в 17:17

Нужно оформить код в комментарии (в редакторе комментариев самая первая кнопка).
Нажмите на карандашик и поправьте ваш комментарий, пожалуйста. А потом ответьте мне на этот комментарий. После этого отвечу на вопросы.

[email protected] 16.11.2020 в 15:03

Logout:

<?php
if (!empty($_COOKIE)) {
    setcookie('login', '', 0, '/');
    setcookie('password', '', 0, '/');
    header('Location: /index.php');
    }
?>

2ое задание на проверку авторизации пользователя на странице login
В начале добавил следующие строчки

if (!empty($_COOKIE)) {
    header('Location: /index.php');
}
ivashkevich 17.11.2020 в 17:21
if (!empty($_COOKIE)) {
    header('Location: /index.php');
}

Наличие куки еще не означает что пользователь авторизован!

    header('Location: /index.php');
    }

Соблюдайте отступы.

kan22 16.12.2020 в 14:16

logout.php

if (!empty($_COOKIE)) {
    require __DIR__ . '/auth.php';

    $login = $_COOKIE['login'] ?? '';
    $password = $_COOKIE['password'] ?? '';

    if (checkAuth($login, $password)) {
        setcookie('login', '', 0, '/');
        setcookie('password', '', 0, '/');
        header('Location: /index.php');
    }
}

login.php

if (!empty($_COOKIE)) {
    require __DIR__ . '/auth.php';

    $login = $_COOKIE['login'] ?? '';
    $password = $_COOKIE['password'] ?? '';

    if (checkAuth($login, $password)) {
        header('Location: /index.php');
    }
}
ivashkevich 17.12.2020 в 17:49

Отлично

Alexandr92 30.01.2021 в 22:35

logout.php

<?php
setcookie('login', '', 0, '/');
setcookie('password', '', 0, '/');
header('Location: /index.php');
?>

login.php

<?php
require __DIR__ . '/auth.php';

if (!empty($_COOKIE)) { 
    $login = $_COOKIE['login'] ?? '';
    $password = $_COOKIE['password'] ?? '';
    if (checkAuth($login, $password)) {
        header('Location: /index.php');
    }
}
ivashkevich 01.02.2021 в 06:22

Отлично

iluha22 02.02.2021 в 09:18

В заключении в первом абзаце добавь запятую перед "НО":
"Пока что - вот такая простейшая, но небезопасная система авторизации."
:)

ivashkevich 04.02.2021 в 07:36

Спасибо, поправил

Vilotu 07.02.2021 в 11:04
//logout
<?php
setcookie('login', '/');
setcookie('password', '/');

header('Location: /index.php');
ivashkevich 08.02.2021 в 05:53

И для чего там слэши?

Vilotu 07.02.2021 в 12:02
//Проверка
<?php
if (!empty($_COOKIE['login'])) {
    header('Location: /index.php');
}
?>
ivashkevich 08.02.2021 в 05:54

Наличие куки не означает что пользователь авторизован

dimadima 08.02.2021 в 21:31
<?php
require __DIR__ .'/auth.php';

setcookie('login', '', 0, '/');
setcookie('password', '', 0, '/');
header('Location: /index2.php');
ivashkevich 09.02.2021 в 06:54

Для чего вот это?

require __DIR__ .'/auth.php';
dimadima 09.02.2021 в 10:41

Значит не надо упоминания файла?

ivashkevich 10.02.2021 в 05:56

Вы мне скажите, для чего подключили этот файл здесь?)

dimadima 10.02.2021 в 10:07

Логика была такая, что если при подключении куков мы обращались к этому файлу, то и при их удалении надо обратиться к файлу)

[email protected] 15.04.2021 в 15:42

Интересно, можно ответить, если комментарии закрыты

Egor.Ka 16.02.2021 в 19:07

1 logout.php

<?php
    setcookie('login', '', 0, '/');
    setcookie('password', '', 0, '/');
    header('Location: /index.php');

2 login.php тут я долго тупил, почему функция checkAuth() не определена), в итоге вынес

require __DIR__ . '/auth.php';

Из циклов вообще и вроде все корректно работает)

<?php
require __DIR__ . '/auth.php';
if(isset($_COOKIE['login'] , $_COOKIE['password'])){
    if(checkAuth($_COOKIE['login'], $_COOKIE['password'])) {
        header('Location: /index.php');
    }
}
ivashkevich 20.02.2021 в 04:57

Отлично

[email protected] 28.02.2021 в 14:25

Артем вот сделал

<?php

setcookie('login', $login,time() - 3600);
setcookie('password', $password,time() - 3600);
header('Location: /index.php');
?>

<html>
<head>
<title>Форма деавторизации</title>
</head>
<body>
<form action="/logout.php" method="post">

<input type="submit" value="Выйти">

</form>
</body>
</html>

Правильно ?

ivashkevich 08.03.2021 в 10:31

Нужно оформить код в комментарии (в редакторе комментариев самая первая кнопка).
Нажмите на карандашик и поправьте ваш комментарий, пожалуйста. А потом ответьте мне на этот комментарий. После этого отвечу на вопросы.

Vladimir96 02.03.2021 в 20:22

logout.php

setcookie('login', '', 0, '/');
setcookie('password', '', 0, '/');
header('Location: /index.php');

В самое начало кода добавил функцию которую мы писали ранее на проверку куки

require __DIR__ . '/auth.php';

if (getUserLogin()) {
    header('Location: /index.php');
}
ivashkevich 10.03.2021 в 08:09

Отлично

serega19860511 28.04.2021 в 22:39

logout.php

setcookie('login', '',0,'/');
setcookie('pass', '',0,'/');
header('Location: index.php');
exit();

login.php

if (getUserLogin()) {
    header('Location: index.php');
}
ivashkevich 01.05.2021 в 17:39

Отлично

Логические задачи с собеседований