Сессии PHP - Предупреждения - PullRequest
       5

Сессии PHP - Предупреждения

0 голосов
/ 04 августа 2009

Вчера я задал вопрос "предупреждение php - заголовки уже отправлены после перемещения сервера", и с тех пор я внес изменения, чтобы попытаться исправить проблему, но я все еще не получаю ее!

Я работаю над кодом, созданным другой компанией! Я не перемещаю сайт со своего сервера и не помещаю его на наш, но моя проблема в том, что сеансы не работают через страницы на новом сервере!

Я получаю предупреждение:

Предупреждение: session_start () [function.session-start]: невозможно отправить сеанс ограничитель кэша - заголовки уже отправлены (вывод начался с /home/com10002/public_html/bank/index.php:28) в /home/com10002/public_html/bank/includes/quickform.php в строке 3

В моем index.php

include('includes/functions.php');

$activeTab = "navhome"; 
$sent = false;

$title = (isset($_GET['title']))? mysql_real_escape_string($_GET['title']) : 'Home';    
$title = str_replace('-',' ', $title);

if($title != '') {  

    $sql = "SELECT * 
            FROM contents 
            WHERE name LIKE '%$title%'
            LIMIT 1";

    $result = @mysql_query($sql);       
    $row = mysql_fetch_assoc($result);      
}

//Set page title
$pagetitle = (isset($row['name']) && $title != 'Home')? ucwords($row['name']) : "Bank Charges";

HTML..HEAD..META DATA AND TITLE TAGS..ECT

include('includes/header.php');

    <div class="textarea">
        <?php include('includes/rightcol.php'); ?>
        <div id="contentvideo" style="display:none;"></div>
        <h1><?=$row['h1'];?></h1>
        <h2><?=$row['h2'];?></h2>
        <?=$row['intro'];?> 

        <?php  include('includes/quickform.php');?>

        <?=$row['page_content'];?>          
    </div>

    <?php include('includes/subnav.php'); ?>    

и в quickform.php

if($_POST) {
    session_start();
    $error = false; 
    $captcha = false;
    $sent = false;
etc.......

Это их код и в настоящее время отлично работает на их сервере!

1) Я пытался переместить session_start() на вершину index.php 2) Размещение сеанса на обеих страницах. 3) Удаление пробелов перед сеансом, когда он был в index.php

Моя новая версия сайта на www.compensation-claims.org/bank

Поскольку это не мой код, я не уверен, почему они поместили сеанс в quickform.php

Ответы [ 3 ]

0 голосов
/ 05 августа 2009

Похоже, что возвращение символа UNIX отправляется в браузер из-за того, что Windows по-разному обрабатывает возврат каретки. Один или несколько символов, отправленных перед отправкой заголовков, приведут к возникновению этой ошибки. Альтернативой может быть то, что на другом сервере была включена буферизация вывода с помощью директивы php.ini, которая собирала и анализировала любой вывод перед отправкой его клиенту. Это могло бы иметь место по причинам сжатия. Я бы предложил сравнить конфигурацию php.ini и посмотреть, было ли включено сжатие gzip на сервере Apache до переезда.

0 голосов
/ 13 января 2011

Вы можете использовать функцию ini_set () в вашем скрипте для установки значений конфигурации php.ini.

ini_set('output_buffering', 4096);
0 голосов
/ 04 августа 2009

Быстрое и грязное исправление - активировать output_buffering на вашем сервере, изменив файл php.ini (и перезапустив Apache) , установив что-то вроде этого:

output_buffering=4096

Ваша проблема в том, что HTTP-заголовки не могут быть отправлены, даже если был отправлен только 1 символ; используя эту директиву, вы указываете, что ничего не следует отправлять до того, как буферизуются 4 КБ данных.

Этого обычно достаточно, чтобы буферизовать некоторые пробелы, которые присутствуют в начале / конце файлов .php, и этого достаточно, чтобы вызвать такую ​​проблему.

Примечание: это быстрое и грязное исправление, но оно может помочь вам заставить приложение работать.

Конечно, лучшим решением было бы удалить любой вид вывода, который отправляется перед вызовом session_start /, или переместить вызов на session_start в начало вашего PHP-скрипта.
Одна вещь, которая часто помогает, это удалить закрывающий тег ?> в конце .php файлов, чтобы после него не было пробелов, поскольку он больше не существует (да это совершенно верно)


РЕДАКТИРОВАТЬ после повторного просмотра заданного кода:

In header.php:

  • Вы делаете вывод (HTML-код, например, div "textarea")
  • И только тогда вы начинаете сеанс с session_start
    • , поскольку некоторые выходные данные уже отправлены в браузер, session_start не может создать cookie и завершается ошибкой.

Итак, вам действительно нужно переместить session_start как можно выше : но это, например, в начале index.php; или, может быть, чтобы получить его везде, на вершине functions.php ...

... Но точно НЕ в середине некоторого вывода HTML!

(То, что я говорил ранее о output_buffering, возможно, является причиной того, почему этот (не очень хороший) код работал раньше)

Это должно решить проблему, я думаю ...
В любом случае, удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...