如何过滤关键字为整数,字符串和整数,字符串用短划线和整数基于关键字

时间:2015-03-18 10:16:42

标签: php validation mysqli filtering keyword-search

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

假设,

如果用户输入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);

1 个答案:

答案 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语句。这会有点棘手但也许不适用