0

ログインおよび登録スクリプトを実行しようとしています。ほとんどの作業を終えることができました。ただし、ユーザーを登録した後、そのユーザーとしてログインできません。つまり、登録ユーザーはログインできません。:)

これは、特定の問題に関連するコードです。

$login = login ($username, $password);
        if ($login === false) {
         $errors [] = 'That username/password combination is incorrect';
        } else {
           $_SESSION ['user_id'] = $login;
           header ('Location: index.php');
           exit (); 
    }       


function  login ($username, $password) {
   $user_id = user_id_from_username ($username);

   $username = sanitize ($username);
   $password = md5($password);

return (mysql_result(mysql_query("SELECT COUNT(user_id) FROM users WHERE username =     '$username' AND password = '$password'"), 0) == 1) ? $user_id : false;
}

上記のクエリは、以前にこのように (以下) 書きました。このように書くと、ログインできましたが、「文字通り」任意のパスワードを使用できました。

function login ($username, $password){ 
  $user_id = user_id_from_username ($username);

  $username = sanitize ($username); 
  $password = sanitize ($password); 

  $query1 = mysql_query("SELECT COUNT(user_id) FROM users WHERE username =     '$username'"); 

 $query2 =  mysql_query("SELECT COUNT(user_id) FROM users WHERE password = '$password'"); 

 return  (mysql_result($query1, 0) == 1) ? $user_id : false; 
 return (mysql_result($query2, 0) == 1) ? $user_id : false;

つまり、クエリを 2 つの部分に分割しましたが、パスワード クエリはまったく無関係であることに気付きました (「コメントアウト」したとしても)。

PS。mysql クエリの代わりに PDO または Mysqli を使用する必要があり、md5 はそれほど安全ではないことはわかっています。このなぞなぞのために、これらのことは無視してください。

4

1 に答える 1

2

クエリ結果を完全に処理できるように、DBクエリ操作を分割する必要があります。これを行う練習をしてください。これにより、DBクエリの問題のデバッグにかかる​​時間を大幅に節約できます。

また、ここでDBを2回クエリする必要はありません(これは、user_id_from_username()関数呼び出しで行っていることだと思います。これを完全に取り除き、必要な情報を一度に取得するようにクエリを設計してください。

最後に、データベース接続を明示的に指定する習慣を身に付ける必要があります。この場合、DB接続を関数に渡します。

すべてをまとめると、次のようになります。

function  login ($username, $password, $db_conn) {
    $username = sanitize ($username);
    $password = md5($password);

    $query = "SELECT user_id FROM users WHERE username = '$username' AND password = '$password'";
    $result = mysql_query($query, $db_conn);

    if (false === $result) { // the query failed
        throw new Exception('Database failed with message: ' . mysql_error());
    }

    $rows = mysql_num_rows($result);
    if (0 === $rows) { // no record found
        return false;
    } else if ($rows > 1) { // too many records found.. really your DB indexes should disallow this
        return false;
    }

    $user_id = mysql_result($result, 0 , 'user_id');
    return $user_id;
}

もちろん、mysqliまたはPDOを使用する必要があることを認識していることはすでに述べました。mysqlは非推奨であり、とにかくすぐに他の1つを学習し始める必要があるため、これらの1つを使用し始めるように強くお勧めすることはできません。そのため、今すぐ開始することをお勧めします。

于 2013-03-05T01:40:02.433 に答える