Упрощение запроса фильтра MySQL - PullRequest
0 голосов
/ 10 октября 2011

Я создаю платформу для менеджера по кастингу, чтобы каталогизировать Актеров и иметь возможность просматривать их.Моя таблица «актер» настроена на имя, фамилию, адрес электронной почты, телефон, адрес и т. Д.

У меня есть страница browse.php, в которой есть форма для фильтрации результатов.Вот мой класс, который мне нужен как для упрощения, так и для избавления от результата подстановки, когда поле равно нулю.

Я передаю данные формы в массив, $ search, и класс проверяет, массивраздел заполняется и записывается в SQL-запрос.

public function getActors($search) {
    if(isset($search)) {
        if($search["first_name"] == NULL) { $first_name = "LIKE '%'"; } else { $first_name = "LIKE '".$search["first_name"]."'"; }
        if($search["last_name"] == NULL) { $last_name = "LIKE '%'"; } else { $last_name = "LIKE '".$search["last_name"]."'"; }
        if($search["gender"] == NULL) { $gender = "LIKE '%'"; } else { $gender = " = '".$search["gender"]."'"; }
        if($search["address_state"] == NULL) { $address_state = "LIKE '%'"; } else { $address_state = " = '".$search["address_state"]."'"; }
        if($search["ethnicity"] == NULL) { $ethnicity = "LIKE '%'"; } else { $ethnicity = " = '".$search["ethnicity"]."'"; }
        if($search["status"] == NULL) { $status = "LIKE '%'"; } else { $status = " = '".$search["status"]."'"; }

        $sql = "SELECT * FROM actor WHERE
            first_name ".$first_name." AND
            last_name ".$last_name." AND
            gender ".$gender." AND
            address_state ".$address_state." AND
            ethnicity ".$ethnicity." AND
            status ".$status."
        ";          
    } else {
        $sql = "SELECT * FROM actor";   
    }
    $s = mysql_query($sql) or die (mysql_error());
    $numrows = mysql_num_rows($s);

    for($x=0; $x < $numrows; $x++){
        $actorArray[$x] = mysql_fetch_row($s);
    }
    return $actorArray;
}   

Любая помощь по упрощению этого или предложения?

Ответы [ 3 ]

1 голос
/ 10 октября 2011

для условий, я могу использовать цикл foreach.

 if(isset($search)) {
        $conditions = array();
        foreach($search as $k => $criteria){
            if ($criteria != NULL){
                $condition[] = "{$k} LIKE '{$criteria}'";
                //this will produce for $search['first_name'] = 'john'
                //  "first_name LIKE 'john'"
            }
        }
        //we transform the array of conditions into a string
        $conditions = implode (' AND ', $conditions);
        $sql = "SELECT * FROM actor WHERE " . $conditions;

 }else{
        $sql = "SELECT * FROM actor";   
 }
0 голосов
/ 10 октября 2011

Как насчет (в блоке isset) ...

$fields = array('first_name','last_name','gender','address_state','ethnicity','status');
$parts = array();
foreach($fields as $field) {
  if(!empty($search[$field])) {
    $parts[] = $field . ' LIKE "' . $search[$field] . '"';
  }
}
$sql = "SELECT * FROM actor WHERE " . implode(' AND ', $parts);

И, как упомянул @Dvir, лучше использовать позиционные параметры в ваших операторах SQL.

0 голосов
/ 10 октября 2011

LIKE '%'?шутки в сторону?почему бы просто не включить конкретное предложение, если оно пустое?

Кроме того, ваш запрос уязвим для SQL-инъекций .

После прочтения о SQL-инъекциях вы можетепросто добавьте предложения WHERE, пройдя по массиву $ search, добавив конкретное предложение и связав параметр.

...