2014-09-26 9 views
1

PHP와 SQL을 사용하여 데이터베이스에서 텍스트를 표시하는 데 문제가 있습니다. 다음은 내가 가지고있는 것과 유사한 스크립트입니다.MySQL에서 중복 검색 결과를 제거하는 방법은 무엇입니까?

$search_split = explode(" ", $search); //$search is what user entered 
foreach ($search_split as $searcharray) { 
    $searched = mysqli_query($connect, "SELECT * FROM people WHERE `description` LIKE '%$searcharray%'"); 
    while($info = mysqli_fetch_array($searched)) { 
    echo $info['description']; 
    } 
} 

그래서 예를 들어 사용자는 'He is male'이라고 입력합니다. 나는 낱말을 '폭발'기능을 사용하여 'He', 'is'와 'male'의 세 부분으로 나눴다. 그 후, 나는 그 세 단어와 비슷한 단어들을 데이터베이스에서 찾는다. 그러나 한 행에 세 단어가 모두 있으면 행이 세 번 표시됩니다. 한 번만 표시되도록하려면 어떻게해야합니까?

+0

아를 포함 , 당신은 commenter bel처럼 하나의 질의 만 실행하면됩니다. 아우. 'WHERE x LIKE'% word1 % OR WHERE x LIKE '% word2 %'... '와 같은 형식으로 쿼리를 작성해보십시오. – halfer

+0

문제는 SQL 문이 아닌 코드에 있습니다. 개개의 결과를'description '을 사용하여 사전에 입력하십시오. 중복 된 결과 행은 이전 항목을 덮어 씁니다. 결국에는 사전에는 고유 항목 만 포함됩니다 –

답변

1

먼저 결과를 하나의 배열에 저장 한 다음 표시하십시오. 아래 코드를 참조하십시오.

$search_split = explode(" ", $search); //$search is what user entered 
foreach ($search_split as $searcharray) { 
    $searched = mysqli_query($connect, "SELECT * FROM people WHERE `description` LIKE '%$searcharray%'"); 
    while($info = mysqli_fetch_array($searched)) { 
    $results[$info['YOUR_PRIMARY_KEY']] = $info['description']; // this will over write your previous record 
    } 
} 
foreach($results as $result){ 
    echo $result; 
} 

이제 모든 레코드는 한 번만 표시됩니다.

+0

다른 쿼리의 중복 결과가'results'의 다른 항목에 나타나기 때문에 중복을 계속 가져옵니다. –

+0

@PanagiotisKanavos 아니요, 중복 행이 덮어 쓰기 될 때마다. 매우 간단한 솔루션입니다. – Manibharathi

+2

배열을 사전으로 사용하고 있음을 확인하지 못했습니다. –

0

db 쿼리를 foreach 루프에 넣었습니다. foreach 루프는 현재 데이터 : he, is 및 male로 3 회 반복됩니다. 당신이 한 쿼리에서 모든 검색 변수를 넣어 같은 것을 수행 할 작업 :이 쿼리 입력의 이스케이프/소독을지지 않습니다

$search_split = explode(" ", $search); //$search is what user entered 
$querypart = "'%" . implode("%' AND '%", $search_split) . "%'"; // use OR or AND, to your liking 

$searched = mysqli_query($connect, "SELECT * FROM people WHERE `description` LIKE " . $querypart); 
while($info = mysqli_fetch_array($searched)) { 
    echo $info['description']; 
} 

2

당신이 할 수있는 ...주의 다음과 같이 입력하십시오 :

$search = 'test search me'; 
$search_split = array_map(function($piece) use ($mysqli_connection){ 
    return "'%" . $mysqli_connection->real_escape_string($piece) . "%'"; 
}, explode(' ', $search)); //$search is what user entered 
$search_split = implode(' OR `description` LIKE ', $search_split); 
$sql = "SELECT * FROM people WHERE `description` LIKE $search_split"; 
echo $sql; // SELECT * FROM people WHERE `description` LIKE '%test%' OR `description` LIKE '%search%' OR `description` LIKE '%me%' 
$searched = mysqli_query($connect, $sql); 
+2

문제를 해결하지만 SQL 주입을 허용합니다. –

+0

@PanagiotisKanavos 예 좋은 통찰력을 게시하기 전에 재연을 이해했습니다. – Ghost

+0

감사합니다! 그것은 일하고있다! – jacktheking

2

full text search을 사용할 수 있습니까?

ALTER TABLE people ADD FULLTEXT(description); 

그런 다음 당신이 그렇게이

SELECT * 
FROM people 
WHERE 
MATCH (description) 
AGAINST ('+He +is +male' IN BOOLEAN MODE) 
0
$result = array();  

$search_split = explode(" ", $search); //$search is what user entered 
    foreach ($search_split as $searcharray) { 
     $searched = mysqli_query($connect, "SELECT * FROM people WHERE `description` LIKE '%$searcharray%'"); 
     while($info = mysqli_fetch_array($searched)) { 
      $result[] = $info['description']; 
     } 
    } 

$finalres = array_unique($result); 

같은 쿼리를 사용할 수있는 테이블에 전체 텍스트 인덱스를 추가 finalres 고유 결과

for($i = 0; $i < count($finalres); $i++) 
    echo $finalres[$i]; 
관련 문제