PHP заголовок и выходная буферизация не работают - PullRequest
2 голосов
/ 17 мая 2011

Я не совсем понимаю, как работает буферизация вывода с функцией заголовка PHP.

Вот мой код:

session_start();

header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');

require_once ($_SERVER['DOCUMENT_ROOT'] . '/classes/database.php');
require_once ($_SERVER['DOCUMENT_ROOT'] . '/classes/functions.php');

$db = new Database();
$db->open_connection(); // to database
$query = 'SELECT * FROM english WHERE id = ' . mysql_real_escape_string($_GET['dealerID']);
$result = mysql_query($query) or die(mysql_error());
$row = mysql_fetch_array($result);
ob_start();
ob_flush();
header('http://www.domain.com/channel-partners/en/index.php?dealerID=' . $row['id'] . '&location=' . $row['location_url'] . '&name=' . $row['name_url']);   
ob_end_flush();

Это не работает. Я получаю сообщение об ошибке "заголовки уже отправлены". Я знаю, что у меня не может быть никакого вывода до того, как я вызову команду header, но я подумал, что если бы я использовал ob_start (), у меня мог бы быть вывод до вызова команды. Очевидно, я ошибаюсь, но я не знаю, как исправить этот код, чтобы я мог использовать session_start () там, где он должен быть, открыть соединение с моей базой данных и затем вызвать перенаправление. Может кто-нибудь помочь? Благодарю.

Ответы [ 4 ]

5 голосов
/ 17 мая 2011

Удалить звонок на ob_flush(). Это отправляет вывод в ответ и не позволяет вам устанавливать дополнительные заголовки.

Кроме того, вы должны закодировать параметры строки запроса:

header('http://www.domain.com/channel-partners/en/index.php?dealerID=' . urlencode($row['id']) . '&location=' . urlencode($row['location_url']) . '&name=' . urlencode($row['name_url']));

Или, еще лучше, используйте функцию http_build_query():

$params = array("dealerID"=>$row['id'], "location"=>row['location_url'], "name"=>$row['name_url']);
header('http://www.domain.com/channel-partners/en/index.php?' . http_build_query($params));

EDIT:

Еще одна вещь. Вы не экранируете идентификатор дилера должным образом в строке запроса. Функция mysql_real_escape_string() полезна только для строк SQL. Это не полезно для числовых значений. Используйте функцию ctype_digit(), чтобы проверить, является ли параметр dealerID числом:

$dealerID = $_GET['dealerID'];
if (!ctype_digit($dealerID)){
  die('Invalid value for "dealerID" parameter.');
}
0 голосов
/ 17 мая 2011

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

if (headers_sent($file, $line)) { 
   echo "Headers were sent at file=$file, line=$line";
}

Это должно позволить вам отладить проблему

0 голосов
/ 17 мая 2011

Попробуй поставить ob_start ();прямо в верхней части вашего сценария.

0 голосов
/ 17 мая 2011

Я знаю, что у меня не может быть никакого вывода до того, как я вызову команду header, но я подумал, что если бы я использовал ob_start (), у меня мог бы быть вывод до вызова команды.

Можно, но вы звоните ob_flush() до вызова заголовка, который отправляет вывод в браузер. Зачем? Возьмите вызов ob_flush(), и он должен работать точно так, как задумано.

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