0

このコードを使用して、ユーザーがログインしているかどうかを確認しています。

    function login_check_admin($mysqli) {
   // Check if all session variables are set
   if(isset($_SESSION['user_id'], $_SESSION['username'], $_SESSION['login_string'])) {

     $user_id = $_SESSION['user_id'];
     $login_string = $_SESSION['login_string'];
     $username = $_SESSION['username'];

     $user_browser = $_SERVER['HTTP_USER_AGENT']; // Get the user-agent string of the user.

     if ($stmt = $mysqli->prepare("SELECT admin_pas FROM admins WHERE admin_id = ? LIMIT 1")) { 
        $stmt->bind_param('i', $user_id); // Bind "$user_id" to parameter.
        $stmt->execute(); // Execute the prepared query.
        $stmt->store_result();

        if($stmt->num_rows == 1) { // If the user exists
           $stmt->bind_result($password); // get variables from result.
           $stmt->fetch();

           $login_check = hash('sha512', $password.$user_browser);

           if($login_check == $login_string) {
              // Logged In!!!!
              return true;
           } else {
              // Not logged in
              return false;
           }
        } else {
            // Not logged in
            return false;
        }
     } else {
        // Not logged in
        return false;
     }
   } else {
     // Not logged in
     return false;
   }
}

admins問題は、テーブルに追加された最後のメンバーでのみ機能することです。別のメンバーをテーブルに追加するとすぐに、admins他のすべてのメンバーでログインしている場合は false を返し、最後に追加したメンバーでログインしている場合にのみ true を返します。コードをこれに変更したところ、正常に動作するようになりました。準備されたステートメントが機能しない理由がわかりません。

function login_check_admin($mysqli) {
   // Check if all session variables are set
   if(isset($_SESSION['user_id'], $_SESSION['username'], $_SESSION['login_string'])) {
     $user_id = $_SESSION['user_id'];
     $login_string = $_SESSION['login_string'];
     $username = $_SESSION['username'];

     $user_browser = $_SERVER['HTTP_USER_AGENT']; // Get the user-agent string of the user.
     if ($result = $mysqli->query("SELECT admin_pas FROM admins WHERE admin_id = ? LIMIT 1")) { 
        if($obj = $result->fetch_object()) { // If the user exists
           $password = $obj->admin_pas; 
           unset($obj);
           $result->close();
           $login_check = hash('sha512', $password.$user_browser);
           if($login_check == $login_string) {
              // Logged In!!!!

              return true;
           } else {
              // Not logged in
              return false;
           }
        } else {
            // Not logged in
            return false;
        }
     } else {
        // Not logged in
        return false;
     }
   } else {
     // Not logged in
     return false;
   }
} 
4

1 に答える 1

2

ここにあなたの機能の改良版があります

function login_check_admin() {
    if(isset($_SESSION['user_id']) 
       && $_SESSION['user_agent'] == $_SERVER['HTTP_USER_AGENT'])
    {
        return TRUE;
    }
}

文字通りの質問に答えるために。

プログラマーは、間接的な結果によってコードを判断するべきではありません。常に直接のものだけを確認してください。準備されたステートメントが機能しないという仮定がありますか? このステートメントのみを含むコード スニペットを作成し、考えられるすべてのエラーをチェックし、関連するすべての変数の状態、およびすべての関数と演算子の結果を確認します。そして、それが実際に機能しない場合と、そうである場合の理由を明確に把握できます。

このルーチンは「デバッグ」と呼ばれ、コードを見ている人ではなく、プログラマー自身のみが行うことができます。

于 2013-08-03T09:23:47.560 に答える