PHP - проблема с куки / setcookie - PullRequest
       1

PHP - проблема с куки / setcookie

0 голосов
/ 10 декабря 2010

У меня проблемы со следующим кодом: http://pastebin.com/MCkhzQjs

Это работает локально (на локальном хосте), но когда я загружаю его на сервер, он не входит в систему.Я думаю, что это связано с тем, что куки не отправляются.Мета-обновление таково, что страница обновляется после установки cookie.Спасибо за любую помощь.

Ответы [ 3 ]

3 голосов
/ 10 декабря 2010

ответ прост.

Вы можете устанавливать файлы cookie, запускать сеансы, устанавливать заголовки только в том случае, если содержимое не было отправлено или отправлено (включая html) за пределы блоков кода php.

Примеры:

Не будет работать:

<div>
<?php setcookie(/*....*/); ?>
</div>

Причина: поскольку <div> уже отправлено, что заставляет отправлять заголовки, файлы cookie не могут быть добавлены в заголовки, поскольку отправлено

Другой:

<?php
    setcookie(/*....*/); //works
    echo "test";
    setcookie(/*....*/); //does not
?>

Ваш код должен выглядеть так:

$title = "Admin panel";
if(!isset($_COOKIE['login'])) $_COOKIE['login'] = false;
if(!isset($_POST['password'])) $_POST['password'] = false;

if($_POST['password'] == "tt83df")
{
    if(isset($_POST['permlog']))
    {
        $expire = time()+60*60*24*365;
        setcookie("login", "tt83df", $expire, "/admin");
    }
    else
    {
        setcookie("login", "tt83df", 0, "/admin");
    }
    header("Location: " . $_SERVER['PHP_SELF']);
    exit;//Stop here and SEND Headers
}
if($_COOKIE['login'] == "tt83df")
{
    $html = '<ul><li><a href="news_panel.php">News control panel</a></li><li><a href="video_panel.php">Video control panel</a></li><li><a href="schedule_panel.php">Schedule control panel</a></li>
    <li><a href="events_panel.php">Events control panel</a></li><li><a href="notices_panel.php">Notices control panel</a></li></ul>';
}else
{
    $html = 'Password:<form method="post"><input type="password" name="password" /><input type="submit" value="Submit"><br />
        <input type="checkbox" name="permlog" value="true" /> Stay logged in? (do not use on a public computer)</form>';
}
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="icon" type="image/vnd.microsoft.icon" href="images/favicon.ico" /> 
<title><?php echo $title; ?></title>
</head>
<body>
<?php echo $html; ?>
</body>
</html>
1 голос
/ 10 декабря 2010

Я думаю, что проблема заключается в установке cookie после записи HTML в выходной поток.Cookies или изменения заголовка могут быть сделаны только перед отправкой заголовка.Запись содержимого в выходной поток приводит к автоматической записи заголовка.

Попробуйте использовать ob_start(); вверху кода и ob_end_flush(); внизу.Это инициализирует буфер, который будет заполнен всем, что записано в ваш выходной поток.Так в основном.ob_start для инициализации выходного буфера и ob_end_flush для записи буфера обратно клиенту.

1 голос
/ 10 декабря 2010

Включена ли ошибка error_reporting?Ваш код содержит пробелы перед первым php-тэгом, что является выходом и вынуждает сервер отправлять заголовки (error_reporting должен уведомить вас об этом).

...