2

私はついに教訓を学び、PDOに切り替えました。

現在、かなりの数のクエリがありますが、これは苦労しています。ログイン中に個々の user_salt を取得することになっています。

function getsalt($email) {
    $sql = "SELECT    *
                FROM users
                WHERE email = '$email'
                LIMIT 1";

    foreach ($db->query($sql) as $row);

    print_r( $row['salt']);
};

明らかに、私は1つのレコードだけが必要であり、とにかく一致するレコードは1つしかありませんが、これは呼び出されたときに死の白い画面を引き起こしています.

私は何かが欠けているに違いない。

4

2 に答える 2

3

あなたが使用した必要はありませんforeach

また、他の人が指摘したように、準備済みステートメントを使用する必要があります。

また、DB クエリの結果が本当に成功したかどうかも確認する必要があります。

function getsalt($email) {
    $sql = "SELECT      salt
                FROM    users
                WHERE   email = ':email'
                LIMIT   1";

    $stmt = $db->prepare($sql);
    if($stmt === FALSE)
        return(FALSE);

    $stmt->bindParam(':email', $email);
    $stmt->execute();
    $salt = $stmt->fetchColumn();

    print_r( $salt );
}

もしも:

  • クエリにパラメーターがありませんでした (単純な選択または作成/変更)。
  • DB クエリが成功したかどうかを確認したくありませんでした。
  • あなたは本当にクエリをワンライナーとして書きたいと思っています。

あなたはできる:

foreach($pdo->query('SHOW TABLES')->fetchAll() AS $row) print_r($row);
于 2012-06-29T18:20:46.333 に答える
1

でエラーが発生する可能性がありますquery()。以下のように確認する必要があります。

この関数はfalse、エラーが発生した場合、またはすべてがうまくいった場合はソルトを返します。

function getSalt($email) {
    $sql = "SELECT salt FROM users WHERE email = '$email'"; 
    $resultSet=$db->query($sql);
    if (!$resultSet) return false;
    return $resultSet->fetchColumn(); 
};

SQL インジェクション攻撃を回避する$emailには、関数に渡す前に の形式を必ず検証してください。

于 2012-06-29T18:21:47.483 に答える