如何根据关键字过滤整数,字符串和整数,带破折号的字符串和整数的关键字

How to filter keyword for integer, string and integer, string with dashes and integer based on keyword

我已经实现了搜索,其工作是从数据库中找出 属性 记录。搜索在某种程度上完全取决于用户输入的关键字。

假设,

如果用户键入 12344775773 之类的关键字,它应该从数据库的 zip 列中搜索记录。

接下来,如果用户键入 6 S Surfway70 N Grove St1661-114 Old Country Rd 之类的关键字,它应该仅从数据库中搜索 address 列中的记录。

接下来,如果用户键入 CalvertonFreeportRiverhead 等关键字,它应该仅从数据库中搜索 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

这些示例假定邮政编码始终是数字并且不包含任何其他字符。假定城市始终是字母字符 and/or 空格,任何其他字符都会导致匹配失败。

使用小提琴更新您可能允许的其他字符,以便更适合您的需求进行测试

除了 open else 语句之外,您还可以为地址创建一个正则表达式。不过这会有点棘手,而且可能不适用