-2

クラス用の簡単なログイン/登録サイトを構築しています。(つまり、md5、sha などはありません) パラメーターの 1 つは、登録時に新しく登録されたパスワードが以前の 3 つと等しくならないようにすることです。この場合、true を返す関数を作成する必要がありました。これを行う方法がわかりません。データベースの主キーは user_id (自動インクリメント) です。ユーザー名が既に存在する場合に true を返す関数を次に示します。

function user_exists ($username) {
    return (mysql_result(mysql_query("SELECT COUNT(`user_id`) 
    FROM `users` WHERE `username` = '$username'"), 0) == 1) ? true : false;}

私はこれから始めて、前の 3 つのユーザー名だけを振り返るコードを追加しようと考えました。

function returns true if password exists database
function password_exists ($password) {
$password = sanitize($password);
return (mysql_result(mysql_query("SELECT COUNT(`user_id`) `FROM `users` 
WHERE `password` = '$password' AND `user_id <'$user_id' ORDER BY user_id DESC, LIMIT 3"), 0) ==  1) ? true : false ;

1 つの関数でやりすぎていませんか? つまり、最初に最後の 3 つのレコードを 1 つの関数で分離してから、そのセットを検索する必要がありますか? エントリに順番に番号を付ける列を追加する必要がありますか? つまり、1、2、3、4、5 の 5 つのレコードがあり、「2」が削除された場合、列は 1、2、3、4 となります。この方法で検索する方が簡単だと思います。どんな助けでも大歓迎です!ありがとう

}
4

2 に答える 2

0

これは、次のフォームのネストされた選択を使用して行うことができます。

SELECT x FROM (SELECT ...) as y;

内部選択 (SELECT ...) は、日付順 (最新のものが最初) で LIMIT が 3 のレコードを返します。

外側の選択は、内側の選択からユーザー名を選択します。

> 0 件のレコードが返された場合、ユーザー名が不適切であることがわかります。

于 2012-12-22T18:09:23.597 に答える
0

これを行う意味はありません。
データベース全体をチェックするか、まったくチェックしないかのいずれかです。

さらに、そのような機能はセキュリティに大きな影響を与える可能性があり、そのようなエラーが他の誰かのパスワードを示唆する可能性があることを意味します.

(宿題で必要な場合は、誰もが PHP を嫌うのも不思議ではありません。クラスでさえ、ひどいコードを書くように教えられます)

于 2012-12-22T18:14:08.047 に答える