2014-02-07 5 views
0

Google을 검색했지만이 기능이별로 좋지 않으므로 SO가 도움이 될 수 있습니다. 몇 가지 프로젝트에 대한 사용자 인증 시스템을 개발 중이며 사용자 이름이기도 한 이메일 주소가 고유해야합니다.지정된 값이 필드에서 발견되면 PDO MySQL 문을 거부 하시겠습니까?

필자는 MySQL 쿼리에서 필드를 고유하게 설정했지만, 제공된 전자 메일이 기존 레코드와 일치 할 경우 SQL 쿼리를 취소하고 "지정된 전자 메일이 이미 사용 중입니다"라는 메시지를 사용자에게 알리는 방법이 필요합니다.

삽입하기 전에 선택 쿼리를 수행 할 수 있지만 SQL 쿼리를 작성하여 삽입이 수행되지 않는 경우 if existing EXE.com을 전자 메일 또는 이와 비슷한 방식으로 수행해야하는지 궁금합니다.

삽입이 수행되지 않으면 알 필요가 있으며 다른 오류와 구분할 수 있어야합니다.

이것이 가능합니까? 방법? 당신이 PDO를 사용하는 경우

+2

삽입을 시도하고 'PDOException'을 잡아낼 수 있습니다/적절한 코드에 대한 MySQLi 오류를 확인하십시오. – Phil

+0

@ Phil 이메일이 중복되어 쿼리가 구체적으로 실패했는지 어떻게 확인할 수 있습니까? – Razick

+1

1) 쿼리를 실행하여 $ email이 있는지 확인하십시오. 2) 행이 반환되면 $ email이 존재하고 거부 물건을 출력합니다. 행이 없으면 그 행은 존재하지 않으며 그 때 일어날 일은 무엇이든 할 수 있습니다. –

답변

1

, 당신은 단지

$stmt = $mysqli->prepare('INSERT INTO `user` (`email`) VALUES (?)'); 
$stmt->bind_param('s', $email); 
if (!$stmt->execute()) { 
    if ($stmt->errno == 1586) { 
     // inform user, throw a different exception, etc 
    } else { 
     throw new Exception($stmt->error, $stmt->errno); 
    } 
} 
MySQLi

를 사용하는 경우이 과정이 유사하다 예를 들어

// make sure you're set to throw exceptions 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$stmt = $pdo->prepare('INSERT INTO `user` (`email`) VALUES (?)'); 
try { 
    $stmt->execute([$email]); 
} catch (PDOException $e) { 
    $errorInfo = $stmt->errorInfo(); // apparently PDOException#getCode() is pretty useless 
    if ($errorInfo[1] == 1586) { 
     // inform user, throw a different exception, etc 
    } else { 
     throw $e; // a different error, let this exception carry on 
    }   
} 

http://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html#error_er_dup_entry_with_key_name

를 참조 예외를 catch 및 상태 코드를 확인하실 수 있습니다

+0

좋아, 나는 타이머가 나를 허용하자마자 대답을 받아 들일거야. 고맙습니다. – Razick

+1

오류 코드는 [1062] (http://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html#error_er_dup_entry) 일 수도 있습니다. 나는 그것을 시험해보고 어떤 오류 코드가 돌아 왔는지 확인하려한다. – Phil

+0

흠, 나는 내 코드를 전혀 사용하지 않고있다. 삽입이 실패하지만 예외는 없습니다. – Razick