2017-03-22 7 views
1

重複したユーザー名を確認する最善の方法を確認しました。そして、EXISTSの方がパフォーマンスが良いと言っている人がいました。それとももっと良いものはありますか?そして、IF EXISTSSELECT EXISTSWHEN EXISTSの違いは何ですか?そして、コード内の電子メールをマージし、同時に電子メールとユーザー名の両方をチェックすることは可能ですか?それとも両方のquiresを分離する方が良いですか?EXISTSを使用して重複したユーザー名を確認する

$username = $_POST['username']; 
    $stmt = $conn->prepare("SELECT EXISTS (SELECT username FROM users WHERE username = :username)"); 
    $stmt->execute([':username' => $username]); 
    if ($stmt->fetchColumn() > 0) { 
     echo "Username is already taken."; 
    } 
+0

あなたのRDBMSは何ですか?あなたの質問がうまくいくならば、私は何もうまく考えることができません。そして、はい、電子メールとユーザーの両方を同時に確認できます。単にOR条件を追加します。 –

+0

@JuanCarlosOropezaでも、どちらが偽で「エコー」かを指定できますか?それとも、それを分離する方が良いのか? –

答えて

1

真の場合は、その後、他の1偽0

SELECT CASE WHEN EXISTS (
     SELECT username FROM users WHERE username = :username 
    ) 
    THEN CAST(1 AS BIT) 
    ELSE CAST(0 AS BIT) 
    END AS result 
+0

あなたはもっと説明できますか?なぜこれが他のものよりも優れているのと同じように。 –

+0

結果が真または偽の場合は、パフォーマンスに影響を与えない上記のクエリを使用できます。複数のテーブルにレコードの存在をチェックするサブクエリもあるレコードの存在をチェックします。 –

+0

それが真か偽かを定義することを除いて私のコードとあなたの違いはありませんか? –

0

あなたは一意のキーとしてユーザ名または電子メールを設定することができますビットを返す必要があります。

  • SQLのCOUNT

    $ stmtは= $ conn->ユーザーから合計AS( 'SELECT COUNT(ユーザー名)を準備します。そして、あなたはSQLを使用することができますキャッチ

    try { 
        // do your insert query. If it fails to insert, it will throw error message 
        // Also need to turn on error exception mode for PDO attribute 
    } catch (PDOException $e) { 
        echo $e->getMessage(); 
    } 
    

    ..てみ使用WHERE username =:username ');

    //または$ stmt = $ conn-> prepare( 'ユーザー名=:usernameとemail =:email'の間にSELECT COUNT(username)

    $ stmt-> bindParam( ':username'、$ username); $ stmt-> bindParam( ':email'、$ email); $ stmt-> execute(); $行= $ stmt->フェッチ(PDO :: FETCH_OBJ); if($ row-> total> 0){ echo 'ユーザー名/メールは既に取得済みです。'; }

    [1]:http://php.net/manual/en/pdo.setattribute.php

+0

それは私のコードがEXISTS人々は、EXISTSがCOUNTよりも高速であることを多くの点で指摘しています。なぜなら、値を持つ行が1つ見つかるとすぐに停止するからです。 –

+0

:)両方のクエリの間に速度をダンプする必要があるかもしれません –

関連する問題