Есть ли способ, которым я могу установить cookie после вывода html? Согласно руководству PHP, setcookie () должен быть установлен перед выходом.
Мне нужно это для моей системы голосования, в которой cookie будет установлен после успешного запроса Mysql. Я сделал это в одном файле.
вы можете использовать выходные буферы, так что в верхней части вашего скрипта вы добавляете ob_start (), и это создаст буфер, и вы сможете затем установить куки-файл, а затем завершить буфер и вывести его в браузер.
ob_start(); /* set cookie */ ob_end_flush();
Есть ли способ, которым я могу установить cookie после вывода html?
Технически нет. Если вы хотите установить файл cookie, вам необходимо убедиться, что в браузер не был отправлен вывод.
Согласно руководству PHP,
setcookie()
должен быть установлен до выхода.
Это правильно, иначе это не сработает. Поэтому я бы даже сказал, что должен , не только должен .
Мне нужно это для моей системы голосования, в которой cookie будет установлен после успешного запроса mysql.
Успешный mysql-запрос сам по себе не создаст никакого вывода. Только сбойный запрос mysql будет включен, если отчет об ошибках включен. Поэтому я задаюсь вопросом, действительно ли вы столкнулись с конкретной проблемой или нет.
Сам запрос mysql не должен мешать вам использовать setcookie
.
Если вы уже сделали вывод HTML перед использованием setcookie
вам нужно найти место, где начался вывод HTML. Над этой строкой помещается функция ob_start
Docs, которая начнет буферизацию вывода.
При включенной буферизации вывода ваша программа все еще может «выводить» 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>
Буфер вывода будет автоматически отправляться в браузер, когда ваш скрипт заканчивается, поэтому вам не нужно уделять больше внимания, а остальные работают автоматически.
Куки-файлы можно установить в JavaScript на стороне клиента – см. Эту ссылку для примеров: http://www.w3schools.com/js/js_cookies.asp
Нет. Cookies отправляются в заголовке, поэтому они должны быть установлены до начала вывода.
Однако вы можете использовать встроенную буферизацию PHP, поэтому на самом деле она не будет генерировать какой-либо вывод, пока скрипт полностью не завершит выполнение.
ob_start
– это функция, которую вы хотите.
Файл cookie устанавливается в заголовке http. Если то, что вы хотите сделать, это установить cookie на голосование, тогда вам нужно либо сделать заголовок («Местоположение: …») перенаправлять, либо у вас может быть небольшой iframe, где вы делаете вызов ajax, который делает то же самое вещь.
Куки-файлы отправляются в браузер как часть заголовка ответа. Это означает, что они должны быть установлены до того, как сервер начнет писать свой ответ на обрабатываемый запрос (чтобы сервер мог указать правильные заголовки ответа).
Я не знаю специфики того, как это обрабатывается в PHP, но если бы я должен был догадаться, я бы сказал, что вывод данного PHP-скрипта, вероятно, буферизуется сервером (обычно Apache) до завершения скрипта, а затем сервер записывает ответ после завершения сценария PHP. Если это так, то вы должны иметь возможность устанавливать файлы cookie, когда захотите. Если это не так, тогда вы не сможете.
Я бы предложил просто проверить его, чтобы посмотреть, что произойдет. Напишите PHP-скрипт, который устанавливает куки-файл в самом конце его выполнения, обращается к нему через браузер, а затем проверяет, действительно ли файл cookie установлен.
Вы можете использовать выходную буферизацию
ob_start(); // send output // set cookie ob_end_flush();
Если по какой-то причине вы не можете буферировать вывод, вы можете установить 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; ?>