1

電子メールとパスワードを個別に検証するように、このクエリ検証をどのように構成できますか。ユーザーが正しいメールを入力した場合、場所 (コードを参照) は、ユーザーが正しいパスワードを入力したのに間違ったメールを入力した場合とは異なりますか? これがクエリであり、GET エラー変数を設定する if ステートメントは次のとおりです。

$mysql = mysql_query("SELECT * FROM employees WHERE email = '{$email}' AND hashed_password = '{$hashed_password} '");

if ( mysql_num_rows($mysql) < 1 )
{
    header ("Location: index.php?error=1");
    die();    
} 
4

2 に答える 2

1
SELECT hashed_password = '{$hashed_password}' AS is_password_correct 
FROM employees WHERE email = '{$email}'

$email に一致するエントリがない場合、このクエリは 0 行を返します。

$email に一致する行がある場合、select-list 内のブール等価比較が true か false かに基づいて、クエリは 1 または 0 を返します。

その後、考えられる 3 つの状態に応じて、アプリでさまざまなことを行うことができます。

PHP で非推奨の「mysql」関数を使用するのをやめるべきです。それらは PHP の次のバージョンで廃止されます。mysqli または PDO を使用します。

また、準備されたクエリを使用し、$hashed_pa​​ssword と $email をクエリ パラメータとして渡す方法を学ぶ必要があります。これにより、SQL インジェクションの脆弱性を回避でき、文字列のエスケープについて心配する必要がなくなります。

PDO を使用した完全な例 (未テスト) を次に示します。

$stmt = $pdo->prepare("SELECT hashed_password = :password AS is_password_correct 
    FROM employees WHERE email = :email");
if ($stmt === false) {
    // always check for errors
}
$result = $stmt->execute(array(":password"=>$hashed_password, ":email"=>$email));
if ($result === false) {
    // always check for errors
}
if ($stmt->rowCount() == 0) {
    // no such user
} else {
    while ($row = $stmt->fetch()) {
        if ($row["is_password_correct"] == 1) {
            // password is correct for the given user
        } else {
            // password is wrong
        }
    }
}
于 2013-01-23T22:48:18.830 に答える
0

これを行う簡単な方法は、PHP 側で比較を行うOR代わりに句を使用することです。AND

$mysql = mysql_query("SELECT email, hashed_password FROM employees WHERE email = '{$email}' OR hashed_password = '{$hashed_password} '");

if ( mysql_num_rows($mysql) < 1 )
{
    // e-mail and password not found
    header ("Location: index.php?error=1");
    die();    
}
else
{
    $rows = mysql_fetch_assoc($mysql);

    if ($rows["email"] != $email)
    {
        // e-mail not found
    }
    else if ($rows["hashed_password"] != $hashed_password)
    {
        // passwords do not match
    }

}
于 2013-01-23T22:44:09.993 に答える