• ベストアンサー

utf8保存をするとsession_start()でエラーが出ます。

PHP:バージョン 5.1.6 セッションを使ってログイン情報を保持したいのですが、 Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\Eclipse\workspace\ShopSystem\login.php:1) in C:\Eclipse\workspace\ShopSystem\login.php on line 2 と言うエラー情報が出てしまいます。 セッションが既に開始されているらしいのですが、他にセッションスタートを記述した場所がありません。 プログラムの文字コードをutf8にするとこのようになってしまうのですが、shift-JISやutf8nでは正常に動作します。 自力で思いつける解決作は文字コードを全部変えてしまうことなのですが、できればutf8で作りたいと思っています。 お願い致します。 プログラム <?php session_start();  //ログインページ require('config.php'); if($_POST['keep_login']!=''){     session_set_cookie_params(31536000);//31536000(1年間の秒数)=365(日)*24(時間)*3600(秒) }else{     session_set_cookie_params(0); } *略 ?> <html>

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

session_start()が二重になっているのではなく、 すでに、HTML本文をだしているので、その後ではヘッダー出せません というエラーですね。 たぶん使ってるエディターが1行目の前にBOMをつけてしまって PHPがそれをHTML本文と認識しているのではないでしょうか。 PHPやperlやrubyはBOMなしで保存するのがよいかと。

Pb458
質問者

お礼

上で回答してくださった方のものと照らし合わせ、原因はBOMだったようです。 検索をかけたりもして今後ヒントになりそうな事項もいくつか見つけることができました。 ありがとうございます。

その他の回答 (4)

  • sgcarrot
  • ベストアンサー率68% (17/25)
回答No.5

BOMの有無は文字エンコードの種類で指定できます。 UTF-8 ⇒ BOM有 UTF-8N ⇒ BOM無 (参照ページの「バイトオーダーマークについて」を見てください) >文字コードをutf8にするとこのようになってしまうのですが、shift-JISやutf8nでは正常に動作します。 ということなので、ANo.3さんの指摘してるようにBOMが原因みたいですね。

参考URL:
http://ja.wikipedia.org/wiki/UTF-8
Pb458
質問者

お礼

最終的な解決に繋がりました。 8と8Nの違いをちゃんと知ることができたと思います。 ありがとうございます。

  • UmJammer
  • ベストアンサー率58% (115/196)
回答No.4

ANo.2です。 この場合のヘッダはヘッダー関数で送ろうとしているヘッダではなくsession_start()より前に発生している出力です。 その出力というのはANo.3の方が触れられているとおりBOMの可能性が高いかと思われます。TeraPadはUTF-8で保存するときBOMを付加します。 ただ、試しにTeraPadで同様のコードを書いてUTF-8で保存してみてもエラーは再現しませんでした。 とりあえずは、TeraPadのバージョンをチェックし、最新でなければダウンロードしたうえで改めてUTF-8で保存しなおしてみるか、別のエディタでファイルを開いてUTF-8で保存してみましょう。 それでもうまくいかない場合はPHPの実行時の設定の問題かもしれません。 個人的な意見ですが、以前UTF-8対応を迫られたときTeraPadを使ってうまくいかなかったことがあり、TeraPadのUTF-8の処理はあまり信用していません。

Pb458
質問者

お礼

失礼ながら下のものとまとめさせていただきお礼申し上げます。 解決しましたが一応TeraPadは最新版をダウンロードし直しました。 念のためTeraPad以外のものも少し試しながら作って行こうと思います。 ありがとうございました。

  • UmJammer
  • ベストアンサー率58% (115/196)
回答No.2

セッションが既に開始されているのではなくて、既になんらかのヘッダが出力されているということをいっていますね。 上記のソースをはじめからUTF-8で作成しても結果は同じですか?

Pb458
質問者

補足

TeraPadと言うテキスト入力ソフトで文字コードをUTF-8に指定して保存しているため、ソースは全文UTF-8になっていると思います。 phpinfoのmbstring.internal_encodingもUTF-8になっています。 ヘッダーと言うと書いてある箇所があるのですが、ここが問題になっているのでしょうか。 【】内はプログラムを略してます。 <?php if($_POST['keep_login']!=''){ session_set_cookie_params(31536000);//31536000(1年間の秒数)=365(日)*24(時間)*3600(秒) }else{ session_set_cookie_params(0); } session_start(); //ログインページ require('config.php'); 【sql呼び出し】 if($_POST['s_password'] == '') $_POST['s_password'] = time(); if($_POST['action']=='login'){ 【sql文】     if($_GET['redirect'] != ''){         header('Location:' . $_GET['redirect']); //◆header文1         exit;     }else{         header('Location' . $site_url); //◆header文2         exit;     } }else{     $massage = '<br><br><font color = "red">ログインできませんでした。</font>'; } } ?>

  • sgcarrot
  • ベストアンサー率68% (17/25)
回答No.1

このエラーに対する、直接の解決策は判りませんが、 session_set_cookie_paramsは セッション開始前に設定しないと変えられません。 念のため。

Pb458
質問者

お礼

ありがとうございます。 require('config.php'); if($_POST['keep_login']!=''){     session_set_cookie_params(31536000);//31536000(1年間の秒数)=365(日)*24(時間)*3600(秒) }else{     session_set_cookie_params(0); } session_start(); に直してみました。 何だか今のエラーを解決してもまだまだエラーが出てきそうで恐ろしいですががんばります。

関連するQ&A