我已经实现了搜索,其工作是从数据库中找出属性记录。搜索在某种程度上完全取决于用户输入的关键字。
假设,
如果用户输入1234
或4775
或773
等关键字,则应搜索数据库中zip
列的记录。
接下来,如果用户键入6 S Surfway
或70 N Grove St
或1661-114 Old Country Rd
等关键字,则应仅从数据库中搜索address
列中的记录。
接下来,如果用户键入Calverton
或Freeport
或Riverhead
等关键字,则应仅从数据库中搜索town
列中的记录。
所以,我的问题是我无法根据关键字用户类型过滤这些记录。我的问题是从所需列中过滤基于关键字的记录。
以下是我正在使用的代码:
<?php
header('Content-Type: application/json');
$key = $_REQUEST['keyword'];
$searchOp = $_REQUEST['searchOp'];
if($searchOp==1 || $searchOp==6)
{
$searchChk = "(`property_chk` = '1' OR `property_chk` = '6')";
}else{
$searchChk = "(`property_chk` = '$searchOp')";
}
$data = array(
'locations' => array(),
'errors'=>array(),
'success'=> true,
);
if($db->connect_errno > 0){
$data['errors'][] = $db->connect_error;
die(json_encode($data));
}
$index = 0;
if(intval($key) >= 3){
$zipQuery = $db->query("SELECT zip FROM tbl_property WHERE zip like '%$key%' AND $searchChk GROUP BY zip LIMIT 0,5");
if($zipQuery->num_rows>0){
while($row = $zipQuery->fetch_assoc()){
$data['locations'][] = array(
"value"=> $row['zip'],
"altValue"=> null,
"display"=> $row['zip'],
"type"=> "zip",
"propertyIndex"=> "",
"index"=> $index
);
$index = $index + 1;
}
}
}elseif (!intval($key) && count($key) > 4){
$cityQuery = $db->query("SELECT ste,town FROM tbl_property WHERE town like '%$key%' AND $searchChk GROUP BY town LIMIT 0,5");
if($cityQuery->num_rows>0){
while($row = $cityQuery->fetch_assoc()){
$data['locations'][] = array(
"value"=> $row['town'].', '.$row['ste'],
"altValue"=> null,
"display"=> $row['town'].', '.$row['ste'],
"type"=> "city",
"propertyIndex"=> "",
"index"=> $index
);
$index = $index + 1;
}
}
}elseif (count($key) > 1){
$addrQuery = $db->query("SELECT addr FROM tbl_property WHERE addr like '%$key%' AND $searchChk GROUP BY addr LIMIT 0,5");
if($addrQuery->num_rows>0){
while($row = $addrQuery->fetch_assoc()){
$data['locations'][] = array(
"value"=> $row['addr'],
"altValue"=> null,
"display"=> $row['addr'],
"type"=> "address",
"propertyIndex"=> "",
"index"=> $index
);
$index = $index + 1;
}
}
}
$db->close();
header('Content-Type: application/json');
echo json_encode($data);
答案 0 :(得分:1)
您可以通过一些正则表达式测试来实现这一目标。假设你说的规则是严格的。
$matches = array(); // We do not use it but has to be defined
if (preg_match("/^([a-zA-Z ])+$/", $key, $matches)) {
// Do search by city here
} else if (preg_match("/^([0-9])+$/", $key, $matches)) {
// Do search by postal code here
} else if (preg_match("/^([a-zA-Z])*([0-9 -])+([a-zA-Z \.])+$/", $key, $matches)) {
// Do search by address here
}
示例正则表达式小提琴:
邮政 - https://regex101.com/r/qK8pL7/2
城市 - https://regex101.com/r/yS1oF1/2
地址 - https://regex101.com/r/pZ7dT3/2
这些示例假设邮政编码始终是数字,不包含任何其他字符。假设城市始终是字母字符和/或空格,任何其他字符都会使匹配失败。
使用小提琴更新到您希望允许的其他可能角色,以便更适合您的需求进行测试
您可以创建地址的正则表达式,而不是打开else
语句。这会有点棘手但也许不适用