제 질문은 이메일을 예로 들겠습니다. 그러나 이것은 무엇이든 적용 할 수 있습니다.삽입하기 전에 기존 레코드를 확인하는 가장 빠른 방법 [mysql_errno()]
$result = mysql_query("SELECT * FROM Users WHERE email = '".mysql_real_escape_string($email)"';");
if(!$result)
{
die(mysql_error());
}
if(mysql_num_rows($result) > 0)
{
die('<p>Email already in DB. <a....>Recover Email</a></p>');
}
else
{
//insert new user data into Users table
}
나 '이후 :
일반적으로 새로운 사용자를 등록하기 전에 그/그녀의 이메일은 이미이 같은 DB 뭔가에 있으면 내가 확인 (그/그녀의 이메일을 삽입 포함) d는 내 사용자 테이블의 email
필드를 UNIQUE
으로 제한했습니다. 먼저 삽입하려고 시도하는 것이 더 빠르지 않습니까? 실패 할 경우 오류를 확인 하시겠습니까? 이런 식으로 뭔가가 :
$result = mysql_query(...);//insert new user data into Users table
if(!$result)
{
if(mysql_errno()==$insert_unique_error)
{
$error = '<p>Email already in DB. <a....>Recover Email</a></p>';
}
else
{
$error = mysql_error();
}
die($die_str);
}
문제는 내가 $insert_unique_error
가해야한다 무엇 를 모르는 것입니다. 다음() 있으며, mysql_affected_rows으로 계산 행을 확인 이메일 필드에 고유 키와
The first two characters of an SQLSTATE value indicate the error class:
Class = '00' indicates success.
Class = '01' indicates a warning.
Class = '02' indicates “not found.” This is relevant within the context of cursors and is used to control what happens when a cursor reaches the end of a data set. This condition also occurs for SELECT ... INTO var_list statements that retrieve no rows.
Class > '02' indicates an exception.
을 설정, 그래서 왜? –
@DamienPirsy 정상적인 방법으로 전자 메일이 아직 존재하지 않으면 (select + insert) 두 번째 쿼리가있을 때 (select) 두 번의 쿼리를 수행합니다. 내가 제안한 해결책은 전자 메일의 존재 여부와 상관없이 하나의 쿼리 만 수행합니다 (삽입). –
나는 그것의 생각 해요 : 오류 : 1092 SQLSTATE : HY000 (ER_INSERT_INFO가) 메시지 : 레코드 : % ld 개 중복 : % ld 개 경고 : % ld 개 당신의 메일 필드가 고유해야합니다. – CSharpRU