我想使用 SQLSRV 驱动程序在 PHP 和 MSSQL 中创建搜索功能。
我在页面上只有一个搜索输入字段。我想在名为“Persons”的表和以下列中搜索人员:SSN、Firstname、Lastname
问题是一个人在 Firstname 列中可能有一个或多个 middelname。
我还想搜索单个字符串,例如:仅名字或仅中间名称或姓氏。
我怎样才能做到这一点?我应该在 PHP 中使用explode 函数吗?
我想使用 SQLSRV 驱动程序在 PHP 和 MSSQL 中创建搜索功能。
我在页面上只有一个搜索输入字段。我想在名为“Persons”的表和以下列中搜索人员:SSN、Firstname、Lastname
问题是一个人在 Firstname 列中可能有一个或多个 middelname。
我还想搜索单个字符串,例如:仅名字或仅中间名称或姓氏。
我怎样才能做到这一点?我应该在 PHP 中使用explode 函数吗?
我建议建立一个搜索索引。
在下面,我假设您的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
,escapeForQuery
以及getRow
您实际使用的方法。此外,php 代码的质量也不是特别好。但是它的工作原理应该很清楚。