Как отфильтровать ключевое слово по целому, строке и целому числу, строке с тире и целому числу на основе ключевого слова

Я реализовал поиск, работа которого состоит в том, чтобы найти записи свойств из базы данных. Поиск несколько полностью зависит от набранного ключевого слова от пользователя.

Предположим,

Если пользователь вводит ключевое слово как 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);

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 Заявление, вы также можете создать регулярное выражение для адреса. Это было бы немного сложнее, хотя и, возможно, не применимо

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]