Главное меню
Мы солидарны с Украиной. Узнайте здесь, как можно поддержать Украину.

почему эта команда в PHP не работает?

Автор zwh, марта 20, 2019, 16:00

0 Пользователи и 1 гость просматривают эту тему.


Bhudh

Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Upliner

Sancta Maria, Mater Dei, ora pro nobis peccatoribus, nunc et in hora mortis nostrae.

zwh

Написано:
Цитировать
$ps=0;
   }
   else
{
     $_ck=setcookie('pwd','passed',time()+300); $ps=1; }

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

Bhudh

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

Upliner

У меня всё работает

<?php
if (true) {
    
$_ck=setcookie('pwd','passed',time()+300);
}
$ps=1;
echo(
"\$ck=$ck, \$_ck=$_ck, \$ps=$ps");
?>


Выдаёт

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
Sancta Maria, Mater Dei, ora pro nobis peccatoribus, nunc et in hora mortis nostrae.

zwh

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

Короче, вот сокращенный код странички:
Цитировать
<? $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 (тоже в сокращении):
Цитировать
<? 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');
?>

Upliner

Цитировать{Форма ввода пароля}

<? $ps=0;
   }
   else
{
     $_ck=setcookie('pwd','passed',time()+300); $ps=1; }
Нельзя так делать. У вас сначала выводится форма пароля, а потом устанавливается кука. Нужно, чтобы setcookie был раньше любых операций вывода, в том числе и выше текста вне <? ?> секции.
Sancta Maria, Mater Dei, ora pro nobis peccatoribus, nunc et in hora mortis nostrae.

zwh

Цитата: Upliner от марта 20, 2019, 22:59
Цитировать{Форма ввода пароля}

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

Upliner

Понял, не привык просто когда ?> текст<? в if засовывают...
Можно попробовать включить вывод ошибок, добавив в начало

error_reporting (E_ALL);
ini_set("display_errors", 1);

и посмотреть, что он выдаст.
Sancta Maria, Mater Dei, ora pro nobis peccatoribus, nunc et in hora mortis nostrae.

zwh

Цитата: Upliner от марта 21, 2019, 15:03
Понял, не привык просто когда ?> текст<? в if засовывают...
Можно попробовать включить вывод ошибок, добавив в начало

error_reporting (E_ALL);
ini_set("display_errors", 1);

и посмотреть, что он выдаст.
Хммм... на строчку
Цитировать
     $_ck=setcookie('pwd','passed',time()+300); $ps=1; }
вышло сообщение
Цитировать
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
а на строку
Цитировать
  { $ck=setcookie('pwd','passed',time()+300);
сообщение
Цитировать
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
Получается, что да -- куки не записываются из-за того, что заголовок страницы уже раньше нв вывод послан.

Upliner

Цитата: zwh от марта 21, 2019, 21:35
/home/wm11261/public_html/admin/_pwd.php on line 54
/home/wm11261/public_html/admin/alle.php on line 8
Если в этих строках секции ?>...<? то можно попробовать заменить их на echo. У меня сейчас работает и с этими секциями, но может быть у вас просто не очень удачная версия php, поэтому вылезли проблемы.
Sancta Maria, Mater Dei, ora pro nobis peccatoribus, nunc et in hora mortis nostrae.

zwh

Че-т чем дальше, тем страннее... Понатыкал я везде проставление кук, чтоб понять, когда же именно они перестают ставиться, и вот чё вышло... Начало скрипта, который запускаю из браузера:
Цитировать
<?
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 (логины и пароли забил):
Цитировать
<?
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.

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

Upliner

В _сonnect.php никаких пустых символов после ?> нет? Никаких ошибок не выдаёт, просто не ставит куки?
Sancta Maria, Mater Dei, ora pro nobis peccatoribus, nunc et in hora mortis nostrae.

zwh

Цитата: Upliner от марта 23, 2019, 23:55
В _сonnect.php никаких пустых символов после ?> нет? Никаких ошибок не выдаёт, просто не ставит куки?
Пробелов после '?>' точно нет -- вот как конец этого скрипта выглядит в редакторе FAR'а:

Быстрый ответ

Обратите внимание: данное сообщение не будет отображаться, пока модератор не одобрит его.

Имя:
Имейл:
Проверка:
Оставьте это поле пустым:
Наберите символы, которые изображены на картинке
Прослушать / Запросить другое изображение

Наберите символы, которые изображены на картинке:

√36:
ALT+S — отправить
ALT+P — предварительный просмотр