• ベストアンサー

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>

  • Pb458
  • お礼率93% (28/30)
  • PHP
  • 回答数5
  • ありがとう数4

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

  • ベストアンサー
回答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

  • phpのセッションについて質問です

    phpで会員制サイトの制作を勉強中です。 pdoでmysqlデータベースに接続しています。 セッションの「session_set_cookie_params」について質問ですが、 session_set_cookie_paramsで有効期限を設定する場合、 ログイン時にsession_set_cookie_paramsでセッションの有効期限を設定し、 他のページではsession_start()さえ記述すれば、 有効期限を過ぎると勝手にセッション変数のデータを空にしてくれるのでしょうか? それとも全てのページにsession_set_cookie_paramsを書かなければならないのでしょうか? プログラムを書いている上でセッションの動作がおかしい(有効期限が過ぎてもログアウトしない)のでsession_set_cookie_paramsの記述がおかしいのかと思い、質問しました。 また、セッション変数の有効期限を変数毎に個別に設定して削除する方法はないのでしょうか? ご回答、よろしくお願いします。

    • ベストアンサー
    • PHP
  • Windowsだとsession_set_cookie_paramsが

    Windowsだとsession_set_cookie_paramsが上手く動きません。 以前 http://okwave.jp/qa/q5387366.html でディレクトリ分けをしているときにセッションが混ざってしまうと相談したものです。 回答していただいたものを元にsession_set_cookie_paramsを使ってみたところセッションが混ざることがなくなったのですが、このコードをWindows(というかXampp for windows)で動かすとセッション情報を保存することが出来なくなってしまいます。 (具体的な挙動としてはログインフォームなのですが延々とログインできなくなってしまいました。) Windows版では動かせない関数なのでしょうか? それともphp.ini等に設定が必要でしょうか? windowsでうごかしたコードのセッション部分 if(isset($_REQUEST['PHPSESSID'])) { session_id($_REQUEST['PHPSESSID']); //Setting the same session id to Forums as in CRM $sid=$_REQUEST['PHPSESSID']; } session_set_cookie_params(time()+36000, "/pdt/test/", "localhost"); insert_charset_header(); きちんと動作する環境 OS: Linux CentOS5 PHP:5.3 独自ドメイン上で動かしている(上記コードのlocalhostの部分はそのドメイン名としている) 上手く動かない環境 OS: WindowsXP PHP: 5.2.9(Xamppで動かしています) テスト環境(ドメインは指定していないため上記コードのsession_set_cookie_paramsのホスト名の部分をlocalhostとしている) よろしく尾根がします。

    • ベストアンサー
    • PHP
  • UTF-8で構築したサイトのsessionエラー

    pearとAuthを使ったサイトを構築中です。 ページ遷移時に、ログイン情報を保持することを考えました。 対策としては、「Authに保存されたログイン情報を読みに行くソースを"login_check.php"の外部ファイルに保存」しました。 そして、ログインページ以外のページでは"login_check.php"をrequire_onceで読みに行く形としました。 各ページ(ログインページ以外)のPHPの記載開始部分は下記の通りです。 <?php require_once "Auth.php"; require_once "login_check.php"; ************************************** login_check.php は下記となります。 ************************************** <?php session_start(); $myAuth=new Auth("DB", $params, "loginFunction"); $myAuth->start(); if ($myAuth->getAuth()){ header("id=$id".SID); }else{ print("認証されていません"); } ?> ********************************** 【トラブル】 このやり方で、S_JISで構築したページは問題なく表示されるのですが、UTF-8Nで構築したページでは下記のエラーが出ます。 不要なスペースが無いかは全て見直しました。UTF-8Nあり、BOMはありません。また改行コードもLFです。 殆どの方の同様のトラブルはBOM無しで解決しているようですが、私のはBOM無しでも発生します。ob_start(); を<?phpの直下につけても駄目でした。 S_JISでは問題なく動くだけになんとかしたいです。 アドバイス頂けましたら幸いです。 宜しくお願い致します。 エラー内容 Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/xxx.com/public_html/index33.php:6) in /home/centro-lars.com/public_html/login_check.php on line 3 Warning: Cannot modify header information - headers already sent by (output started at /home/xxx.com/public_html/index33.php:6) in /home/centro-lars.com/public_html/login_check.php on line 7

  • ログインページ

    PHPとMySQLで ログインするときに、ログインIDとパスワード(md5処理)を 入力する普通のログインページをつくったのですが 照合するときに例えば ログインIDがphp パスワードが178だとログインできず ログインIDがabe パスワードがabeだとログインできる ログインIDがパスワード一致の場合だけ何故かログインできて しまうのですが、自分で書いていてなんなんですが 以下のプログラムではそういう風になってしまうんでしょうか。 <?php if($_POST["keep_login"] != ""){ session_set_cookie_params(365*25*3600); }else{ session_set_cookie_params(0); } session_start(); require("config.php"); if($_POST["passwd"]==""){ $_POST["passwd"]=time(); } if($_POST["action"]=="login"){ $login_id = mysql_real_escape_string($_POST["login_id"]); $sql="select * from users where login_id= '$login_id' and state='0'"; $result=mysql_query($sql); $users=mysql_fetch_array($result); if($users["passwd"]==md5($_POST["passwd"])){ $_SESSION["login_id"]=$_POST["login_id"]; $_SESSION["auth_code"]=md5($magic_code.$_POST["login_id"]); $_SESSION["name_kanji"]=$users["name_kanji"]; $sql="update users set login_date = '".date('Y-m-d H:i:s')."' where login_id= '".mysql_real_escape_string($_POST['login_id'])."' and state='0'"; $result=mysql_query($sql); if($_GET["redirect"] !=""){ header("Location:".$_GET["redirect"]); exit; }else{ header("Location:".$site_url); exit; } }else{ $message='<br><br><font color="red">ログインできませんでした</font><br>'; } } ?>

    • 締切済み
    • PHP
  • 会員制ログインページ

    会員制ログインページを製作しているのですが なかなかうまくいきません <?php if($_POST["keep_login"] != ""){ session_set_cookie_params(365*25*3600); }else{ session_set_cookie_params(0); } session_start(); //データベースに接続するphpです require("config.php"); if($_POST["passwd"]==""){ $_POST["passwd"]=time(); } //照合しているのですが、いろいろ試した結果ここが おかしいようなのですが if($_POST["action"]=="login"){ $sql = "select * from users where login_id = '".mysql_real_escape_string($_POST["login_id"])."' and state = '0'"; $result=mysql_query($sql); $users=mysql_fetch_array($result); if($users["passwd"]==md5($_POST["passwd"])){ $_SESSION["login_id"]=$_POST["login_id"]; $_SESSION["auth_code"]=md5($magic_code.$_POST["login_id"]); $_SESSION["name_kanji"]=$users["name_kanji"]; $sql="update users set login_date ='".date('Y-m-d H:i:s')."' where login_id='".mysql_real_escape_string($_POST['login_id'])."' and state='0'"; $result=mysql_query($sql); if($_GET["redirect"] !=""){ header("Location:".$_GET["redirect"]); exit; }else{ header("Location:".$site_url); exit; } }else{ $message='<br><br><font color="red">ログインできませんでした</font><br>'; } } ?>

    • 締切済み
    • PHP
  • セッションIDの削除について

    session_set_cookie_params(1ヶ月); session_start(); を行った場合、webサーバーの/tmp内の 『sess_*****・・』 ファイルは、(ガーベッジ・コレクションを行わない場合)1ヶ月の有効期限が切れると、自動削除されるんでしょうか。

    • 締切済み
    • PHP
  • session_startについて

    初心者です。 以下のように、ログイン時、設定画面adminpage.htmlに行くように作っています。 sakuraインターネットでは動くのですが、 もう一方の違うサーバーでは、login.phpに戻ってきてしまいます。 原因が判りません。 手がかりが欲しいのですが、 お詳しい方がおられましたら教えてください。 よろしくお願い致します。 <?php require("MySmarty.class.php"); require('Settings.class.php'); $smarty = new MySmarty(); $settings = new Settings; session_start(); $id = $_SESSION['id']; $pass = $_SESSION['pass']; //idとパスワードに不具合有れば、login.phpへ戻る。 if( ( $id == '' ) || ( !$settings->isValidUser($id,$pass) ) ){ header("Location: login.php" ); print $_SESSION["id"]; print $_SESSION["pass"]; print $id; print $pass; exit; } $settings->loadSettings(); $smarty->assign('maintitle', $settings->maintitle); $smarty->assign('subtitle', $settings->subtitle); $smarty->assign('error_message', $settings->errorm); $smarty->display('adminpage.html'); ?>

    • ベストアンサー
    • PHP
  • session_start()の際のCannot send session cache limiterエラーについて

    現在、SJISだったサイトをUTF-8に変換する作業をしております。 今まで起こらなかったエラーなのですが、検索エンジンで、フォーム(index.php)に入力して送信した結果がsearch.phpに出るプログラムです。search.phpに下記のようなエラーが表示されるようになりました。 Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/homepage/public_html/search/search.php:1) in /home/homepage/public_html/search/search.php on line 2 session_start()関数はもちろん<html>ヘッダーより前、プログラムの一番上に下記のように書いております。 <? session_start(); ?> <html> 他のページは問題無いのですが、今の所この検索プログラムの結果画面でのみ起こります。また、SJISで書いていた時はこのようなエラーは起こりませんでした。 恐らくUTF-8に変換した点がポイントだと思いますが、解決策が見つからずこちらに質問させていただきました。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • ブラウザ終了時にセッションを削除する方法

    ログイン入力画面を作成し、以下の動作を確認しています。 (1)正常にログインしてブラウザを終了する。 (2)再びブラウザを起動してログイン後の画面を表示する。 (3)セッションがないため自動的にログイン入力画面へ移動する。 IEだとセッションが消えてログイン入力画面へ移動しますが、 Firefoxではセッションが消えず、ログイン入力画面へ移動しません。 Firefoxでもブラウザ終了後にセッションを消す方法はないでしょうか? 下記のプログラムで確認しました。 -------------------------------------------------------------------- login.php <?php session_start(); $error_message = ""; if(isset($_POST["login"])){ if($_POST["member_name"] == "php" && $_POST["pass"] == "pass"){ $_SESSION["login_name"] = $_POST["member_name"]; $login_url = "http://{$_SERVER["HTTP_HOST"]}/admin/anq_result.php"; header("Location: {$login_url}"); exit; } $error_message = "メンバー名かパスワードが間違ってます。"; } ?> <html> <body> <?php if($error_message){ print '<font color="red">'. $error_message. '</font>'; } ?> <form name="form1" method="post" action="login.php"> <p>メンバー名 <input type="text" name="member_name" value=""> <br> パスワード <input type="password" name="pass" value=""> <br> <input type="submit" name="login" value="ログイン"> </p> </form> </body> </html> ------------------------------------------------------------------------------------------------------------------------- anq_result.php <?php session_start(); if (!isset($_COOKIE["member_name"])) { unset($_SESSION["login_name"]); } if (!isset($_SESSION{"login_name"})) { $no_login_url = "http://{$_SERVER["HTTP_HOST"]}/admin/login.php"; header("Location: {$no_login_url}"); exit; } else { print "ログイン成功です。"; } ?>

    • ベストアンサー
    • PHP
  • ■(ログイン)セッションの有効期限の設定法について

    いつも、お世話になっております。(PHP5.2.5) セッションの有効期限の設定方法について色々調べましたが、 解決できなかったため、質問いたします。 --- 例えば、 a.phpと、b.php、2つのスクリプトファイルからなるサイトにおいて、 a.php、b.phpどちらにおいても、スクリプトソース冒頭で、 //(1)サーバ側のセッションファイルの有効期限を(少なくとも)24時間に設定 //有効期限が過ぎた後は、ある一定の確率でGCが起動しファイルを削除 ini_set('session.gc_maxlifetime', 86400); //(2)クライアント側のクッキーファイルの有効期限を24時間に設定 session_set_cookie_params(86400,"/"); //(3)セッションIDを生成、付与 session_start(); とし、 さらに、その上で、 IDとパスワードの入力に成功した場合に、 ログインさせ、その状態をセッション値に入れます $_SESSION['login'] = 'login'; --- 以上の経路をたどった場合の「ログイン持続期間」は、 24時間となると私は考えていますが、違いますでしょうか? しかし、実際には、1時間も持ちません。 (ちょくちょくサイトにアクセスしていると、1時間以上持つようなのですが。 ※つまり、期限が更新(延長)されているんでしょうかね。) で、どうして意図した通りに動かないのかを調べようと、 firefoxにて、クッキーの有効期限を確認すると、 (2)の処理がうまくいっているせいか、 こちらの有効期限は意図通りに設定されています。 よって、意図通りに機能しない原因は、 サーバ側のセッションファイルの有効期限が うまく設定されていないからなのでは、と思っています。 つまり、(1)の処理がうまく出来ていないことが予想されます。 はてさて、どこに問題があるのか…。 また、このサイトの例において、 もし仮に私の意図した通りの設計となった場合には、 アクセスの度に、その有効期限を24時間延長するような処理になるのでしょうか? 以上、どなたかどうかアドバイスを宜しくお願い致します。 --- なお、 セッション値に「time()」を格納し、 その時間をもとに、ログイン期限を設定し、 ログイン時からの経過時間と、その期限とを比較して、 ログイン状態を継続(延長更新?)させるか、切断するかを毎回判断させる、 なんていう方法もありそうですが、 その場合にしても、 結局は、サーバ側のセッションファイルの有効期限の持ちが悪ければ、 同様に、うまくいかないはずだと私は考えています。

    • 締切済み
    • PHP

専門家に質問してみよう