4

プリペアドステートメントを使用してPHPで登録ページを作成しました。私の質問はかなり単純なものです。ユーザーが登録するとき、他の人と同じユーザー名または電子メールで登録していないことを確認したいと思います。したがって、検証手順の一環として、2つのクエリを実行します。1つは電子メールが存在するかどうかを確認するためのもので、もう1つはユーザー名が存在するかどうかを確認するためのものです。私の質問は、より良い方法はありますか?1つ以上のクエリを実行すると、パフォーマンスがいくらか犠牲になる可能性があると思います。そのようなクエリによってパフォーマンスが著しく影響を受けることさえありますか?私は走ることができたことに気づきます"SELECT * FROM table WHERE username = ? or email = ?",しかし、一般的な「ユーザー名または電子メールのいずれかが現在使用されているので、試行錯誤してどちらが正しいかを見つけてください」ではなく、ユーザーに何が間違っているのかを知ってもらいたいと思います。スピードに偏執的だったのかもしれませんが、他の人の意見がどうなっているのか興味がありました。

4

6 に答える 6

3

OR を使用してクエリを実行し、返された結果を確認して、正確に何が見つかったかを報告します。

ただし、データベースの内部構造とインデックス作成によっては、2 つの個別のクエリを OR で結合するよりも高速になる場合があります。環境に関する明確な答えを得るには、すべてのケース (1 つが見つかった、両方が見つかった、何も見つからなかった) をベンチマークすることをお勧めします。

于 2012-07-03T11:48:35.180 に答える
2

ユーザーの情報を保持しているデータベースで、ユーザー名と電子メールエンティティを一意にします。主キーのように。

于 2012-07-03T11:55:27.100 に答える
0
    $result = mysql_query("SELECT * FROM table1 WHERE Username = ''", $link);
    $num_rows = mysql_num_rows($result);

    $result2 = mysql_query("SELECT * FROM table1 WHERE Email= ''", $link);
    $num_rows2 = mysql_num_rows($result2);

    $checkUsrN = false;
    $checkEmail = false;
    $mesg = "The following is bad: ";

    if($num_rows == 0)
    {
       $checkUsrN = true;         
    }
    else{
        $mesg .= "Username";
    }

    if($num_rows2 == 0)
    {
       $checkEmail = true;
    }
    else{
        $mesg .= "Email";
    }

    if($checkUsrN == false || $checkEmail == false)
    {
       echo $mesg;
       break;
    }

それはあなたの目的にどうですか?

于 2012-07-03T11:53:24.133 に答える
0

あなたのクエリは良いです。1 つまたは 2 つの結果が得られます。2 メールのみまたはニックネームのみの登録が存在する場合。1 登録に電子メールとニックネームがある場合。JS を使用し、入力フィールドの右側に理由を指定します

于 2012-07-03T11:51:46.667 に答える
0

まあ、それが最も簡単な方法だと思います:

SELECT IF(username = :username_to_check, 1, 0) AS dup_username
  FROM users
 WHERE username = :username_to_check OR email = :email_to_check

次に、以下を確認します。1) 行数 - 0 の場合、重複は見つかりませんでした。2) 行数 > 0 の場合、結果の dup_username フラグ。

これが遊ぶための例です。

于 2012-07-03T11:51:46.990 に答える
0

性能的には悪くないと思います

テーブルから 1 行を取得する選択クエリがある場合。数千行としましょう。その影響はまったく言及されるべきではありません..

あなたのケースでは起こっていない多くのリソースを必要とする結合クエリは、パフォーマンスにどのような影響を与えますか...

個別に使用しても安全だと思います。現在 100 万人以上のユーザーがいるウェブサイトで行っています。

また、mysqlサーバーでこのクエリを実行してみて、これにかかる時間を確認してください(特により複雑なクエリの場合)

于 2012-07-03T11:52:05.410 に答える