-1

複数のユーザー名が作成されるのを防ぐために、登録フォームに次のコードがあります。

connect_db();
    $check = mysql_query("SELECT username FROM school_users WHERE username = '$username'") or die(mysql_error());
    $check2 = mysql_num_rows($check);

if ($check2 != 0) {
    respond("error", "Sorry, the username ".$_POST['username']." is already in use. Please choose a different username.");}

ただし、同じステートメントで、電子メールも確認したいと思います。

    connect_db();
        $check = mysql_query("SELECT username, email FROM school_users WHERE username = '$username' or email = '$email'") or die(mysql_error());
        $check2 = mysql_num_rows($check);

    if ($check2 != 0) {
if (???username???){
        respond("error", "Sorry, the username ".$_POST['username']." is already in use. Please choose a different username.");}}
else if (???email???) {
    respond("error", "Sorry, the username ".$_POST['username']." is already in use. Please choose a different username.");}}
4

3 に答える 3

2

あなたはやってみることができます:

connect_db();
$check = mysql_query("SELECT 'User' validation
                        FROM school_users 
                       WHERE username = '$username' 
                       UNION ALL
                      SELECT 'Email' 
                        FROM school_users 
                       WHERE email = '$email'") or die(mysql_error());
$row = mysql_fetch_assoc($check);

if($row)
{
    if ($row["validation"] == 'User') {
            respond("error", "Sorry, the username ".$_POST['username']." is already in use. Please choose a different username.");}}
    else if ($row["validation"] == 'Email') {
        respond("error", "Sorry, the email ".$_POST['email']." is already in use. Please choose a different email.");}}
}

または、個別に行うこともできます...

//Validate UserName
connect_db();
$check = mysql_query("SELECT username FROM school_users WHERE username = '$username'") or die(mysql_error());
$check2 = mysql_num_rows($check);

if ($check2 != 0) {
    respond("error", "Sorry, the username ".$_POST['username']." is already in use. Please choose a different username.");}

//Validate Email
connect_db();
$checkEmail = mysql_query("SELECT email FROM school_users WHERE email = '$email'") or die(mysql_error());
$checkEmail2 = mysql_num_rows($check);

if ($checkEmail2 != 0) {
    respond("error", "Sorry, the email ".$_POST['email']." is already in use. Please choose a different email.");}

さらに、コードはSQLインジェクション攻撃に対して脆弱であり、非推奨のMySQLphp関数を使用しています。コードの脆弱性を減らしたい場合は、次のリンクを参照してください。

PHPでmysql_*関数を使用すべきではないのはなぜですか?

mysql_関数の代わりに何を使用できますか?

プリペアドステートメント

MySQLiで準備されたステートメント

于 2013-02-10T18:00:18.767 に答える
1

これを 1 つのステートメントで行うこともできます。

SELECT username
FROM school_users
WHERE username = '$username' or  email = '$email'

これを行う場合、ユーザーへのメッセージを変更する必要があります。. . 「あなたのユーザー名または電子メール (またはその両方) は既に使用されています。」

1 つのステートメントでメッセージをカスタマイズするには、集計を使用できます。

select (case when max(username = '$username') = 1 and max(email = '$email' = 1
             then 'both'
             when max(username = '$username') = 1
             then 'username'
             when max(email = $email) = 1
             then 'email'
        end) as WherePresent
from school_users
WHERE username = '$username' or  email = '$email'

すべてが正常な場合、これは 0 行を返します。それ以外の場合は、"both"、"username"、"email" のいずれかを含む 1 つの行を返し、どちらが重複しているかを示します。

于 2013-02-10T18:04:18.183 に答える
1

ご想像のとおり、元のコードはソリューションからそれほど遠くありません。

$check = mysql_query("SELECT username, email FROM school_users WHERE username = '$username' or email = '$email' LIMIT 1") or die(mysql_error()); //Limit one reduces the time mysql searches the db since it stops on the first occurence
        $check2 = mysql_fetch_assoc($check); //we do not only want to know the count of matching rows, but the values return in email and username field

//trimming makes sure we do not have any spaces at the beginning or end
//strtolower makes sure we set UserName == usERnaME == username etc.pp.
if (strtolower(trim($row['username'])) == strtolower(trim($_POST['username']))){ // check the result
        respond("error", "Sorry, the username ".$_POST['username']." is already in use. Please choose a different username.");}
}
else if (strtolower(trim($row['email'])) == strtolower(trim($_POST['email']))) { // and again for email adress
    respond("error", "Sorry, the email ".$_POST['email']." is already in use. Please choose a different email.");}
}
于 2013-02-10T18:21:26.723 に答える