Невозможно изменить информацию заголовка

Возможный дубликат:
Заголовки, уже отправленные PHP

Я получаю следующую ошибку из следующего кода, и я не совсем уверен, почему. Если бы вы могли сказать мне, как это исправить, это было бы здорово. Заранее спасибо.

Предупреждение. Невозможно изменить информацию заголовка – заголовки, уже отправленные (вывод запущен в …) в строке 45.

<?php // Initialization $conn = mysql_connect(DB_HOST,DB_USER,DB_PASSWORD); mysql_select_db(DB_NAME, $conn); // Error checking if(!$conn) { die('Could not connect ' . mysql_error()); } // Localize the GET variables $ref = isset($_GET['ref']) ? $_GET['ref'] : ""; // Protect against sql injections // Insert the score $retval = mysql_query("INSERT INTO $table( site ) VALUES ( '$ref' )",$conn); if($retval) { echo "Successfull"; } else { echo "Unsuccessfull " . mysql_error(); } mysql_close($conn); ?> <?php $url = $_GET['url']; $loc = 'Location: '. $url; header($loc); exit; ?> 

Выньте эхо-сигналы, вы не можете отправлять информацию в браузер перед заголовками.

Вы можете попробовать что-то подобное, чтобы показать, произошла ли ошибка:

 if(!$retval) { echo "Unsuccessfull " . mysql_error(); } 

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

то есть.

 if($retval) { echo "Successfull"; } else { echo "Unsuccessfull " . mysql_error(); } 

Выводит текст перед изменением заголовков.

Использовать выходные буферы: http://php.net/manual/en/function.ob-start.php

 ob_start(); 

в начале и

 ob_end_flush(); 

в конце.

То, что я обычно рекомендую для подобных ситуаций, – это сохранение всех результатов до конца, как упоминалось gmadd, вы можете сделать ob_start , но я предпочитаю хранить данные в строке без необходимости добавления дополнительного кода (я знаю, что вы также можете назначьте это в файле .htaccess, я бы пошел по этому маршруту, добавив фактические объекты ob_start ).

Что я буду делать:

 $display = ""; // initiate the display string // etc doe here if($retval) { $display .= "Successfull"; } else { $display .= "Unsuccessfull " . mysql_error(); } // end of the script right before ?> echo $display; ?> 

Метод ob_start работает, и если вы хотите пройти этот маршрут, вы можете добавить его в файл .htaccess (учитывая, что allowoverride установлен в настройке apache):

 php_value output_buffering On 

Опять же, я по-прежнему рекомендую метод хранения $display , но это мое личное мнение.

Использование:

 <meta http-equiv="Refresh" content="0;url=http://www.example.com" />