Author Topic: почему эта команда в PHP не работает?  (Read 207 times)

0 Members and 1 Guest are viewing this topic.

Offline zwh

  • Posts: 17763
  • Gender: Male
сабж:

setcookie('pwd','passed',time()+300);

Offline Bhudh

  • Posts: 54875
  • Gender: Male
  • aka 蝎
    • Сайты по языкознанию
Как именно не работает? Она false возвращает?
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Offline Upliner

  • Posts: 3730
  • Gender: Male
  • Blanklanugbesto
Она вызывается до отправки каких-либо других данных?
Мы, видите ли, винтили вентили аж квинтиллион раз!

Offline zwh

  • Posts: 17763
  • Gender: Male
Написано:
Quote
$ps=0;
   }
   else
{
     $_ck=setcookie('pwd','passed',time()+300); $ps=1; }

Ниже вывожу:
Quote
echo("\$ck=$ck, \$_ck=$_ck, \$ps=$ps");
Вижу на экране:
Quote
$ck=, $_ck=, $ps=1
:donno:

Offline Bhudh

  • Posts: 54875
  • Gender: Male
  • aka 蝎
    • Сайты по языкознанию
В $_ck булево значение, оно как там в пыхе сейчас в строку кастуется?
И вообще, $_ck должно быть видно вне блока else?
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Offline Upliner

  • Posts: 3730
  • Gender: Male
  • Blanklanugbesto
У меня всё работает
Code: [Select]
<?php
if (true) {
    
$_ck=setcookie('pwd','passed',time()+300);
}
$ps=1;
echo(
"\$ck=$ck, \$_ck=$_ck, \$ps=$ps");
?>

Выдаёт
Code: [Select]
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Wed, 20 Mar 2019 16:41:42 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: pwd=passed; expires=Wed, 20-Mar-2019 16:46:42 GMT; Max-Age=300

$ck=, $_ck=1, $ps=1
Мы, видите ли, винтили вентили аж квинтиллион раз!

Offline zwh

  • Posts: 17763
  • Gender: Male
Да я уж догадываюсь, что где-то косячу, но вот где именно?.. Главное, что до какого-то времени (несколько лет назад) оно всё работало...

Короче, вот сокращенный код странички:
Quote
<? $ck='-'; $ps=0;
  require_once('_connect.php');
  if(!isset($_COOKIE['pwd']))
    require('_pwd.php');
  else
    $ok=1;
  if($ok==1)
  { $ck=setcookie('pwd','passed',time()+300);
    include('head.html');
echo("\$ck=$ck, \$_ck=$_ck, \$ps=$ps");
?>
{всякие тэги}
<? } ?>

А вот _pwd.php (тоже в сокращении):
Quote
<? require_once('_connect.php');
   if (isset($_POST["pwd"])) $pwd=$_POST['pwd']; else $pwd='';

   {Проверка $pwd; если корректно, то $ok=1.}

   if($ok==0)
   {
?>

{Форма ввода пароля}

<? $ps=0;
   }
   else
{
     $_ck=setcookie('pwd','passed',time()+300); $ps=1; }

   require('head.html');
?>

Offline Upliner

  • Posts: 3730
  • Gender: Male
  • Blanklanugbesto
Quote
{Форма ввода пароля}

<? $ps=0;
   }
   else
{
     $_ck=setcookie('pwd','passed',time()+300); $ps=1; }
Нельзя так делать. У вас сначала выводится форма пароля, а потом устанавливается кука. Нужно, чтобы setcookie был раньше любых операций вывода, в том числе и выше текста вне <? ?> секции.
Мы, видите ли, винтили вентили аж квинтиллион раз!

Offline zwh

  • Posts: 17763
  • Gender: Male
Quote
{Форма ввода пароля}

<? $ps=0;
   }
   else
{
     $_ck=setcookie('pwd','passed',time()+300); $ps=1; }
Нельзя так делать. У вас сначала выводится форма пароля, а потом устанавливается кука. Нужно, чтобы setcookie был раньше любых операций вывода, в том числе и выше текста вне <? ?> секции.
Не, так ведь логика какая -- в начале скрипта проверяется, корректно ли введен пароль; если некорректно или просто еще не вводился, то $ok=0. Дальше, если $ok==0, то снова выходим на форму ввода пароля, иначе задаем куки и устанавливаем флажок $ps=1.

Offline Upliner

  • Posts: 3730
  • Gender: Male
  • Blanklanugbesto
Понял, не привык просто когда ?> текст<? в if засовывают...
Можно попробовать включить вывод ошибок, добавив в начало
Code: [Select]
error_reporting (E_ALL);
ini_set("display_errors", 1);
и посмотреть, что он выдаст.
Мы, видите ли, винтили вентили аж квинтиллион раз!

Offline zwh

  • Posts: 17763
  • Gender: Male
Понял, не привык просто когда ?> текст<? в if засовывают...
Можно попробовать включить вывод ошибок, добавив в начало
Code: [Select]
error_reporting (E_ALL);
ini_set("display_errors", 1);
и посмотреть, что он выдаст.
Хммм... на строчку
Quote
     $_ck=setcookie('pwd','passed',time()+300); $ps=1; }
вышло сообщение
Quote
Warning: Cannot modify header information - headers already sent by (output started at /home/wm11261/public_html/admin/_connect.php:38) in /home/wm11261/public_html/admin/_pwd.php on line 54
а на строку
Quote
  { $ck=setcookie('pwd','passed',time()+300);
сообщение
Quote
Warning: Cannot modify header information - headers already sent by (output started at /home/wm11261/public_html/admin/_connect.php:38) in /home/wm11261/public_html/admin/alle.php on line 8
Получается, что да -- куки не записываются из-за того, что заголовок страницы уже раньше нв вывод послан.

Offline Upliner

  • Posts: 3730
  • Gender: Male
  • Blanklanugbesto
/home/wm11261/public_html/admin/_pwd.php on line 54
/home/wm11261/public_html/admin/alle.php on line 8
Если в этих строках секции ?>...<? то можно попробовать заменить их на echo. У меня сейчас работает и с этими секциями, но может быть у вас просто не очень удачная версия php, поэтому вылезли проблемы.
Мы, видите ли, винтили вентили аж квинтиллион раз!

Offline zwh

  • Posts: 17763
  • Gender: Male
Че-т чем дальше, тем страннее... Понатыкал я везде проставление кук, чтоб понять, когда же именно они перестают ставиться, и вот чё вышло... Начало скрипта, который запускаю из браузера:
Quote
<?
error_reporting(E_ALL & ~E_DEPRECATED);
ini_set("display_errors", 1);

$ck='-'; $ps=0;
setcookie('1','passed',time()+300);
  require_once('_connect.php');
setcookie('2','passed',time()+300);

setcookie('q','passed',time()+300);

Скрипт _connect.php (логины и пароли забил):
Quote
<?
setcookie('3','passed',time()+300);
   if(($_SERVER['HTTP_HOST']=='localhost'

    || substr($_SERVER['HTTP_HOST'],0,8)=='192.168.'))

   { if(!mysql_connect('','root','root'))

       echo mysql_error();

     else

       if (!mysql_select_db('dead'))       

        echo mysql_error();

   }

   else

   { if(!mysql_connect('localhost','........','.......'))

       echo mysql_error();

     else

       if (!mysql_select_db('.........'))       

        echo mysql_error();

   }
setcookie('4','passed',time()+300);
   mysql_query("SET NAMES 'utf8'");
   mysql_query("SET CHARACTER SET 'utf8'");
setcookie('5','passed',time()+300);
?>

И вот какие куки встали: 1, 3, 4, 5.

Как всё это понимать -- ума не приложу :(

Offline Upliner

  • Posts: 3730
  • Gender: Male
  • Blanklanugbesto
В _сonnect.php никаких пустых символов после ?> нет? Никаких ошибок не выдаёт, просто не ставит куки?
Мы, видите ли, винтили вентили аж квинтиллион раз!

Offline zwh

  • Posts: 17763
  • Gender: Male
В _сonnect.php никаких пустых символов после ?> нет? Никаких ошибок не выдаёт, просто не ставит куки?
Пробелов после '?>' точно нет -- вот как конец этого скрипта выглядит в редакторе FAR'а:

 

With Quick-Reply you can write a post when viewing a topic without loading a new page. You can still use bulletin board code and smileys as you would in a normal post.

Note: this post will not display until it's been approved by a moderator.
Name: Email:
Verification:
Type the letters shown in the picture
Listen to the letters / Request another image
Type the letters shown in the picture:
√49 Напишите ответ строчными буквами:
«Сто одёжек, все без застёжек» — что это?: