PHP setcookie предупреждение - PullRequest
1 голос
/ 20 марта 2011

У меня проблема с 'setcookie' в PHP, и я не могу ее решить.

, поэтому я получаю эту ошибку "Предупреждение: невозможно изменить информацию заголовка - заголовки уже отправлены (вывод начался с C:\ Program Files \ VertrigoServ \ www \ voice.php: 14) в C: \ Program Files \ VertrigoServ \ www \ voice.php в строке 86 "

, и вот файл .. строка 86 - это setcookie ($ cookie_name, 1, time () + 86400, '/', '', 0);Есть ли другой способ сделать это?

<html>
<head>
<title>Ranking</title>
<link href="style.css" rel="stylesheet" type="text/css">
</head>
<body bgcolor="#EEF0FF">
<div align="center"> 
<br/> 
<div align="center"><div id="header"></div></div>
<br/> 
<table width="800" border="0" align="center" cellpadding="5" cellspacing="0" class="mid-table"> 
    <tr><td height="5">
        <center> 
            </tr> 
            </table> 
        </center> 
    </td></tr> 
    <tr><td height="5"></td></tr> 
</table> 
<br/> 
<?php
    include "conf.php";

    $id = $_GET['id'];
    if (!isset($_POST['submitted']))
    {
        if (isset($_GET['id']) && is_numeric($_GET['id']))
        {

                    </div></td></tr> 
                    <tr><td align="center" valign="top"><img src="images/ads/top_banner.png"></td></tr> 
                </table> 
            </form> 
            <?php
        }
        else
        {
            echo '<font color="red">You must select a valid server to vote for it!</font>';
        }
    }
    else
    {
        $kod=$_POST['kod'];
        if($kod!=$_COOKIE[imgcodepage])
        {
            echo "The code does not match";
        }
        else
        {
            $id = mysql_real_escape_string($_POST['id']);
            $query = "SELECT SQL_CACHE id, votes FROM s_servers WHERE id = $id";
            $result = mysql_query($query) OR die(mysql_error());
            $row = mysql_fetch_array($result, MYSQL_ASSOC);
            $votes = $row['votes'];
            $id = $row['id'];
            $cookie_name = 'vote_'.$id;
            $ip = $_SERVER['REMOTE_ADDR'];
            $ltime = mysql_fetch_assoc(mysql_query("SELECT SQL_CACHE `time` FROM `s_votes` WHERE `sid`='$id' AND `ip`='$ip'"));
            $ltime = $ltime['time'] + 86400;
            $time = time();

            if (isset($_COOKIE['vote_'.$id]) OR $ltime > $time)
            {
                echo 'You have already voted in last 24 hours! Your vote is not recorded.';
            }
            else
            {
                $votes++;
                $query = "UPDATE s_servers SET votes = $votes WHERE id = $id";
                $time = time();
                $query2 = mysql_query("INSERT INTO `s_votes` (`ip`, `time`, `sid`) VALUES ('$ip', '$time', '$id')");
                $result = mysql_query($query) OR die(mysql_error());
                setcookie ($cookie_name, 1, time()+86400, '/', '', 0);
            }
        }
    }
?>
<p><a href="index.php">[Click here if you don't want to vote]</a></p><br/>
<p><a href="index.php">Ranking.net</a> &copy; 2010-2011<br> </p> 
</div> 
</body> 
</html> 

Спасибо большое!

Ответы [ 5 ]

4 голосов
/ 20 марта 2011

Вы не можете иметь любой вывод до header() и setcookie() вызовов.

https://stackoverflow.com/search?q=+headers+already+sent+by
https://stackoverflow.com/tags/php/info

Любой вывод включает любой <html> до открытия <?php маркера или любого print или echo содержимого.Другим виновником является спецификация UTF-8 http://en.wikipedia.org/wiki/Byte_Order_Mark, которую большинство текстовых редакторов не отображают, но смущает PHP в начале файлов.

2 голосов
/ 20 марта 2011

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

Вы должны поместить код PHP перед HTMLразметки, чтобы вы могли вызывать setcookie перед отправкой любого вывода, а также отделять PHP-код от представления, что вы должны сделать в любом случае.

1 голос
/ 20 марта 2011

Вы должны поместить cookie-код вверху страницы.Лучшая компоновка будет выглядеть примерно так:

<?php
//include config

//check posted data (included settings cookies)


//set needed variables
?>
<html>
.....

Вы также можете разделить код php и html.Это вообще то, что я делаю.Обычно я использую класс представления или (в прошлом) smarty.но быстрый пример - добавить этот код внизу приведенного выше кода php и избавиться от html:

<?php               

  if(empty($tpl)) {
    $tpl = 'index';
  }

  if(file_exists("template/{$tpl}.tpl.php")) {
    include("template/{$tpl}.tpl.php");
  }
  else {
    header('Location: /');
  }

?>

. Вам нужно будет создать каталог с именем 'templates' и добавить код html.к файлам, которые заканчиваются на расширение .tpl.php.На самом деле они просто php-страницы, но .tpl.Часть поможет вам вспомнить, что его просто разметить.Сделайте их php-страницами (не html), чтобы вы могли выводить переменные

Тогда в ваших частях varios кода выше вы должны установить $ tpl как шаблон, который вы хотите загрузить.

Это просто базовый фрагмент кода, но он должен дать вам общее представление о том, как разделить эти данные.Основная идея заключается в том, что весь html и текст будут выводиться «после» всего программного кода.

0 голосов
/ 19 апреля 2012

Вы не можете использовать PHP, чтобы установить cookie после вывода чего-либо, и HTML-код перед первым тегом php считается как выходной. чтобы придерживаться чисто php-метода, вам нужно будет полностью перейти к определению того, что помещать в cookie, и настройке его на самый верх. или то, что я делаю в ситуациях, когда для этого требуется много дополнительной работы, это заставить php выводить код JavaScript для установки cookie. Теперь, если вы сделаете или получите хорошую функцию настройки JS cookie и либо вставите ее, либо добавите ссылку на страницу. тогда все, что вам нужно сделать, это заставить php echo вызвать функцию с соответствующими данными в этой точке. затем, когда страница загружается, тогда как php по-прежнему не устанавливает cookie, но когда браузер запускает код js, он будет. и таким образом вы получаете то, что вы хотите, печенье установлено. и вам не нужно было поднимать вещи наверх.

0 голосов
/ 20 марта 2011

Что вам нужно сделать, это создать хороший буфер для хранения всех заголовков, пока вы не завершите обработку. ob_start делает всю работу за вас, и здесь есть ссылка на нее. http://php.net/manual/en/function.ob-start.php

Когда вы закончите загрузку всех различных заголовков, используйте ob_get_contents, как это $text = ob_get_contents(); echo($text); ob_end_clean();

Надеюсь, это поможет.

...