3

ログイン資格情報に基づいて別の index.php ページにユーザーを送信するログイン ページを作成しようとしています。たとえば、「IT 技術者」ロールのユーザーがログインすると「index.php」に送信され、「学生」ロールのユーザーがログインすると「student/index」に送信されます。 .php」ページ。

コードの何が問題なのかわかりませんが、機能していません... ログイン ボタンを押すたびに、「間違ったログイン資格情報」というメッセージが表示されます。

ユーザーログインページのコードは次のとおりです。

<?php
session_start();
if (isset($_SESSION["manager"])) {
header("location: http://www.zuluirminger.com/SchoolAdmin/index.php");
exit();
}
?>

<?php
if (isset($_POST["username"]) && isset($_POST["password"]) && isset($_POST["role"])) {
$manager = preg_replace('#[^A-Za-z0-9]#i', '', $_POST["username"]);
$password = preg_replace('#[^A-Za-z0-9]#i', '', $_POST["password"]);
$role = preg_replace('#[^A-Za-z0-9]#i', '', $_POST["role"]);
include "adminscripts/connect_to_mysql.php";
$sql = mysql_query("SELECT id FROM Users WHERE username='$manager' AND password='$password' AND role='$role' LIMIT 1");
$existCount = mysql_num_rows($sql);
if (($existCount == 1) && ($role == 'IT Technician')) {
    while ($row = mysql_fetch_array($sql)) {
        $id = $row["id"];
    }
    $_SESSION["id"] = $id;
    $_SESSION["manager"] = $manager;
    $_SESSION["password"] = $password;
    $_SESSION["role"] = $role;
    header("location: http://www.zuluirminger.com/SchoolAdmin/index.php");
} else {
    echo 'Your login details were incorrect. Please try again <a href="http://www.zuluirminger.com/SchoolAdmin/index.php">here</a>';
    exit();
}
}
?>

<?php
if (isset($_POST["username"]) && isset($_POST["password"]) && isset($_POST["role"])) {
$manager = preg_replace('#[^A-Za-z0-9]#i', '', $_POST["username"]);
$password = preg_replace('#[^A-Za-z0-9]#i', '', $_POST["password"]);
$role = preg_replace('#[^A-Za-z0-9]#i', '', $_POST["role"]);
include "adminscripts/connect_to_mysql.php";
$sql = mysql_query("SELECT id FROM Users WHERE username='$manager' AND password='$password' AND role='$role' LIMIT 1");
$existCount = mysql_num_rows($sql);
if (($existCount == 1) && ($role == 'Student')) {
    while ($row = mysql_fetch_array($sql)) {
        $id = $row["id"];
    }
    $_SESSION["id"] = $id;
    $_SESSION["manager"] = $manager;
    $_SESSION["password"] = $password;
    $_SESSION["role"] = $role;
    header("location: http://www.zuluirminger.com/SchoolAdmin/student/index.php");
} else {
    echo 'Your login details were incorrect. Please try again <a href="http://www.zuluirminger.com/SchoolAdmin/index.php">here</a>';
    exit();
}
}
?>

データが取得されるフォームは次のとおりです。

<form id="LoginForm" name="LoginForm" method="post" action="http://www.zuluirminger.com/SchoolAdmin/user_login.php">
  User Name:<br />
  <input type="text" name="username" id="username" size="50" /><br />
  <br />

  Password:<br />
  <input type="password" name="password" id="password" size="50" /><br />
  <br />

  Log in as:
  <select name="role" id="role">
    <option value="">...</option>
<option value="Head">Head</option> 
<option value="Deputy Head">Deputy Head</option> 
<option value="IT Technician">IT Technician</option> 
<option value="Pastoral Care">Pastoral Care</option> 
<option value="Bursar">Bursar</option> 
<option value="Secretary">Secretary</option> 
<option value="Housemaster">Housemaster</option> 
<option value="Teacher">Teacher</option> 
<option value="Tutor">Tutor</option> 
<option value="Sanatorium Staff">Sanatorium Staff</option> 
<option value="Kitchen Staff">Kitchen Staff</option> 
<option value="Parent">Parent</option> 
<option value="Student">Student</option>
</select><br />
  <br />

  <input type="submit" name = "button" id="button" value="Log In" onclick="javascript:return validateLoginForm();" />
  </h3>
</form>

ログインすると (正しいページが読み込まれると、スクリプトの上部にある検証コードは次のようになります。

<?php
session_start();
if (!isset($_SESSION["manager"])) {
header("location: http://www.zuluirminger.com/SchoolAdmin/user_login.php");
exit();
}

$managerID = preg_replace('#[^0-9]#i', '', $_SESSION["id"]);
$manager = preg_replace('#[^A-Za-z0-9]#i', '', $_SESSION["manager"]);
$password = preg_replace('#[^A-Za-z0-9]#i', '', $_SESSION["password"]);
$role = preg_replace('#[^A-Za-z0-9]#i', '', $_SESSION["role"]);

include "adminscripts/connect_to_mysql.php";
$sql = mysql_query("SELECT id FROM Users WHERE username='$manager' AND password='$password' AND role='$role' LIMIT 1");
$existCount = mysql_num_rows($sql);
if ($existCount == 0) {
header("location: http://www.zuluirminger.com/SchoolAdmin/index.php");
exit();
}
?>

データベース テーブルには次のフィールドがあります: idusernamepassword、およびrole

どんな助けでも大歓迎です!

どうもありがとう、ズールー

4

3 に答える 3

3

これは典型的なデバッグ状況で、中間データを一時的に出力して何が問題なのかを確認できます。これを簡単にするために、コードにいくつかの改善を加えることができます。

  • メインのログイン ページで、データベースに 2 回接続し、SELECT2 回、ユーザー入力フィルタリングを 2 回行っているように見えます。これは不要です。これを 1 つのブロックに減らします。これにより、コードがはるかにコンパクトになります。
  • mysql 関数内にコードを配置するよりも、これの方が優れていると思います。

    $sql = "
        SELECT id FROM Users
        WHERE
            username='$manager'
            AND password='$password'
            AND role='$role'
        LIMIT 1
    ";
    //echo $sql; exit();
    mysql_query($sql);
    

これで、行のコメントを外してecho、SQL が正しいかどうかを確認できます。データベースに対して手動で実行して確認し、問題がなければ削除してください。

  • また、SQL 文字列をどのようにインデントしたかを参照してください。この方法ではるかに読みやすくなります。
  • header('Location: ...')ie を大文字の 'L' と共に使用します。あなたの方法はうまくいきますが、この方法はより正しいです。
  • リダイレクト後は、常にexit(). これは、ユーザーが切断されたことをサーバーが認識するまで PHP がスクリプトを正常に実行し続けるためです:)
  • 完全修飾 URL にリダイレクトする必要はありません。にリダイレクトしても問題"/SchoolAdmin/index.php"ありません。これにより、Web サイトのアドレスを配線する必要がなくなります。
  • $_POSTデータベース操作を行う前に、すべての変数をチェックする必要はありません。これを行うだけで問題ありません:

    if ($_POST) {
        // Form operation
    }
    

はるかにきれいで、同じことを行います!

  • 補遺: コードで「IT Technician」などの値を参照するのではなくdefine('ROLE_IT_TECH', 'IT Technician');、共通のインクルード ファイルで使用します。その後、ログイン コードログイン フォームでそれを参照できるため、すべてのユース ケースで常に同じ値を使用していることがわかります。
  • 補遺 2: ではなく を使用するinclude_onceためinclude、PHP は繰り返される include ステートメントを無視します。
于 2012-04-09T17:16:58.673 に答える
2

ログインの成功を確認する if() ステートメントを再構築する必要があります。

if (($existCount == 1) && ($role == 'IT Technician'))

問題は、正しい資格情報と IT 技術者の役割でログインしない限り、「正しくないログイン」リンクが表示されることです。学生やその他の役割のコードにアクセスすることはありません。

できることの 1 つは、$existCount と $role のチェックを分割することです。彼らが正しくログインしていることを確認してください。持っている場合は、一連の if() elseif() ステートメントまたは select/case を使用して、どの $role が適切なページにリダイレクトされているかを識別します

疑似コード

if ($existCount == 1) {

    if($role == 'IT Technician') {
        header(location1);
    }
    elseif($role == 'Student') {
        header(location2);
    }
    elseif(etc...) {
        header(location3);
    }
}
于 2012-04-09T17:15:49.953 に答える
2

if else を実行しているため、コードが実行されるたびにこのセクションにヒットしています

if (($existCount == 1) && ($role == 'IT Technician')) {
}
else {
     echo 'Your login details were incorrect. Please try again <a href="http://www.zuluirminger.com/SchoolAdmin/index.php">here</a>';
exit();
}

コードが実行され、ロールが IT 技術者ではない場合、エラー メッセージが送信され、アプリケーションが完全に停止されます。それが学生、イボイノシシ、またはロールではないかどうかは関係ありません。

改善すべき点はたくさんありますが、最初は重複したセクション (IT 管理者と学生) を削除し、ユーザーに送信させるのではなく、データベースから行を取得することをお勧めします。

SELECT id FROM Users WHERE username='$manager' AND password='$password' LIMIT 1

if ( count($sql) == 1 ) {
     if ( $sql['role'] == 'IT Adminstrator' ) {
          header('admin_url.php');
     } elseif ( $sql['role'] == 'Student' ) {
          header('student_url.php');
     };
};
于 2012-04-09T17:17:18.307 に答える