0

Web サイトに登録しているユーザーが、他のユーザーが入力したことのない固有の 16 桁の番号を入力していることを確認する必要があります。

関連するデータベース情報は、16 桁の数字が という列に格納され、card1テーブル全体の名前が でusers、ユーザーが入力した数字が に格納されていること$card1です。

これが私がこれまでに持っているものです...

$query2 = "SELECT card1 FROM users WHERE card1='$card1' LIMIT 1";
$result2 = smart_mysql_query($query2);

if (mysql_num_rows($result2) != 0)
{               
    header ("Location: register.php?msg=exists");
    exit();
}

アイデアは、データベースに既にある例を見つけ、重複が見つかった場合はエラー メッセージを表示するというものです。

問題は、重複がある場合でも、ユーザーが登録できる (登録フォームをデータベースに送信する) ことを許可し続けていることです。このコード ブロックの直後に、フォームから収集されたすべてのユーザー情報を含むデータベースへの挿入呼び出しがあります。

注:私は PHP エラー メッセージの処理に詳しくありません。使用したのは、コード例の別のインスタンスで見つけた例にすぎません。

4

4 に答える 4

3

次のような if ステートメントを作成します。

$query2 = "SELECT * FROM users WHERE card1='$card1'";
$result2 = mysql_query($query2);

if ($result2 !== false)
{               
   header ("Location: register.php?msg=exists");
   exit();
}

問題を修正する必要があります:)

于 2012-04-16T13:08:19.527 に答える
2

これを行う正しい方法は、ユーザーが入力した数値を保持するフィールドに一意のインデックスを追加することです ( card1)。

次に、最初にINSERT試行せずに新しい行を試行します。SELECTこの操作が失敗した場合は、ユーザーをmsg=existsページにリダイレクトします。これにより、データベースが重複検出を処理できるようになり、メソッドに固有の問題が取り除かれます。2 人のユーザーが同時に同じ番号を送信した場合、SELECT->INSERTがそれを検出する保証はありません。一意のインデックスは、これを検出して防止します。

これを実現するために実行されるクエリは 1 つだけなので、これにはデータベース トラフィックを削減するという利点もあります。

于 2012-04-16T13:10:27.443 に答える
0

これを試してください

$query2 = "SELECT card1 FROM users WHERE card1='".$card1."' LIMIT 1";
$result2 = mysql_query($query2);

if (mysql_num_rows($result2) > 0)
{               
    header ("Location: register.php?msg=exists");
    exit();
}
于 2013-06-26T07:30:10.410 に答える
0

まず、この列の DB に一意のインデックスを作成します。これがベスト プラクティスです。

ALTER TABLE `users`
ADD UNIQUE INDEX `card1` (`card1`);

SQL を次のように変更する必要があります。

$query2 = "SELECT COUNT(1) FROM users WHERE card1='$card1'";
$res = mysql_query($query2);

$data = mysql_fetch_array($res);

if ($data == 1)
{               
   header ("Location: register.php?msg=exists");
   exit();
}

テーブル内の行の存在をチェックし、0 または 1 を返します。

存在する場合 (1)、リダイレクトされます。

于 2012-04-16T13:11:07.870 に答える