2010-04-12 3 views
1

사용자가 일련의 태그를 작성하고 (분리됨) 양식을 게시합니다.
나는 태그를 포함하는 배열을 만들고 array_unique() PHP 함수로 중복을 삭제합니다.mySQL 테이블에서 배열 항목의 존재를 확인하는 가장 빠른 방법

나는 일을 생각하고 :

  • foreach는 ($ 항목으로 $의 newarray)와 배열을 통과 {...}
  • 검사 태그의 MySQL의 테이블
  • 의 존재에 대한 각 $ 항목
  • 항목이 존재하지 않는 경우, 태그 테이블

에 삽입은 빠르게 또는 더 OPTIMUM 방법에 대한 있는가 이러는거야?

답변

4

사람들이이 방법에 대해 의견을 제시 할 수 있기를 희망합니다. 직관은 아마도 사물에 대해 가장 좋은 방법은 아닐 것이라고 말하지만, 모두 어떻게 생각하니?

중복을 찾기 위해 DB를 추가로 호출하는 대신 태그에 두 번 삽입 할 수 없도록 DB에 고유 제약 조건을 추가하십시오. 그런 다음 새 태그를 추가 할 때 INSERT IGNORE...을 사용하십시오. 이 방법은 중복으로 인해 발생하는 오류를 무시하는 동시에 새 항목을 삽입합니다.

+0

+1 이것은 정확하게 내가 할 수있는 것입니다. 복제본이있을 때 특정 로직을 가진 태그를 특별히 처리 할 필요가 없다면, 나는'INSERT IGNORE'하고 잊어 버릴 것입니다. 'INSERT IGNORE'가 당신을 대신 할 때'INSERT'에서 중복 된 데이터를 제거하기 위해 별도의'SELECT'와 루프를 사용하는 것이 왜 어려운가요? – zombat

+0

나는 이것이 잘 작동 할 것이라고 생각한다. 특히 중복 검색 'SELECT'가 불필요하게 될 것이기 때문이다.그러나 확실한 두 가지 접근법을 벤치 마크하는 것이 가치가있을 수 있습니다. – awgy

+0

@thetaiko. 내 태그 표는 다음과 같습니다. - id : primary, autoinc - 제목 : varchar (50) 중복되는 내용을 어떻게 추가해야합니까? – Enrique

2

implode(',' $array)을 호출 한 다음 IN SQL 구문을 사용하여 db에 기존 행이 있는지 확인할 수 있습니다.

예 :

<?php 
    $arr = ... 
    $sql = 'SELECT COUNT(*) FROM table WHERE field IN (' . implode(',', $arr) . ');'; 
    $result = $db->query($sql); 
?> 
+0

당신은'implode (',', $ array)'라고 말하는 것 같아요. 문자열을 배열로 바꾸려면'explode()'를 사용하십시오. – awgy

+0

또한'$ arr'을 정의한 다음'$ array'를 사용했습니다. –

+0

@awgy, @Jack thanks –

1
$tags = array('foo', 'bar'); 

// Escape each tag string 
$tags = array_map('mysql_real_escape_string', $tags, array($sqlCon)); 

$tagList = '"' . implode('", "', $tags) . '"'; 

$qs = 'SELECT id FROM tag_list WHERE tag_name IN (' . $tagList . ')'; 
+1

SQL 인젝션에 대해 너무 신중하다면, 주위에있는 따옴표를 잊어서는 안됩니다. – Gumbo

+0

사실입니다. 응답을 서두 르기 위해 내가 얻은 것입니다. :) – awgy

0

나는 그것이 더 빠른 알고하지는하지만 mysql's IN를 사용할 수 있습니다. 나는 당신이 시도해야 할 것 같아요.

0

당신은 큰 쿼리를 구축하고 대신 많은 작은 쿼리로, 한 번에 그것을 할 수 :

SELECT DISTINCT tag 
    FROM my_tags 
WHERE tag in (INPUT_TAGS) 

그냥 쉼표로 구분 된 목록으로 INPUT_TAGS을 구축하고, 제대로 각 요소를 탈출해야합니다 SQL 주입 공격을 방지합니다.

관련 문제