PHP-Sessionでハマった話

2022年6月9日

テクノロジー

eyecatch マニュアルを読まないで有名な、ユゲタです。 久しぶりにPHPでハマりました。 いつもフレームワークばかり使っていたので、たまには自分でベース部分も書いてみるか!と、 ペライチページでログイン機能をつけるだけだったので、久しぶりに session処理を書いてみたところ、 な〜んか、うまく動かん・・・ 今回は、そんな奮戦記です。

はじまりはいつも雨

ログインに成功した時に、ユーザーIDやメールアドレスなどをセッション情報として保持する処理を書いていたところ、別にcookie処理が必要になり、コンフリクトを避けるために、session-idをドメインに準拠する仕様にしました。 login.example.com lp.example.com ドメインが違うので、別にcookieの名前が被っても問題ないと思うかもしれませんが、 開発環境でlocalhost一括でやっていると、そこで不具合が発生するのも、なんだか痛いので、いっそのことcookieの名前が被らない様にユニーク値にする事にして、 ドメインをそのままsession-idとして登録したところ、 何故かそれまでうまくログインできていたのに、ログインできなくなってしまった ・・・orz

SAY YES

原因は、session-idなんだけど、やってる最中は、そこまで気がついていない。 一体何が原因なのか判らないまま、1時間ほど経過・・・ ログイン直後にsessionデータを確認してみると、ちゃんとデータとしては登録されている。 その後、header-locationで、PHP側でリダイレクトをかけた時に、sessionが消えている。 そもそも、ページを切り替えるごとに、sessionファイルが新規に作られている状態。 なんじゃこりゃ!

YAH YAH YAH

そこで、変更したのは、session-idだけだったことを思い出し、調べてみると、PHPのsession-idでは「.(ドット)」文字列は使用してはいけない文字列である事が判明。 ドット箇所を「_(アンダースコア)」に変更したら、無事に問題なくsessionが保持されるようになり、ログインができる様になりました。 これは、phpリファレンスサイトに、ちゃんと、きちんと、しっかりと、隈なく、もれなく、書かれていました。 https://www.php.net/session-id
セッション ID として使える文字は a-z A-Z 0-9 , (カンマ) そして - (マイナス) に限られます!
あれ?アンダースコアが入ってない。 今後のアップデートでアンダースコアが塞がれそうな気がしたので、-(マイナス)に切り替えて事なきを得ました。

エンディング

CHAGE&ASKA系のサブタイトルで、ブログを書いてみましたが、知らない人にとっては、意味のわからないタイトルになっちゃいましたね。 でも、なんか、心理に合わせてのサブタイトル、書いててちょっと面白かったです。 え?PHPがうまく動いた事がうれしくないのかって? 今回面白かったことは、マニュアルを読まないと、学習した感が増すと言うことで、とてもワクワクする事ができました。 ますますマニュアルを読まなくなりそうな、ユゲタでした。