プリペアドステートメントを使用してPHPで登録ページを作成しました。私の質問はかなり単純なものです。ユーザーが登録するとき、他の人と同じユーザー名または電子メールで登録していないことを確認したいと思います。したがって、検証手順の一環として、2つのクエリを実行します。1つは電子メールが存在するかどうかを確認するためのもので、もう1つはユーザー名が存在するかどうかを確認するためのものです。私の質問は、より良い方法はありますか?1つ以上のクエリを実行すると、パフォーマンスがいくらか犠牲になる可能性があると思います。そのようなクエリによってパフォーマンスが著しく影響を受けることさえありますか?私は走ることができたことに気づきます"SELECT * FROM table WHERE username = ? or email = ?",
しかし、一般的な「ユーザー名または電子メールのいずれかが現在使用されているので、試行錯誤してどちらが正しいかを見つけてください」ではなく、ユーザーに何が間違っているのかを知ってもらいたいと思います。スピードに偏執的だったのかもしれませんが、他の人の意見がどうなっているのか興味がありました。
6 に答える
OR を使用してクエリを実行し、返された結果を確認して、正確に何が見つかったかを報告します。
ただし、データベースの内部構造とインデックス作成によっては、2 つの個別のクエリを OR で結合するよりも高速になる場合があります。環境に関する明確な答えを得るには、すべてのケース (1 つが見つかった、両方が見つかった、何も見つからなかった) をベンチマークすることをお勧めします。
ユーザーの情報を保持しているデータベースで、ユーザー名と電子メールエンティティを一意にします。主キーのように。
$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;
}
それはあなたの目的にどうですか?
あなたのクエリは良いです。1 つまたは 2 つの結果が得られます。2 メールのみまたはニックネームのみの登録が存在する場合。1 登録に電子メールとニックネームがある場合。JS を使用し、入力フィールドの右側に理由を指定します
まあ、それが最も簡単な方法だと思います:
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 フラグ。
これが遊ぶための例です。
性能的には悪くないと思います
テーブルから 1 行を取得する選択クエリがある場合。数千行としましょう。その影響はまったく言及されるべきではありません..
あなたのケースでは起こっていない多くのリソースを必要とする結合クエリは、パフォーマンスにどのような影響を与えますか...
個別に使用しても安全だと思います。現在 100 万人以上のユーザーがいるウェブサイトで行っています。
また、mysqlサーバーでこのクエリを実行してみて、これにかかる時間を確認してください(特により複雑なクエリの場合)