Возможный дубликат:
Заголовки, уже отправленные 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" />