2013-12-25 2 views
0

У меня есть фильтр ajax на странице поиска, который фильтрует результаты обучения на основе набора критериев, которыми может управлять пользователь. Я пытаюсь решить, следует лиНаписание фильтра поиска - фильтр на уровне SQL или уровне PHP?

1) первый пойти получить все данные учителей, то в PHP сделать новый массив только тех учителей, которые не влияют негативные фильтры

или

2) построить запрос SQL с числом WHERE положений, то есть «WHERE платить = $ платить & & город = $ города & & расстояние < $ расстояние».

Часть меня думает, что число 2 может быть лучше вариант, но я уже не знаю, как заполнить значения переменных запроса, когда пользователь не указал определенный фильтр. Так, например, если $ pay undefined, запрос не будет выполнен. в этом случае я хотел бы сделать запрос учителей независимо от их оплаты.

+0

Руки вниз, SQL в любом выделенном db будет делать лучшую работу даже по умеренным наборам, особенно если у вас есть хороший набор индексов. –

ответ

0

Для подхода SQL, вы должны построить свой запрос в зависимости от того или нет входы пустые

Что-то вроде

$sql = 'SELECT * FROM Teachers'; 
$filter = array(); 
if (!empty($pay)) $filter[] = 'pay = "'.$pay.'"'; 
if (!empty($city)) $filter[] = 'city = "'.$city.'"'; 
if (!empty($city)) $filter[] = 'distance < "'.$distance.'"'; 

if (!empty($filter)) { 
    $and = ' WHERE'; 
    foreach ($filter as $f) { 
     $sql .= $and.' '.$f; 
     $and = ' AND'; 
    } 
} 

ум, вы должны быть обеспокоены инъекции SQL, так как это просто простая демонстрация.

0

Если у вас нет большого количества учителей в базе данных, вы можете получить их все и обработать на PHP, как вы предложили.

Если вы не хотите получать много данных, вы можете пойти со вторым вариантом. В этом случае вам может понадобиться создать динамический запрос.

, например:

$payCond = ""; 

... 

if (isset($pay) && $pay != ""){ 
    if ($payCond != ""){ 
     $payCond .= "And "; 
    } 
    $payCond = "pay=" . intval($pay); 
} 
0

запрос как можно ближе к базе данных, как это возможно. Тем не менее, вы можете использовать незаполненные выражения для упрощения кода:

$payExpr = (isset($_REQUEST['pay']) ? 'pay='.$_REQUEST['pay'] : '1=1'); 
$query = "select * from Foo where $payExpr"; 

Секрет соус здесь используется «1 = 1», когда плата не дано. Тем не менее, вам еще нужно сделать то, что я пропущу в этом кратком примере, например, избегая инъекции sql со связанными параметрами. Caveat emptor: Я не скомпилировал этот код, так как я клевал на планшете!

Смежные вопросы