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

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

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

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

Q&A

解決済

1回答

5330閲覧

session_start()と[SESSION][PHPSESSID]について

toutou

総合スコア2050

PHP

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

0グッド

0クリップ

投稿2016/09/18 17:43

編集2016/09/19 04:24

ウェブの葉の7行目の説明について質問したいです。赤のところで始めは空白になっていますという説明があります。たしかに上のほうのサンプルでは空白になっていますが、自分でやったところ「Undefined index: PHPSESSID」がでます。これはありませんという意味という認識はしています。
cookieを見てみるとサンプルのほうはcookieが1個あるのに対し、自分のほうにはcookieが0となっています。両方とも一回cookie消してまた開いて確認しました。サーバ/セッションIDのほうはきちんと表示されています。なぜサンプル品のほうはきちんとエラーなしで表示されているんでしょうか?何が違うんでしょうか?
また、$_COOKIE['PHPSESSID']はスーパーグローバル変数という考えでいいんでしょうか?
PHPの公式のほうを探しましたが見つからず、名前を変えると使えなくなることは確認してるのでよくわからないです。

自分で作ったやつです。ほぼコピペ。

php

1<?php 2 session_start(); 3 header("Content-type: text/html; charset=utf-8"); 4?> 5<html > 6<head> 7<title></title> 8</head> 9<body> 10<?php 11 12 13 14echo "<p>サーバ/セッションIDは " . session_id() ." です。</p>"; 15echo "<p>クッキー/セッションIDは " .$_COOKIE['PHPSESSID'] ." です。</p>"; 16 17if (!isset($_SESSION['name'])){ 18 19 echo "<p>こんにちは!ページをリロードして下さい。</p>"; 20 21 $_SESSION['name'] = "Webの葉"; 22 23}else{ 24 echo "<p>".$_SESSION['name'] ."さん、こんにちは</p>"; 25 26 echo "<a href='session2.php'>次ページへ</a>"; 27} 28 29 ?> 30</body> 31</html>

設定2

設定

php

1<?php 2setcookie('foo', 'hoge'); 3?> 4<?php 5session_start(); 6 7header("Content-type: text/html; charset=utf-8"); 8 9echo "<p>サーバ/セッションIDは " . session_id() ." です。</p>"; 10echo "<p>クッキー/セッションIDは " .$_COOKIE['PHPSESSID'] ." です。</p>"; 11 12if (!isset($_SESSION['name'])){ 13 14 echo "<p>こんにちは!ページをリロードして下さい。</p>"; 15 16 $_SESSION['name'] = "Webの葉"; 17 18}else{ 19 echo "<p>".$_SESSION['name'] ."さん、こんにちは</p>"; 20 21 echo "<a href='session2.php'>次ページへ</a>"; 22} 23?> 24

みてる
質問が二つになってしまいましたが、お答えのほうをよろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

コードを比較してみましたが、同じなので動作上の違いもないと思います。
自分の環境でやってみたところ、参考サイトどおりに動きましたよ。

なお、Notice: Undefined indexが出る点については、php.iniの設定によるものだと思います
display_errors=OFFだとNoticeはでずNULLになるので、参考サイトのように表示されると思います。

あと、$_COOKIEはスーパーグローバル変数です。
PHPSESSIDというセッション名は、php.ini等で設定されています。マニュアル参照

投稿2016/09/18 21:56

編集2016/09/18 22:06
popobot

総合スコア6586

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

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

toutou

2016/09/18 23:34

設定ということは自分の環境だとエラーを吐くという環境ですよね。これは見てるサイトでも同じコードなので、実は同じエラーが起こっており、それが見えていないだけという解釈ですかね。そうなってしまうとなぜ、このコードを参考図にしたのかという違う疑問も生まれますがそれは無視します。聞きたいのはエラーがあっても、表面上動いてさえいれば見てる人には関係ないというですか?これはよくあることなんですか?ということです。
toutou

2016/09/18 23:38

すいません、あとCookieの数の疑問も出来れば解決したいんですが答えわかりますか?
popobot

2016/09/19 00:31 編集

一般的には、本番環境ではたとえPHPでエラーが起きても、画面に表示させたくないので、display_errors=OFFとします。逆に開発環境ではエラーがあったらすぐに見つかるようにdisplay_errors=ONとするのが普通です。もし参考サイトと同じにしたいなら、php.iniを編集してdisplay_errors=OFFとしてみてください。
popobot

2016/09/19 00:33 編集

cookieはなんでしょうね...コードが同じなら動作は同じだと思いますよ。Cookieをどう確認しているのでしょうか。
toutou

2016/09/19 00:40

確認方法はサイトのURLの左にあるびっくりマークだったり鍵マークだったりする、ものを押すとこのサイトから何個Cookieが送られてますみたいなところで確認をしています。もしかしたらこの確認方法が間違ってるのかもしれません。
toutou

2016/09/19 00:47

デベロッパーツールのApplicationに行き、storageのcookiesでも確認しましたがやはり既存のサイトには入っており自分のほうには入っていませんでした。
popobot

2016/09/19 01:06

確認方法としては良さそうですね ちなみにsession2.phpを参照すると「Webの葉さんの部屋」と表示されるのでしょうか というのはSESSOIN自体はちゃんと動いているのでしょうか?
toutou

2016/09/19 01:16

session2.phpを動かすと エラー文 さんの部屋と言うがでており、セッションIDはランダムな数字、セッション名はPHPSESSIDと出ております。
toutou

2016/09/19 01:20

今は、PHPの設定のほうに問題があると思いいじってます。Localhostに接続して動作を確認しています。
toutou

2016/09/19 02:04

ほかのサイトの確認などをやってみた結果おそらくsession自体が動いてないですね。sessionが動く設定にしたら解決だと思います。
toutou

2016/09/19 03:20

phpの設定確認およびブラウザーのcookieの設定を確認。cookie取得に成功。しかしまだ、訪問数がカウントされないので確認してみたところ、送信先がサイトのほうは「あらゆる種類の接続」になってるのに対し、「セキュリティで保護された接続のみ」なっているのでこれを解除しようと思う。
popobot

2016/09/19 03:24 編集

php.iniの設定だと思いますが、session.use_cookies = 1になっていますか 可能ならphp.iniを貼ってもらえると話が早いかもです。
toutou

2016/09/19 03:24

なってます
toutou

2016/09/19 03:27 編集

質問のほうに画像を追加しておきました。そして今ここのコメントも編集できることに気づきました。
popobot

2016/09/19 04:06 編集

設定は大丈夫そうですね もしかしたら、$SESSION_を設定する前に、<html >とかを出力しているのがイケないのかもしれないので、参考サイトと同じPHPで動作確認してもらってもいいですか? 自前の環境だと大丈夫なんですが...PHPのバージョンもあるので。 あと、自前でsetcookieも試してみてください。以下のコードで大丈夫です。うまく行けばCookieが増えるはず。 <?php setcookie('foo', 'hoge'); ?>
toutou

2016/09/19 04:18 編集

cookieは増えていました。もらったコードのほうはあらゆる種類の接続でした。コードも貼っておきます。sessionの設定のどこかがおかしいとしか今は考えられないですね。バージョンはPHP Version 7.0.9です。
popobot

2016/09/19 04:21

PHPSESSIDのCookieはまだできていないですか??
popobot

2016/09/19 04:22

以下のコードだとどうでしょうか?? <?php session_start(); $_SESSION['hoge'] = 'foo';
toutou

2016/09/19 04:23

とりあえず一枚画像貼ります
toutou

2016/09/19 04:29

見た目的にはサーバ/セッションIDが変わっただけでほかは変わってませんでした。
popobot

2016/09/19 04:35 編集

ん? 画像を見るとCookieできたみたいですが。 もしかしたら、以下の記事のようにCookie処理の前に出力するとうまく行かない問題かもしれません。 http://unsolublesugar.com/20130419/182635/ $_SESSIONの場合、どういうふうになるのかちょっとわかりませんが...たぶん同じではないかと
toutou

2016/09/19 04:45

12時20分のメモ書きでcookieの取得は自分ではできたという認識だったので少しすれ違ってしまったのかもしれませんね。
toutou

2016/09/19 05:00

もらったコードも含め一番上に全部持っていってるのでもらったサイトについての点は大丈夫だと思います。
popobot

2016/09/19 05:12

12:20の書き込みを見逃していました... これはブラウザの設定?? 自分のほうがだんだん状況がわからなくなってきました... 解決したこと、してないことをまとめてほしいです。
toutou

2016/09/19 05:23

とりあえずcookieの取得には成功。自分の予想ではセキュリティで保護されてる接続のため情報が制限されてるもしくはそもそも情報がサーバーに行ってないなどを考えてる。解決しないことは、$_COOKIE["PHPSESSID"]に情報を入れれない?こと。issetとempty両方の関数でどちらも反応はしないので、そもそも変数が作られてないのではと思ってる。cookieの送信先が2種類あるので、全種類の情報を出力しているかもしれないあらゆる情報にすれば何とかなると思ってるのでそれにする方法を調べている。自分の確認方法であるサイトでifの下の方にいけば成功。もしくはほかのサイトでもいいのでリロードしたときにカウントが増えるという仕組みのやつでもいい。それで解決となる。
toutou

2016/09/19 05:25

一応ですが、そんなにがんばらないでくださいね。そっちがもう諦めたら解決済みにして後は自分でやる予定なので大丈夫です。
popobot

2016/09/19 05:36

なるほど、わかりました。 もっともシンプルなカウンタのコードを書いてみたので試してみてください。 <?php session_start(); if(empty($_SESSION['count'])) { $_SESSION['count'] = 1; } else { $_SESSION['count']++; } echo $_SESSION['count'];
toutou

2016/09/19 05:37

opera chrome fliefoxで動作確認。全部同じ動作だったためブラウザの問題ではないと思われる
toutou

2016/09/19 05:38

リロードしましたが1のままです。
popobot

2016/09/19 05:48 編集

サーバ側のOSはLinuxですか? サーバ上にCookieに書かれたIDのセッションファイルがありますか? $ sudo ls -l /var/lib/php/sessions/ -rw------- 1 www-data www-data 10 9月 19 14:35 sess_ir2ddsv8jhhsr6rlu2d170iur5 -rw------- 1 www-data www-data 15 9月 19 14:02 sess_olbu79t2k1p02q1e5n9q4r80o3 $ sudo cat /var/lib/php/sessions/sess_ir2ddsv8jhhsr6rlu2d170iur5 count|i:9;
popobot

2016/09/19 07:49

Windowsでしたか...以下のコードを実行するとSESSIONの実態の保存先がわかるので、 実行してみてください。そして、そこにセッションのファイルがあったら中身とか見てみてください。phpinfoの結果だとno valueってなってますね。実はこれがよくなかったりして <?php echo session_save_path();
toutou

2016/09/19 08:06

何もでないですね。無料サーバーを借り試してみたところきちんと表示されました。これは内部WEBサーバーというものが悪いという結論でよさそうです。原因は少なくとも特定できました。借りたサーバーだと一回一回アップデートしないといけないので大変なので出来ればローカルでやりたかったのですが、現状は重要なのは借りたサーバーを使って試すことになりそうです。後々、環境を整えるためにLinuxというのも勉強しようと思います。
popobot

2016/09/19 08:19

php.iniのsession.save_pathの設定がないのが原因かもしれませんよ。適当なディレクトリを指定してやってみてください。それでだめなら諦めますかね
toutou

2016/09/19 09:27 編集

指定して設定し、cookieが流れ込んでくるのを確認しました。無理でした。同じように保護されたクッキーなのでこれを解除しない限りダメかと思います。長い間おつきあいいただきありがとうございました。
popobot

2016/09/19 10:11

うーん、残念です。悔しいw こちらこそ、色々やってもらってありがとうございました! まぁLinuxは勉強して損はないので、是非是非!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問