kamenokoki.com

ロリポップ!でPHPのSESSION、POSTが動かないときの対処法

Posted:  Last Update:

レンタルサーバーのロリポップで、ログイン認証ページやコメント投稿ページが動作しない、白い画面になった、見慣れないPHPのエラーが表示される…。そんな時に、まず試したいのがPHPの設定変更です。それでも治らないときに原因を特定する方法と、各原因の対処法も詳しく紹介します!

エラーの原因はPHPのセッションかも?

入力フォームとセットでよく利用されるPHPのセッション(SESSION)。PHPの「$_POST」と組み合わせることで、ログイン画面や、コメント投稿、お問い合わせページなどに頻繁に利用される手法です。しかし、レンタルサーバー「ロリポップ」の初期設定では、SESSIONとPOSTが動作しません(少なくとも筆者は動きませんでした)。

SESSIONとPOSTが動作していないときのよくある現象として「画面が白くなる」ことがあげられます。エラーの原因となっているPHP以降を読み込めなくなり、ページが表示されなくなってしまうのです。(PHP設定でPHPのエラーを表示している場合には、白い画面の代わりにPHPのエラーが表示されます)

ロリポップで、SessionやPostが動かないときには、最初にPHP設定の変更を試してみてください。

最初に試してみて!PHP設定の変更

ロリポップでログイン認証ページやコメント投稿ページが動作しない。そんな時に最初に確認したいのが、PHPの設定変更です。

ロリポップ」の「ユーザー専用ページ」>「サーバーの管理・設定」>「PHP設定」からphp.iniの設定を行いましょう。「PHP設定」最下部の「その他」から「output_buffering」を探して、「0」を「1」に変更し、「php.iniを設定する」をクリックします。
2020.10.01 ロリポップ!でPHPの設定を開く2020.10.04 ロリポップ!でPHP設定の「output_buffering」をオンにする

この変更でエラーが回避できた方!おめでとうございます!

この設定を行っても引き続き起こる方は、原因を詳しく確認する必要があります。次の小見出しから原因の特定と対処法を紹介していますので、試してみてください。

output_bufferingを「1」にしても治らないときのはPHPのエラーを確認

「output_buffering」を「1」にしてもエラーが引き続き発生する…。そんな時には、PHPのエラー内容を確認する必要があります。

ロリポップ」の「ユーザー専用ページ」>「サーバーの管理・設定」>「PHP設定」からphp.iniの設定を変更します。「PHP設定」最下部「そのほか」の「display_errors」を「Off」から「On」に変更し、「php.iniを設定する」をクリックします。※この設定はサイトの修正が完了したら必ずOffに戻してください。

2020.10.01 ロリポップ!でPHPの設定を開く2020.10.04 ロリポップ!でPHP設定の「display_errors」をオンにする

なお、画面上に表示されるエラーには、ファイルのフルパスも含まれます。フルパスは第三者に知られると悪用されるおそれもあります。エラーが発生しているページに第三者が接続する可能性が高い場合には、PHPのエラーは表示しないほうが賢明です。その場合は、該当のページを一時的に別の場所に移してテストをするなど、工夫してみてください。

表示されたエラーに対応する

「display_errors」をOnにしたら、エラーが発生しているページに改めて接続してみましょう。先ほどは白かった画面に、英語でエラー内容が表示されていると思います。

続きの記事では、よくある4つのエラーへの対処法を紹介します。

  1. Notice: session_start(): A session had already been started - ignoring in...
  2. Warning: Cannot modify header information - headers already sent by...
  3. Warning: session_start(): Cannot start session when headers already sent in...
  4. Warning: Cannot modify header information - headers already sent by...

この一覧に該当のエラーがない場合は、ネット検索すると様々な対処法が出てきます。画面に表示されているエラーのファイル名の直前までをコピーして、検索してみてください。

エラー1「Sessionが既に始まっている」

Notice: session_start(): A session had already been started - ignoring in...

上記のエラーが表示される場合には、エラーページのPHPを変更する必要があります。エラーが表示されるページのファイルを開いて、「session_start();」の部分を「if(!isset($_SESSION)){ }」でサンドイッチしてみましょう。

(変更前)
session_start();
(変更後)
if(!isset($_SESSION)){
session_start();
}

このエラーは、既に始まっているsessionを、再度はじめようとしている時に表示されます。遷移後のページに改めてsessionを始める指示があると、「もうセッションは始まっています」というエラーが出てしまいます。if分で「セッションが始まっていない場合だけセッションを開始」と指定することで、エラーを回避することができます。

この設定をした後に、「Warning: session_start(): Cannot start session when headers already sent in...」とページに表示される場合には、小見出し「エラー3」の設定も確認してください。

エラー2「headerが既に送られている」

Warning: Cannot modify header information - headers already sent by...

上記のエラーが表示される場合には、エラーページのPHPを変更する必要があります。エラーが表示されるページのファイルを開いて、「header("Location: example.XXXX");」をセッション指定の直後に持ってきましょう。下記は一例なので、どこに配置するか確認が必要です。多くの場合は「$_SESSION['XXXX']」の直後が目安になります。「$_SESSION['XXXX']」の下にif文があり、「header("Location: example.XXXX");」がif文の中にある場合には、if文内の最初に設置することになるでしょう。

(変更前)
if (isset($_SESSION['XXXX'])) {
echo "ABCABCABC";
header('Location: example.xxx');
}
(変更後)
if (isset($_SESSION['XXXX'])) {
header('Location: example.xxx');
echo "ABCABCABC";
}

このエラーは、header部分よりも先にbody部分を記述していると発生します。HTTP レスポンスにはheader部分とbody部があり、かならずheaderを先に送信する決まりがあります。上記の例では、「header('Location: example.xxx');」がheaderで、「echo "ABCABCABC";」がbody部分です。header部分を先に記述することにより、エラーを解消できます。

この設定をした後に、「Warning: session_start(): Cannot start session when headers already sent in...」とページに表示される場合には、小見出し「エラー3」の設定も確認してください。

エラー3「headerを変更することができない」

Warning: session_start(): Cannot start session when headers already sent in...

Warning: Cannot modify header information - headers already sent by...

上記のエラーが表示される場合には、最初の設定に戻ってロリポップのPHP設定を変更する必要があります。

ロリポップ」の「ユーザー専用ページ」>「サーバーの管理・設定」>「PHP設定」からphp.iniの設定を行いましょう。「PHP設定」最下部の「その他」から「output_buffering」を探して、「0」を「1」に変更し、「php.iniを設定する」をクリックします。
2020.10.01 ロリポップ!でPHPの設定を開く2020.10.04 ロリポップ!でPHP設定の「output_buffering」をオンにする

エラーが表示されているページソースには、「header("Location: example.XXXX");」という構文がPHPに記載されていると思います。この「example.XXXX」で指定されたHTMLを、変数に保存してブラウザに送信する機能が「output_buffering」です。「output_buffering」が「0」(無効)になっていると、HTMLを変数に保存することができず、エラーが発生してしまいます。「output_buffering」を「1」(有効)にすることにより、エラーを解消することができます。

まとめ

ロリポップでPHPのSESSIONとPOSTを利用したページにエラーが発生する場合には、まず「output_buffering」を「1」にしてみてください。それでもエラーが発生する場合には、PHPのエラーを画面に表示させて、エラーごとに対応します。

作業後には「display_errors」をoffにすることを忘れずに!「ロリポップ」>「ユーザー専用ページ」>「サーバーの管理・設定」>「PHP設定」>「その他」>「display_errors」を、「on」から「off」に変更し、「php.iniを設定する」をクリックすれば、エラーは画面に表示されなくなります。

筆者はHTMLとPHPでサイトを構築しています。ローカル環境ではうまく動いていたSESSION/POSTが、ロリポップのサーバーでは動かず、頭を抱えました。そんな経験から書いた今回の記事、同様の問題でお困りの方の助けになれば幸いです。

記事をシェアする

亀の子に連絡

ランキング参加中!ぽちっとしてね

F2cランキングアイコン 人気ブログランキング ブログランキング・にほんブログ村へ

RELATED

環境設定 ・PHPの小技集 

広告