Установить файл cookie после отправки в браузер

Есть ли способ, которым я могу установить 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; ?>