2012-09-05 10 views
0

플랫폼과 함께 이름의 중복을 찾는 데 약간의 코드가 필요합니다. 나중에 고유 ID를 찾는데도 적용됩니다.PDO로 중복 항목 검색

예를 들어 Xbox에 "Apple"이라는 서버가 있고 동일한 플랫폼으로 "Apple"이라는 이름의 레코드를 삽입하려고하면 거부됩니다. 그러나 PS3에서 "Apple"과 같은 이름을 가진 다른 플랫폼이 허용됩니다.

나는 아이디어를 찾고 답변을 찾고 있지만 어둠 속에서 중복을 확인하는 가장 좋은 방법은 무엇인지에 관해서 생각하고있다. 는 PHP의 등 매뉴얼과 없음에서

$nameDuplicate_sql = $db->prepare("SELECT * FROM `servers` WHERE name=':name' AND platform=':platform'"); 
$nameDuplicate_sql->bindValue(':name', $name); 
$nameDuplicate_sql->bindValue(':platform', $platform); 
$nameDuplicate_sql->execute(); 

내가 다른 솔루션의 무리를 시도했습니다, 여기에서 몇 가지 다른 생각 작동하는 것처럼 :

는 지금까지 내가 가진 것입니다.

저는 PDO를 고수하려고합니다. 그러나 이것은 어디에서 돌아야 할지를 파악할 수없는 경우입니다. 이것이 mysql_ *에 있다면 아마도 mysql_affected_rows를 사용할 수 있지만 PDO에서는 단서가 없습니다. rowCount는 유망 해 보였지만 INSERT, UPDATE 또는 DELETE 문이 아니기 때문에 항상 0을 반환합니다.

아, phpMyAdmin에서 SQL 문을 시도했지만 작동합니다. 나는 간단한 이름/플랫폼으로 시도해 보았고 제대로 열을 발견했다.

누구든지 나를 도울 수 있다면 여기에 감사드립니다.

답변

2

, PDOStatement :: rowCount의()은 SELECT 문에 의해 영향을받는 행의 수를 반환하지 않습니다. 대신 PDO :: query()를 사용하여 원하는 SELECT 문과 동일한 조건자를 사용하여 SELECT COUNT (*) 문을 실행 한 다음 PDOStatement :: fetchColumn()을 사용하여 이 반환 될 행 수를 검색하십시오. 응용 프로그램에서 올바른 작업을 수행 할 수 있습니다.

+0

이것에 대한 나의 유일한 불만은 내가 그것을 벗어나야한다는 것이다. 그래서 나는 준비된 진술에 기대고있다. 쿼리 대신 준비된 명령문과 함께 SELECT COUNT (*) 문을 사용할 수 있습니까? 나는 정말 자신을 도주하는 것에 신뢰하지 않습니다. – Battleroid

+0

사실 나는 이것을 준비된 진술로 시도해 보았습니다. 내가 언급 한 것처럼 SELECT COUNT (*)와 함께 fetchColumn을 사용 했으므로 조건과 일치하는 행을 안정적으로 반환합니다. – Battleroid

1

매개 변수 토큰에 대한 쿼리에서 작은 따옴표를 제거하십시오. 일단 묶여지면 따옴표 붙습니다 ... 준비된 명령문의 이유 중 일부입니다.

대부분의 데이터베이스에 대한
$nameDuplicate_sql = $db->prepare("SELECT * FROM `servers` WHERE name= :name AND platform= :platform"); 
+0

나는 몰랐다. 그럴거야. – Battleroid

+0

또한 Sel 제안과 같이 여기에 카운트 쿼리를 사용해야합니다. – prodigitalson

2

중복을 확인하는 대신 데이터베이스 테이블에서 직접 적용하지 않는 이유는 무엇입니까? 항목이 이미있는 경우 항목을 만들지 못하게하는 복합 키를 만드시겠습니까?

CREATE TABLE servers (
    serverName varchar(50), 
    platform varchar(50), 
    PRIMARY KEY (serverName, platform) 
) 

이 방법, 당신은 결코 중복을 얻을, 그것은 또한 당신이 당신을 위해 오히려 편리 할 수도 같은 소리 MySQL의 insert... on duplicate key update... 구문을 사용할 수 있습니다.

ALTER TABLE servers DROP PRIMARY KEY, ADD PRIMARY KEY(serverName, platform); 

편집 : 당신이 이미에 기본 키가 있거나 새 테이블을 만들고 싶어하지 않는 경우

, 당신은 다음을 사용할 수있는 기본 키는 단일 행 또는 중 하나입니다 의 행 수는입니다. 단일 행에는 동일한 값을 두 번 사용할 수 없지만 복합 키 (여기서 내가 제안한 것)는 두 열 사이에 동일한 데이터가 나타날 수 없다는 것을 의미합니다.

이 경우 서버 이름을 추가하고 플랫폼과 연결 시키십시오. 테이블에 동일한 서버 이름을 포함하는 행을 추가 할 수 있습니다. 고유 한 플랫폼과 연관되어 있으며 그 반대의 경우에도 모든 서버 이름이 고유 한 경우 원하는만큼 여러 번 나열된 플랫폼을 가질 수 있습니다.

동일한 서버 이름/플랫폼 조합이있는 레코드를 삽입하려고하면 데이터베이스에서 레코드를 삽입 할 수 없습니다. 그래도 또 다른 황금 이점이 있습니다. 이 주요 제약으로 인해 mysql은 특별한 유형의 쿼리를 사용할 수 있습니다. insert... on duplicate key update 구문입니다. 즉, 동일한 데이터를 두 번 삽입하려고하면 (예 : 데이터베이스에서 no로 표시) 테이블에 이미있는 행을 캐치하고 업데이트 할 수 있습니다. 예 :

행의 주소는 serverName=Fluffeh이며 주소는 platform=Boosh입니다. 그러나 지금은 알지 못하기 때문에 서버 IP 주소를 업데이트하려는 의도로 레코드를 삽입하려고 시도합니다.

는 일반적으로 당신은 단순히 같은 것을 작성합니다

insert into servers (serverName, platform, IPAddress) 
values ('$serverName', '$platform', '$IPAddy') 

을하지만, 당신이 할 수있는 식별 좋은 기본 키 :

insert into servers (serverName, platform, IPAddress) 
values ('$serverName', '$platform', '$IPAddy') 
on duplicate key update set IPAddress='$IPAddy'; 

두 번째 쿼리는 모든 데이터 행을 삽입합니다 이미 존재하지 않으면. 그것이라면, Bam! 당신의 의도였던 서버의 IP 주소를 업데이트 할 것입니다.

+0

나는 이런 존재를 전혀 몰랐다. 이것이 정확히 어떻게 작동합니까? – Battleroid

+0

글쎄, 나는 그것을 기본 키로 만들지 않을 것이다. 나는 두 번째 고유 키를 사용할 것이다. – prodigitalson

+0

@CaseyWeed 참조 (길이가 길어짐) 편집 : – Fluffeh