0

ログインフォームに少し問題があります。問題は mysqli コードだと思います。コードが古い mysql コードの場合、ログインは正常に機能していましたが、mysqli に変更してから、まったく正常に機能しませんでした。

ユーザーがログインフォームにユーザー名とパスワードを入力すると、ユーザーが「ログイン」ボタンをクリックすると、ユーザー名とパスワードが正しいかどうかがデータベースでチェックされます。正しい場合は menu.php ページに移動します。ログインが正しくない場合は、ログインが正しくないというメッセージを表示して、もう一度やり直してください。

代わりに、以下のコードが行っていることは、ユーザーがユーザー名とパスワードを入力して「ログイン」ボタンをクリックすると、ユーザー名とパスワードが正しいかどうかに関係なく、元を更新するだけで、メニューに移動しません。 php ページにアクセスしたり、ログインが正しくないというメッセージを表示したりします。

私の質問は、なぜこれが起こっているのか、ログイン後にユーザーをナビゲートしたり、間違ったログインメッセージを表示したりしないのはなぜですか?

以下はコードです:

 <?php

    session_start(); 

    $username="xxx";
    $password="xxx";
    $database="xxx";

    $mysqli = new mysqli("localhost", $username, $password, $database)or die( "Unable to select database");

    foreach (array('teacherusername','teacherpassword') as $varname) {
            $$varname = (isset($_POST[$varname])) ? $_POST[$varname] : '';
          }

    ?>

    <form action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post" id="teachLoginForm">        
    <p>Username</p><p><input type="text" name="teacherusername" /></p>      <!-- Enter Teacher Username-->
    <p>Password</p><p><input type="password" name="teacherpassword" /></p>  <!-- Enter Teacher Password--> 
    <p><input id="loginSubmit" type="submit" value="Login" name="submit" /></p>
    </form>

    <?php
    if (isset($_POST['submit'])) {

    $query = $mysqli->prepare("
    SELECT * FROM Teacher t  
    WHERE 
    (t.TeacherUsername = '".mysqli_real_escape_string($teacherusername)."')
    AND
    (t.TeacherPassword = '".mysqli_real_escape_string($teacherpassword)."')
    ");

    $query->bind_result($Teacher);

    $num = $query->num_rows($result = $query->execute());

    $loged = false;

    while($row = $result->fetch())
      {

          if ($_POST['teacherusername'] == ($row['TeacherUsername']) && $_POST['teacherpassword'] == ($row['TeacherPassword']))
          {
              $loged = true;
          }

$_SESSION['teacherforename'] = $row['TeacherForename'];
$_SESSION['teachersurname'] = $row['TeacherSurname'];
$_SESSION['teacherusername'] = $row['TeacherUsername'];

      }

      if ($loged == true){
      header( 'Location: menu.php' ) ;
    }else{
      echo "The Username or Password that you Entered is not Valid. Try Entering it Again.";
    }


    }
     ?>
4

1 に答える 1

3

このコードは、いくつかの理由から非常に悪いものです。これを書き直して、その理由を説明しましょう。

まず、データベースのすべての行を取得してループし、一致するかどうかを確認します。これは SQL クエリ内で行う必要があります。

次に、出力が送信された後にヘッダーを送信しようとしています。エラー報告が有効になっている場合、これは機能せず、エラーがスローされるはずです。

第 3 に、変数を明確$teacherusername$teacherpassword理由もなく定義し、それらを一貫して使用することさえしません。

第 4 に、一見何の理由もなくセッションを開始しています。

第 5 に、クエリが不必要に複雑です。

第 6 に、Mike が指摘したように、ユーザーのパスワードをデータベースにプレーンテキストとして保存しています。

私はこれを次のように書きます:

<?php
// There can be nothing (HTML, whitespace, anything) above this php tag.

if(isset($_POST['teacherusername']) && isset($_POST['teacherpassword']))
{
    // Connect to Database
    $username="xxx";
    $password="xxx";
    $database="xxx";
    $mysqli = new mysqli("localhost", $username, $password, $database)or die( "Unable to select database");

    // Build Query
    $q = sprintf('SELECT * FROM Teacher t');
    $q.= sprintf(' WHERE t.TeacherUsername = %s', mysqli_real_escape_string($_POST['teacherusername']));
    $q.= sprintf(' AND t.TeacherPassword = %s', mysqli_real_escape_string($_POST['teacherpassword']));

    // Run Query
    $query->bind_result($Teacher);
    $res = $query->execute();
    $num = $query->num_rows();

    if($num == 1)
    {
        header('Location: menu.php' );
    }
    else
    {
        session_start();        // Do you need this?
        echo "The Username or Password that you Entered is not Valid. Try Entering it Again.";
    }
}
?>
<form action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post" id="teachLoginForm">        
<p>Username</p><p><input type="text" name="teacherusername" /></p>      <!-- Enter Teacher Username-->
<p>Password</p><p><input type="password" name="teacherpassword" /></p>  <!-- Enter Teacher Password--> 
<p><input id="loginSubmit" type="submit" value="Login" name="submit" /></p>
</form>

現在、これはパスワードをデータベースにプレーンテキストとして保存しているという事実を解決しません。それは悪い習慣ですが、今日のレッスンの範囲外です :-)

ここでは、PHP が最初に実行され、どちらheader()session_start()が最初に出力を送信します。どちらも最初に出力を送信する必要があるため、これは重要です。

また、検証ループであることも解決しました。クエリが行を返す場合、データベースに一致があり、ユーザー名とパスワードが正しい場合、ループする必要はありません。

于 2012-06-09T01:03:50.800 に答える