Установить куки после того, как вывод был отправлен в браузер - PullRequest
3 голосов
/ 18 сентября 2011

Есть ли способ установить cookie после вывода html?В соответствии с инструкциями PHP setcookie () должен быть установлен перед выводом.

Мне это нужно для моей системы голосования, в которой после успешного запроса Mysql будет установлен cookie.Я сделал это в одном файле.

Ответы [ 8 ]

10 голосов
/ 18 сентября 2011

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

ob_start();
/* set cookie */
ob_end_flush();
5 голосов
/ 18 сентября 2011

Есть ли способ, которым я могу установить cookie после вывода html?

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

В соответствии с руководством по PHP setcookie() должен быть установлен ДО вывода.

Это правильно, иначе это не сработает. Так что я бы даже сказал должен , а не только должен .

Мне это нужно для моей системы голосования, в которой после успешного запроса MySQL будет установлен файл cookie.

Успешный запрос MySQL сам по себе не приведет к выводу. Только неудачный запрос mysql будет, если включен отчет об ошибках. Поэтому мне интересно, действительно ли вы столкнулись с конкретной проблемой или нет.

Сам запрос MySQL не должен мешать вам использовать setcookie.

Если вы уже выполнили вывод HTML до использования setcookie, вам нужно найти место, где начался вывод HTML. Над этой линией разместите функцию ob_start Документы , которая начнет буферизацию вывода.

При включенной буферизации вывода ваша программа все еще может «выводить» HTML, но она не будет отправлена ​​немедленно. Тогда вы сможете без проблем звонить setcookie:

<?php ob_start(); ?>
<html><body>
<?php 
  $result = mysql_run_query($query);
  echo '<h1>Your Voting Results</h1>';
  output_voting_result($result);
  set_cookie('vote', $result['id']);
?>
</body></html>

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

4 голосов
/ 18 сентября 2011

Cookies могут быть установлены в JavaScript на стороне клиента - см. Эту ссылку для примеров: http://www.w3schools.com/js/js_cookies.asp

3 голосов
/ 18 сентября 2011

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

Однако вы можете использовать встроенную буферизацию PHP, чтобы она не генерировала никакого вывода до тех пор, пока сценарий полностью не завершится.

ob_start - это функция , которую вы хотите.

2 голосов
/ 18 сентября 2011

Вы можете использовать выходную буферизацию

ob_start();

// send output
// set cookie

ob_end_flush();
1 голос
/ 18 сентября 2011

Cookies отправляются в браузер как часть заголовка ответа.Это означает, что они должны быть установлены до , когда сервер начинает писать свой ответ на обрабатываемый запрос (чтобы сервер мог указать правильные заголовки в ответе).

Я не знаю особенностей того, как это обрабатывается в PHP, но если бы мне пришлось угадывать, я бы сказал, что выходные данные данного сценария PHP, вероятно, буферизируются сервером (обычно Apache) до тех пор, покасценарий завершается, а затем сервер записывает ответ после завершения выполнения сценария PHP.Если это так, то вы сможете устанавливать файлы cookie в любое время.Если это не так, то вы не сможете.

Я бы предложил просто протестировать его, чтобы увидеть, что происходит.Напишите сценарий PHP, который устанавливает cookie в самом конце его выполнения, получите к нему доступ через браузер, а затем проверьте, действительно ли установлен cookie.

1 голос
/ 18 сентября 2011

Файл cookie устанавливается в заголовке http. Если вы хотите установить cookie для голосования, то вам нужно либо перенаправить заголовок ('Location: ...'), либо у вас может быть небольшой iframe, где вы делаете вызов ajax, который делает то же самое. вещь.

0 голосов
/ 22 ноября 2016

Если по какой-то причине вы не можете буферизовать вывод, вы можете установить cookie после отправки вывода, отображая изображение на текущей странице, которое обращается к скрипту, который устанавливает cookie.

echo ('<img src="http://example.com/mysetcookie.php?uid='.$userId.'">');

mysetcookie.php

<?php
setcookie('cookie-name',$_REQUEST['uid']);
//output an image - this is a one-pixel clear image
header('Content-Type: image/gif');
echo base64_decode('R0lGODlhAQABAJAAAP8AAAAAACH5BAUQAAAALAAAAAABAAEAAAICBAEAOw==');     
exit;
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...