PHP人物搜索与爆炸

时间:2013-04-23 09:12:52

标签: php sql sql-server explode sqlsrv

我想使用SQLSRV驱动程序在PHP和MSSQL中创建搜索功能。

我在页面上只有一个搜索输入字段。 我想在我的表中搜索名为“Persons”的人员以及以下列:SSN,名字,姓氏

问题是一个人可能在名字专栏中有一个或多个middelnames。

我还想搜索单个字符串,例如:只有名字或只有middelname(s)或姓氏。

我该怎么做?我应该在PHP中使用explode功能吗?

1 个答案:

答案 0 :(得分: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()功能。

正如我所说,这只是第一个草图。例如,您必须将方法performQueryescapeForQuerygetRow更改为您实际使用的方法。此外,PHP代码的质量并不特别好。但它的工作原理图应该清楚。