2013-04-23 8 views
1

SQLSRV 드라이버로 PHP와 MSSQL에서 검색 기능을 만들고 싶습니다.PHP Person 폭발로 검색

페이지에 검색 입력란 하나만 있습니다. "Persons"라는 개인 테이블과 SSN, 성, 성을 검색하고 싶습니다.

문제는 한 사람이 Firstname 열에 하나 이상의 middelnames를 가질 수 있다는 것입니다. 만 FIRSTNAME 또는 단지 middelname (들) 또는 성 :

는 또한 하나의 같은 문자열을 검색 할.

어떻게하면됩니까? PHP에서 explode 함수를 사용해야합니까?

+0

, 당신은 매우 느린 검색을 끝낼 것입니다. –

+0

왜 그럴까요? 또한 explode를 사용하여 LIKE 쿼리를 변경하는 경우 –

+0

firstname 열에 "John Joe Jack James Joaquin"이 포함되었을 수 있습니다. 중도만을 검색하려면 "John"을 잘라야합니다. 모든 행에. 분명히 당신은''%% James % ''와 같은 행을 할 수 있습니다. 그리고 그 열의 첫 번째 이름이 아닌 행을 확인하십시오. 그러나 그것은 느려질 것입니다. –

답변

0

검색 색인을 만드는 것이 좋습니다. 다음에

내가 당신 persons 표는 다음과 같습니다 가정

| person_id | firstname | lastname | ssn | 

가 검색 색인을 구축 할 수 있도록, 당신은에 대한 person_searchindex 표가 필요합니다

| person_id | search_term | 

당신 다음과 같은 것을 사용할 수 있습니다. (단지 첫 번째 스케치 일뿐입니다.)

<?php 
function addTermToSearchIndex($person_id, $term) 
{ 
    performQuery("INSERT INTO person_searchindex (person_id, search_term) 
        VALUES (" . (int)$person_id . ", ". 
        "\"" . escapeForQuery($term) . "\");"); 
} 

function buildSearchIndexForPerson($person_id, $firstname, $lastname, $ssn) 
{ 
    $firstnames = explode(" ", $firstname); 
    foreach($firstnames => $name) 
    { 
     addTermToSearchIndex($person_id, $name); 
    } 

    $lastnames = explode(" ", $lastname); 
    foreach($lastnames => $name) 
    { 
     addTermToSearchIndex($person_id, $name); 
    } 

    addTermToSearchIndex("$ssn"); 
} 

function deleteSearchIndexForPerson($person_id) 
{ 
    performQuery("DELETE FROM person_searchindex WHERE person_id = " . (int)$person_id . ";"); 
} 

function rebuildSearchIndexForPerson($person_id, $firstname, $lastname, $ssn) 
{ 
    deleteSearchIndexForPerson($person_id); 
    buildSearchIndexForPerson($person_id, $firstname, $lastname, $ssn); 
} 

function rebuildSearchIndex() 
{ 
    performQuery("DELETE FROM person_searchindex;"); 
    $result = performQuery("SELECT * FROM persons;"); 
    while($row = getRow($result)) 
    { 
     buildSearchIndexForPerson($ow["person_id"], $row["firstname"], $row["lastname"], $row["ssn"]); 
    } 
} 

function search($searchterm) 
{ 
    $sqlcond = "FALSE"; 

    $terms = explode(" ", $searchterm); 
    foreach($terms => $term) 
    { 
     $sqlcond .= " OR s.search_term LIKE \"%" . escapeForQuery($term) . "%\""; 
    } 

    return performQuery("SELECT p.person_id, p.firstname, p.lastname, p.ssn FROM persons AS p LEFT JOIN person_searchindex AS s ON p.person_id = s.person_id WHERE $sqlcond;"); 
} 

?> 

사람 행을 추가하거나 변경할 때마다 rebuildSearchIndexForPerson() 메 소드에 호출을 추가하십시오. 사람 행을 삭제할 때마다 방법 deleteSearchIndexForPerson()에 대한 호출을 추가하십시오. 처음으로 무언가를 검색하려면 먼저 rebuildSearchIndex()으로 전화하여 이전 사람 행에 대한 검색 색인을 만들어야합니다. 그 후에 search() 기능을 사용할 수 있습니다.

내가 말했듯이, 그것은 아주 첫 번째 스케치 일뿐입니다. 예를 들어 performQuery, escapeForQuerygetRow 메소드를 실제로 사용하려는 것으로 변경해야합니다. 또한, PHP 코드의 품질은 특별히 좋지 않습니다. 그러나 그것이 어떻게 작동하는지에 대한 그림이 분명 해져야합니다. 데이터 모델을 재 작업하지 않는 한 어떤 시점에서 당신이 당신의 전체 데이터 세트에 문자열 작업을해야하기 때문에