Как добавить динамическое предложение WHERE для фильтрации поиска?

0

У меня есть 7 параметров поиска, хотя в приведенном ниже коде показаны только два: Title и Type.

Мы хотели бы предоставить нашим пользователям возможность искать ЛЮБОЙ из 7 параметров.

Им также должна быть предоставлена возможность поиска по нескольким параметрам.

Как мне адаптировать приведенный ниже код для использования динамического предложения $ where?

Например, пользователь может выбрать, где type = 'some value'.

Пользователь также должен иметь возможность выбирать, где type = 'some value' и title= 'some value'.

Заранее спасибо.

function ms_escape_string($data) {
        if ( !isset($data) or empty($data) ) return '';
        if ( is_numeric($data) ) return $data;

        $non_displayables = array(
            '/%0[0-8bcef]/',            // url encoded 00-08, 11, 12, 14, 15
            '/%1[0-9a-f]/',             // url encoded 16-31
            '/[\x00-\x08]/',            // 00-08
            '/\x0b/',                   // 11
            '/\x0c/',                   // 12
            '/[\x0e-\x1f]/'             // 14-31
        );
        foreach ( $non_displayables as $regex )
            $data = preg_replace( $regex, '', $data );
        $data = str_replace("'", "''", $data );
        return $data;
    }

    $strprojectTitle = null;
    $strbidType = null;
    if(isset($_POST["projectTitle"]))
    {
        $strprojectTitle = $_POST["projectTitle"];
    }
    if(isset($_POST["BidType"]))
    {
        $strbidType = $_POST["BidType"];
    }

?>

<?php

   $sql = "Select b.ID,convert(char(10),b.BidDate,101) BidDate,convert(char(10),
          b.DueDate,101)DueDate,b.BidTitle,b.DueTime,b.BidID,BidIDFile,
          d.Department,b.BidType,CASE WHEN b.AwardDate ='01/01/1900' Then NULL ELSe convert(char(10),b.AwardDate,101)END AS AwardDate,
          convert(char(10),b.LastUpdate,101) LastUpdate,s.Status
          FROM bids b inner join dept d on b.Department=d.DeptID inner join Status s on b.BidStatus=s.StatusId WHERE b.BidTitle = ' . ms_escape_string($strprojectTitle) . ' OR b.BidType = ' . ms_escape_string($strbidType) . ' ";

///**** Последняя попытка

$fields = array(
    'projectTitle' => 'b.BidTitle',
    'BidType' => 'b.BidType'
);

$where = array();
foreach($fields as $fieldPost => $fieldDb) {
    if(isset($_POST[$fieldPost]) && strlen($_POST[$fieldPost]) > 0) {
        $where[] = "'$fieldDb' = '$_POST[$fieldPost]'";
    }
}

   $sql = "Select b.ID,convert(char(10),b.BidDate,101) BidDate,convert(char(10),
          b.DueDate,101)DueDate,b.BidTitle,b.DueTime,b.BidID,BidIDFile,
          d.Department,b.BidType,CASE WHEN b.AwardDate ='01/01/1900' Then NULL ELSe convert(char(10),b.AwardDate,101)END AS AwardDate,
          convert(char(10),b.LastUpdate,101) LastUpdate,s.Status
          FROM bids b inner join dept d on b.Department=d.DeptID inner join Status s on b.BidStatus=s.StatusId
          " . ( count($where) > 0 ? " WHERE " . implode(' AND ', $where) : "" );
  • 1
    построитель запросов или операторы if :)
  • 0
    Вы можете иметь хранимую процедуру с необязательными параметрами, посмотрите на этот ответ Stored procedure big where clause or multiple procedures
Теги:
sql-server

1 ответ

0
Лучший ответ

Удалите эту часть в своем коде:

$strprojectTitle = null;
$strbidType = null;
if(isset($_POST["projectTitle"]))
{
    $strprojectTitle = $_POST["projectTitle"];
}
if(isset($_POST["BidType"]))
{
    $strbidType = $_POST["BidType"];
}

И замените его на приведенный ниже, что позволяет динамически строить условия WHERE:

## easily add here the fields you have
$fields = array(
    'projectTitle' => 'b.BidTitle',
    'BidType' => 'b.BidType'
);

$where = array();
foreach($fields as $fieldPost => $fieldDb) {
    if(isset($_POST[$fieldPost]) && strlen($_POST[$fieldPost]) > 0) {
        $where[] = "'$fieldDb' = '" . ms_escape_string($_POST[$fieldPost]) . "'";
    }
}

## Use the $where array in your final SQL query
## important to test if count($where) > 0 in case no search has been made
$sql = "SELECT ..... " . ( count($where) > 0 ? " WHERE " . implode(' AND ', $where) : "" );

Более продвинутый пример для построения строки WHERE, поддерживая несколько типов поиска (например, компараторы поиска: LIKE%..% and =)

## support multiple search comparators
$fields = array(
    'projectTitle' => array('field' => 'b.BidTitle', 'searchType' => 'like'),
    'BidType' => array('field' => 'b.BidType', 'searchType' => 'equal')
);

$where = array();
foreach($fields as $fieldPost => $field) {
    if(isset($_POST[$fieldPost]) && strlen($_POST[$fieldPost]) > 0) {
        if($field['searchType'] == 'like') {
            $where[] = "'".$field['field']."' LIKE '%" . ms_escape_string($_POST[$fieldPost]) . "%'";
        } else {
            $where[] = "'".$field['field']."' = '" . ms_escape_string($_POST[$fieldPost]) . "'";
        }
    }
}
  • 0
    Я бы, вероятно, использовал AND при взрыва
  • 0
    :) правда, это имеет больше смысла, я обновил пример выше
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню