アプリ版:「スタンプのみでお礼する」機能のリリースについて

phpでログイン認証画面システムを作成しました。

1.base.php、認証画面の表示。
2.lform.phpで、ログインフォームの呼び出し。
3.LoginUserCheck.phpで、DBに接続し、ユーザーが存在するならSESSION["flag"]に値を入力し
  ページ内容の切り替え。

という内容を作りました。

ユーザーID または、パスワードを未入力で、「ログイン」ボタンを押したところ、
 【ユーザーIDが入力されていません。
 Warning: Cannot modify header information - headers already sent by ~~】と、

ユーザーに未入力を促すメッセージ + Warningメッセージが出るという事象が発生しました。

色々検索してみたところ、
【header関数の前に、何か出力しているとよく発生するエラー】
ということまでわかりました。

ただ、今回使用した3つのphpファイルには、【header関数は使用しておりません】。 

色々対応していくと、
php.iniの【output_buffering = Off】から【output_buffering = On】に変更すると

【ユーザーIDが入力されていません。】のメッセージ出力のみで
Warningメッセージ が出なくなりました。

■質問
【output_buffering = Off】から【output_buffering = On】
にして、なぜWarningメッセージが出なくなったのでしょうか。

output_bufferingは、出力をバッファにためる?
ぐらいの認識なのですが、これによる効果のものなのでしょうか。

ご教授よろしくお願いします。

=======================*base.php*ここから=================
*base.php*

<?php
require_once("lform.php");
require_once("LoginUserCheck.php");

session_start();
   if(isset($_POST['username'])){
    $login = new LoginUserCheck($_POST['username'], $_POST['password']);
    $login->usercheck();
   }

   if(!isset($_SESSION["flag"])){
    //ログインできていなければログインページ表示
    lform();
   }else{
    //ログインできていれば普通のページを表示
    print("<html><head><title>セッション開始ページ</title></head><body>");
    print("ログインしました<br>");
    print("<a href='pageb.php'>PageBへのリンク</a>");
   }
?>

====*lform.php*ここより====
<?php
function lform() {
    //ログインフォーム表示
    print("<html><head><title>ログインページ</title></head><body>");
    print("<form method='POST' action=' " . $_SERVER['PHP_SELF'] . " '> ");
    print("userID:<input type='text' name='username' size='15' maxlength='20'><br>");
    print("pass:<input type='password' name='password' size='15' maxlength='20'><br>");
    print("<input type='submit' value='ログイン' /></form>");
}
?>

====*LoginUserCheck.php*ここより====
<?php
class LoginUserCheck {
 public function usercheck(){
  //エラー処理
  if($_POST['username']が未入力なら){
   print("ユーザーIDが空白です<br>");
  }
  if($_POST['password']が未入力なら){
   print("パスワードが空白です<br>");
  }

  //userとpassが入力済みなら接続し、SESSION[flag]を設定する。
  if(!($_POST['username'] == "") && !($_POST['password']"")){
   try {
     ~DB接続し、ログインができたなら、$_SESSION["flag"]に、値を代入~
   } catch (PDOException $e) {
     print("接続エラーー: " . $e->getMessage());
   }
 }
}
?>
==========================ソースここまで==============

A 回答 (1件)

>今回使用した3つのphpファイルには、【header関数は使用しておりません】。

 

headerは使っていなくても、session_startやsetcookieがあれば「同じこと」ですよね(headerがどういう動作をするのかを考えれば自明だと思いますが・・・)。


>なぜWarningメッセージが出なくなったのでしょうか。

output_bufferingはheaderやsetcookie「以外の」出力(つまりhttpレスポンスヘッダでなくhttpレスポンスボディ)をバッファリングするからです。

http://www.php.net/manual/ja/intro.outcontrol.php
    • good
    • 0
この回答へのお礼

>output_bufferingはheaderやsetcookie「以外の」出力(つまりhttpレスポンスヘッダでなくhttpレスポンスボディ)をバッファリングするからです。

なるほどそういうことですか。
ありがとうございました。

お礼日時:2012/05/19 09:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!