13

私はPHPが初めてで、セッションに関してはさらに初心者です。ユーザーが登録してログインできる index.php ページがあります。フォームは、登録およびログインのために、それぞれ validate.php および loginvalidate.php ページに投稿されます。

index.php をロードすると、これらのエラーが発生します。

1) 注意: 未定義のインデックス: 登録済み 2) 注意: 未定義のインデックス: 未使用

テキストをさまざまな方法で変更しようとしましたが、エラーを解決できませんでした。

インデックス.php

    <?php
            if ($_SESSION['registered'] != NULL){
                echo $_SESSION['registered'];                   
            }
            if ($_SESSION['badlogin'] != NULL){
                echo $_SESSION['badlogin'];
            }
            if ($_SESSION['neverused'] != NULL) {
                echo $_SESSION['neverused'];                    
            }
    ?>

Validate.php (登録フォームの送信後)

    if (mysqli_num_rows($result) > 0) {  //IF THERE IS A PASSWORD FOR THAT EMAIL IN DATABASE
    $_SESSION['registered'] = "Email is already registered.";
    mysqli_close($db_handle);
    header('Location: index.php');
    exit();
}

Loginvalidate.php (ログインフォーム送信後)

if ($numrows!=0)  //IF THERE IS A PASSWORD FOR THAT EMAIL IN THE DATABASE
{
  if ($row['password'] == $password) {  //IF THE PASSWORD MATCHES USER INPUT
      header('Location: homepage.php');
      echo "lol";
      exit();
  }
  else{
    $_SESSION['badlogin'] = "Email/password combination not valid.";
    mysqli_close($db_handle);
    header('Location: index.php');
    exit();
  } 
}
else {  //THERE IS NO PASSWORD FOR THAT EMAIL, SO THAT EMAIL IS NOT REGISTERED
    $_SESSION['neverused'] = "Email is not registered.";
    mysqli_close($db_handle);
    header('Location: index.php');
    exit();
}

さて、私のスクリプトは意図したとおりに動作します。私が解決できないのは、これらのセッション エラーだけです。セッションの誤用は見られますか? もちろん、すべての .php ファイルでセッションを開始しました。

また、ハッカーからの保護がないことを認識していることに注意してください。これは、重要なデータを含まない将来のプロトタイプ用です。

4

2 に答える 2

21

これらのエラーの理由は、存在しない配列キーを読み取ろうとしていることにあります。isset()関数があるので、これをテストできます。各要素に対して次のようなものがうまく機能します。要素に null を割り当てないため、null チェックは必要ありません。

// check that the 'registered' key exists
if (isset($_SESSION['registered'])) {

    // it does; output the message
    echo $_SESSION['registered'];

    // remove the key so we don't keep outputting the message
    unset($_SESSION['registered']);
}

ループで使用することもできます。

$keys = array('registered', 'badlogin', 'neverused');

//iterate over the keys to test
foreach($keys as $key) {

    // test if $key exists in the $_SESSION global array
    if (isset($_SESSION[$key])) {

        // it does; output the value
        echo $_SESSION[$key];

        // remove the key so we don't keep outputting the message
        unset($_SESSION[$key]);
    }
}
于 2013-09-11T02:39:29.060 に答える
4

未定義のインデックス エラーが発生する場合は、値を比較する前に、インデックスが設定されていることを確認してください。ここで isset 関数のドキュメントを参照してください: http://php.net/manual/en/function.isset.php

if (isset($_SESSION['registered']))
  if ($_SESSION['registered'] != NULL){
      echo $_SESSION['registered'];                   
  }
}
if (isset($_SESSION['badlogin']))
  if ($_SESSION['badlogin'] != NULL){
      echo $_SESSION['badlogin'];
  }
}
if (isset($_SESSION['neverused']))
  if ($_SESSION['neverused'] != NULL) {
      echo $_SESSION['neverused'];                    
  }
}
于 2013-09-11T02:30:39.133 に答える