Я реализовал поиск, работа которого состоит в том, чтобы найти записи свойств из базы данных. Поиск несколько полностью зависит от набранного ключевого слова от пользователя.
Предположим,
Если пользователь вводит ключевое слово как 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);
Вы можете достичь этого с помощью некоторого тестирования регулярных выражений. Предполагая, что правила, которые вы изложили, являются строгими.
$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
Заявление, вы также можете создать регулярное выражение для адреса. Это было бы немного сложнее, хотя и, возможно, не применимо
Других решений пока нет …