質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

1528閲覧

cookieの保存、phpは「あらゆる出力前」だけど、javascriptはいつでも大丈夫?

退会済みユーザー

退会済みユーザー

総合スコア0

Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

3クリップ

投稿2022/06/07 02:13

PHPのマニュアルによると
setcookie() は、その他のヘッダ情報と共に 送信するクッキーを定義します。 ほかのヘッダ情報と同様に、 クッキーは、スクリプトによる他のあらゆる出力よりも前に 送信される必要があります(これはHTTPプロトコルの制約です)。 <html> や <head> タグはもちろん 空白も含め、あらゆる出力よりも前にこの関数をコールするようにしなければなりません。

Javascriptで下記のコードを書いてみました。ヘッダー、bodyを出力後にcookieの操作が可能に思えます。

javascript

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4<meta charset="UTF-8"> 5<title>cookie test</title> 6</head> 7<body> 8cookie test! 9<script> 10let number = Math.floor( Math.random() * 99999999999 ) ; 11console.log('number_'+number); 12document.cookie = 'number_'+number+'=saved'; 13console.log(document.cookie); 14</script> 15</body> 16</html>

リロードを何回しても、ちゃんと保存されるし、呼び出せます。
イメージ説明

他の言語についてもなにか制限があるのかと思ったのですが、詳しくないためか(あるいは制限がないのか)、同じような「あらゆる出力よりも前にこの関数をコールする」というものを見つけられませんでした。

phpの(これはHTTPプロトコルの制約です)とあるのですが、あらゆる出力よりも前にこの関数をコールする はphp言語ならではの仕様ということなのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

PHPのマニュアルによると

質問者さんの言うのはこれ ↓ のことですよね?

setcookie
https://www.php.net/manual/ja/function.setcookie.php

それは Web サーバーの PHP のコードで応答ヘッダに Set-Cookie ヘッダを含めてクライアントに返すときの話でしょう。

マニュアル通りにやれば以下のように応答ヘッダに Cookie が含まれてクライアントに送信されるはずです(Fiddler による要求・応答のキャプチャ結果)。

イメージ説明

マニュアルが言う、

"ほかのヘッダ情報と同様に、 クッキーは、スクリプトによる他のあらゆる出力よりも前に 送信される必要があります(これはHTTPプロトコルの制約です)。 <html><head> タグはもちろん 空白も含め、あらゆる出力よりも前にこの関数をコールするようにしなければなりません"

・・・というのはこういうことだと思います。

投稿2022/06/07 03:15

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/06/07 07:24

回答ありがとございます。 はい、ご指摘のページから抜粋しました。 なぜPHPには制限があるのか不思議に思っていましたが、サーバー側の処理ですから、処理が渡される前(ヘッダー送信時)に処理しなければならないという感じですね。
guest

0

ベストアンサー

サーバー側で実行する言語全てにおいて、
webブラウザへのHTTPレスポンスを送信する際の仕様というか制約だと思います。

JavaScript(ECMAScript)はそもそもwebブラウザ上で実行していて、
webブラウザが管理しているCookieにもいつでもアクセスできます。
その一方、
PHPなどのwebサーバー側で実行する言語の処理は
HTTPリクエストを受信して処理を実行し、
HTTPレスポンスを送信する時にしかCookie保持の指示ができません。

webブラウザがHTTPリクエストを送信する際に、
Cookieをwebブラウザに持たされていれば、
HTTPリクエストを送信する際に一緒にCookieも送信する仕組みです。

この記事がわかりやすいです:
Cookieとセッション管理 - Qiita


phpはHTML出力がかかってしまうと、
適切な区切りで自動的にHTMLレスポンスを始めてしまうため、
始まってしまうと
もうHTMLレスポンスヘッダーへの(Cookie付与のための)介入ができなくなります。

phpの終了タグや素のHTMLタグやphpでのechoやprintなどを実行する前に
HTTPレスポンスヘッダー周りをやっておく必要があります。
カラの改行の出力ですら正直にHTTPレスポンスとして出力してしまいますので。

投稿2022/06/07 02:31

編集2022/06/07 04:21
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/06/07 07:22

ありがとうございます。 サーバー側からの処理と、クライアント側(WEBブラウザ上)による違いですね。 この点を完全に見落としていました。
guest

0

(1)ブラウザに設定されたクッキーは要求ヘッダにのってサーバーに伝達されます
(2)サーバー側でブラウザからのクッキーを利用してもよし、独自にクッキーを設定してもよし
(3)HTMLの本文が送信される前の応答ヘッダにのってサーバーがで設定されたクッキーが戻されます
(4)HTMLヘッダ送信後に本文が送信されます

(3)/(4)の関係で、HTMLが出力されてしまうとサーバーからクッキーを返すことができません

投稿2022/06/07 04:12

yambejp

総合スコア114767

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問