За последние 24 часа нас посетили 73922 программиста и 10205 роботов. Сейчас ищут 2542 программиста ...

Куки + вывод ошибок == фэйл. Куки без вывода ошибок == ОК. Как так?

Тема в разделе "PHP для новичков", создана пользователем tangar, 3 окт 2017.

  1. tangar

    tangar Новичок

    С нами с:
    8 сен 2017
    Сообщения:
    9
    Симпатии:
    0
    Добрый день!

    PHP:
    1. <?
    2. $visitCounter = 0;
    3. if (isset($_COOKIE['visitCounter'])) {
    4.     $visitCounter = $_COOKIE['visitCounter'];
    5.     $visitCounter++;
    6.     }
    7. $lastVisit = '';
    8. if (isset($_COOKIE['lastVisit']))
    9.     $lastVisit = date('d-m-Y H:i:s', $_COOKIE['lastVisit']);
    10. if (date('d-m-Y', $_COOKIE['lastVisit']) != date('d-m-Y')) {
    11.     setcookie("visitCounter", $visitCounter, 0x7FFFFFFF);
    12.     setcookie("lastVisit", time(), 0x7FFFFFFF);
    13. }
    14. if($visitCounter ==1)
    15. echo 'Welcome, new friend!';
    16. else echo 'This is your '.$visitCounter.' visit. Your last visit was at '.$lastVisit.'. Nice to see you again!';
    Если стоит:
    error_reporting(E_ALL);
    ini_set('display_errors', '1');

    ...код не работает и выдает ошибки:

    Notice: Undefined index: lastVisit in C:\OpenServer\domains\localhost\php\cookie.inc.php on line 10

    Warning: Cannot modify header information - headers already sent by (output started at C:\OpenServer\domains\localhost\php\cookie.inc.php:10) inC:\OpenServer\domains\localhost\php\cookie.inc.php on line 11

    Warning: Cannot modify header information - headers already sent by (output started at C:\OpenServer\domains\localhost\php\cookie.inc.php:10) inC:\OpenServer\domains\localhost\php\cookie.inc.php on line 12
    This is your 0 visit. Your last visit was at . Nice to see you again!

    Если удалить вывод ошибок - код работает.

    Пожалуйста, помогите побороть ошибки.
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.843
    Симпатии:
    1.338
    Адрес:
    Лень
    tangar нравится это.
  3. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.724
    Симпатии:
    358
    10 строка.. а перед ней идет проверка есть ли кука или нет..
    если ее нет будет варнинг...а варнинг это отсылка сообщения с хидером естественно.. а потом уже не поменяешь его если он отправлен)) в общем перед тем как обращаться к переменной надо проверять ее состояние..
     
    tangar нравится это.
  4. tangar

    tangar Новичок

    С нами с:
    8 сен 2017
    Сообщения:
    9
    Симпатии:
    0
    Спасибо :D Теперь все работает:
    PHP:
    1. $visitCounter = 0;
    2. if (isset($_COOKIE['visitCounter'])) {
    3.     $visitCounter = $_COOKIE['visitCounter'];
    4.     ++$visitCounter;
    5. }
    6. $lastVisit = '';
    7. if (isset($_COOKIE['lastVisit'])) {
    8.     $lastVisit = date('d-m-Y H:i:s', $_COOKIE['lastVisit']);
    9.         if (date('d-m-Y', $_COOKIE['lastVisit']) != date('d-m-Y')) {
    10.             setcookie("visitCounter", $visitCounter);
    11.             setcookie("lastVisit", time());
    12.         }
    13. } else {
    14.     setcookie("lastVisit", time());
    15.     setcookie("visitCounter", $visitCounter);
    16.     }
     
  5. PhpStorm

    PhpStorm Новичок

    С нами с:
    21 сен 2017
    Сообщения:
    65
    Симпатии:
    11
    Адрес:
    JetBrains
    PHP:
    1. if (filter_has_var(INPUT_COOKIE, 'имя')) {
    2.     # код
    3. }
     
    Fell-x27 нравится это.
  6. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.724
    Симпатии:
    358
    @PhpStorm а чем isset хуже в данном случае?
     
  7. PhpStorm

    PhpStorm Новичок

    С нами с:
    21 сен 2017
    Сообщения:
    65
    Симпатии:
    11
    Адрес:
    JetBrains
    тем, что isset пропустит ПРОСТУЮ переменную $_COOKIE['имя'], filter_has_var проверит каким именно методом пришла переменная $_COOKIE['имя'], а именно в данном случае проверит, является ли она кукисом.
     
    Fell-x27 нравится это.
  8. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.724
    Симпатии:
    358
    мне как то никогда в голову не приходило назвать переменную в скрипте $_COOKIE
     
    PhpStorm нравится это.
  9. PhpStorm

    PhpStorm Новичок

    С нами с:
    21 сен 2017
    Сообщения:
    65
    Симпатии:
    11
    Адрес:
    JetBrains
    ну мало ли умельцев )
     
    Fell-x27 нравится это.
  10. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.843
    Симпатии:
    1.338
    Адрес:
    Лень
    если не долбить мозг и не приписывать $_COOKIE['имя'] = 1
    или
    воспользовавшись extract
    то isset достаточно
    --- Добавлено ---
    да еще и с капсом
    $_COOKIE
    $_cookie
    две разные переменные
     
  11. PhpStorm

    PhpStorm Новичок

    С нами с:
    21 сен 2017
    Сообщения:
    65
    Симпатии:
    11
    Адрес:
    JetBrains
    isset не будет достаточно для проверки, каким именно методом пришла кука, для этого используется filter_has_var, а если Вы хотите проверить ОБЫЧНУЮ переменную, то используйте !empty, которая СРАЗУ проверит наличие переменной и её значения, если оно есть, в то время, как isset вернёт true, если переменная установлена, но не имеет значения.
     
    Fell-x27 нравится это.
  12. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.843
    Симпатии:
    1.338
    Адрес:
    Лень
    мне будет достаточно проверить куки с помощью isset на существование ключа.
    Два выбросьте из головы говно, где якобы кодер объявит эту переменную в своем говнокоде.
    Три. на существовании переменной так же мне достаточно isset или ( блин забыл название ):
    $value ?? null

    !empty - для этого грех
     
  13. PhpStorm

    PhpStorm Новичок

    С нами с:
    21 сен 2017
    Сообщения:
    65
    Симпатии:
    11
    Адрес:
    JetBrains
    правильная проверка переменной - !empty
    правильная проверка наличия кукисов - filter_has_var
     
  14. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.843
    Симпатии:
    1.338
    Адрес:
    Лень
    нет, и не надо обобщать анотацию правильности. Следует учитывать для чего проверять.
    достаточно isset
     
  15. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.724
    Симпатии:
    358
    empty имеет смысл тогда когда переменная должна существовать и не должна быть равна нулю или пустоте если это строковая)) я использую ее в этом случае))
    а isset в том случае когда пофиг что получаешь - лишь бы получить)
     
  16. PhpStorm

    PhpStorm Новичок

    С нами с:
    21 сен 2017
    Сообщения:
    65
    Симпатии:
    11
    Адрес:
    JetBrains
    правильная проверка переменной - !empty
    правильная проверка наличия кукисов - filter_has_var
     
    Fell-x27 нравится это.
  17. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.843
    Симпатии:
    1.338
    Адрес:
    Лень
    Говнокодерам на память:
    PHP:
    1. <?php
    2.  
    3. $a = 2;
    4.  
    5. if ( $a === 3 )
    6. {
    7.     $int = $a;
    8. }
    9.  
    10. if ( !empty ( $int ) )
    11. {
    12.     $int ...
    13. }
    --- Добавлено ---
    Говнокодер (с)
     
  18. PhpStorm

    PhpStorm Новичок

    С нами с:
    21 сен 2017
    Сообщения:
    65
    Симпатии:
    11
    Адрес:
    JetBrains
    !empty одновременно проверяет есть ли переменная и имеет ли она значение, isset вернёт true, если переменная установлена, но не имеет значения, универсальный правильный вариант - !empty
     
  19. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.724
    Симпатии:
    358
    PHP:
    1. $var = 0;
    2. if(!empty($var)){
    3.     echo 'фигня';
    4. }
    переменная определена)) но фигня не появится)
    --- Добавлено ---
    а вот так вот фигня заработает так как надо
    PHP:
    1. $var = 0;
    2. if(isset($var)){
    3.     echo 'фигня';
    4. }
     
  20. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.843
    Симпатии:
    1.338
    Адрес:
    Лень
    он щас скопирует текст и начнет как автоответчик лепить свое. Мы знаем что делает isset и empty но логическое применение у говнокодера не правильно
     
  21. PhpStorm

    PhpStorm Новичок

    С нами с:
    21 сен 2017
    Сообщения:
    65
    Симпатии:
    11
    Адрес:
    JetBrains
    код писал гк, подтверждаю
    --- Добавлено ---
    потому isset вернула true при пустоте переменной
     
  22. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.724
    Симпатии:
    358
    она не пустая, у нее значение ноль.. это тоже значение.
     
  23. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.843
    Симпатии:
    1.338
    Адрес:
    Лень
    потому что isset проверила переменную на существование, и всем срать что внутри
     
  24. PhpStorm

    PhpStorm Новичок

    С нами с:
    21 сен 2017
    Сообщения:
    65
    Симпатии:
    11
    Адрес:
    JetBrains
    потому isset вернула true при пусто

    И они являются пустотой.

    Следующие значения воспринимаются как пустые:
    • "" (пустая строка)
    • 0 (целое число)
    • 0.0 (дробное число)
    • "0" (строка)
    • NULL
    • FALSE
    • array() (пустой массив)
    • $var; (переменная объявлена, но не имеет значения)
     
  25. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.724
    Симпатии:
    358
    это описано поведение empty..
    а ноль это значение..