2017-03-22 1 views
1

중복 된 사용자 이름을 확인하는 가장 좋은 방법을 확인했습니다. 그리고 EXISTS가 성능면에서 더 우수하다고 말하는 사람들을 보았습니다.이 수식은 좋은가요? 아니면 더 좋은 것들이 있습니까? 차이점은 무엇입니까? 과 SELECT EXISTSWHEN EXISTS? 그리고 코드 내에서 이메일을 병합하고 이메일과 사용자 이름을 동시에 확인할 수 있습니까? 또는 두 개의 열쇠를 분리하는 것이 더 나은가? true의 경우 1, 그렇지 않은 경우는 false 0EXISTS를 사용하여 중복 된 사용자 이름 확인

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

RDBMS에 무엇입니까? 쿼리가 작동한다면, 나는 더 나은 것을 생각할 수 없습니다. 네, 이메일과 사용자를 동시에 확인할 수 있습니다. 단지 'OR'조건 만 추가하면됩니다. –

+0

@JuanCarlosOropeza하지만 그들 중 어느 것이 거짓인지'echo'라고 지정할 수 있습니까? 아니면 그것들을 분리하는 것이 왜 더 나은가? –

답변

1

당신은 비트를 반환해야합니다. 그런 다음

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(); 
} 

당신은 SQL을 사용할 수 있습니다 잡아 ..하려고 사용

  • SQL의 COUNT

    $ stmt를 = $ conn-> 사용자들로부터 총 AS ('SELECT COUNT (사용자 이름)를 준비 어디서 username = : username ');

    // $ stmt = $ conn-> prepare ('사용자 이름 = : username 및 email = : email'인 총 발신자 수)

    $ stmt-> bindParam (': username', $ username); $ stmt-> bindParam (': email', $ email); $ stmt-> execute(); $ row = $ stmt-> fetch (PDO :: FETCH_OBJ); if ($ row-> total> 0) { echo '사용자 이름/이메일 이미 가져 왔습니다.'; }

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

+0

더 자세히 설명해 주실 수 있습니까? 왜 다른 것보다이게 더 낫지. –

+0

결과가 true 또는 false 인 경우 성능에 영향을주지 않는 위의 쿼리를 사용할 수 있습니다. 또한 여러 테이블에 레코드 존재 여부를 확인하기 위해 여러 테이블에 하위 쿼리가있는 레코드가 있는지 확인합니다. –

+0

사실인지 거짓인지 정의하는 것 외에는 내 코드와 당신의 코드 사이에 차이가 없습니까? –

0

당신은 고유 키를 사용자 이름 또는 이메일을 설정할 수있는 경우

$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

저의 코드가 존재를 탐색하기 전에 어떻게 보았습니까? 사람들은 EXISTS가 여러 가지 방법으로 COUNT보다 빠르다고 말합니다. 왜냐하면 값으로 하나의 행을 찾을 때 직접 멈추기 때문입니다. –

+0

:) 두 쿼리간에 속도를 덤프해야 할 수도 있습니다. –