PHP фильтр по трем полям БД, я сильно намудрил?

Приходит массив
$arr[
    ['filter-contacts']=>'true', 
    ['clientName']=>'Вася',
    ['clientPhone']=>'36-76', 
    ['clientEmail']=,
]

значения clientName, clientPhone, clientEmail могут быть пустыми в любых комбинациях, filter-contacts - просто кнопка, на нее внимания можно не обращать Нужно составить SQL запрос адекватно подставив AND, ну основная проблема в нем.
Все работает, просто код какой-то громоздкий, кто имеет опыт - гляньте, года 3 назад решал похожую задачу, вроде не столько колхоза было)
$sql = 'SELECT * FROM `contacts`';
        if (isset($arr['filter-contacts']) && ($arr['clientName'] || $arr['clientPhone'] || $arr['clientEmail'])) {
            $resultArr = [];
            $sql .= ' WHERE';
            if ($arr['clientName'] != '') {
                $sql .= ' `name` LIKE ?';
                $resultArr[] = '%' . $arr['clientName'] . '%';
            }
            if ($arr['clientPhone'] != '' && $arr['clientName'] != '') {
                $sql .= ' AND `phone` LIKE ?';
                $resultArr[] = '%' . $arr['clientPhone'] . '%';
            } elseif ($arr['clientPhone'] != '' && $arr['clientName'] == '') {
                $sql .= ' `phone` LIKE ?';
                $resultArr[] = '%' . $arr['clientPhone'] . '%';
            }
            if ($arr['clientEmail'] != '' && ($arr['clientName'] != '' || $arr['clientPhone'] != '')) {
                $sql .= ' AND `email` LIKE ?';
                $resultArr[] = '%' . $arr['clientEmail'] . '%';
            } elseif ($arr['clientEmail'] != '' && ($arr['clientName'] =='' || $arr['clientPhone'] == '')) {
                $sql .= ' `email` LIKE ?';
                $resultArr[] = '%' . $arr['clientEmail'] . '%';
            }
        }


Спасибо за адекватные ответы)
  • Вопрос задан
  • 104 просмотра
Пригласить эксперта
Ответы на вопрос 2
Adamos
@Adamos
$fields = [
  'clientName' => 'name',
  'clientPhone' => 'phone',
  'clientEmail' => 'email'
];
$where = [];
$resultArr = [];
foreach($fields as $key => $field) {
  if($arr[$key]) {
    $where[] = "`$field` LIKE ?";
    $resultArr[] = '%' . $arr['clientName'] . '%';
  }
}
if(count($where) > 0) {
  $sql .= ' WHERE ' . implode(' AND ', $where);
}
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Данная задача делается через один единственный mysql запрос без всякой конкатенации и ветвления на php.
Почитайте документацию по mysql как делать запрос на основе промежуточных выборок (результат-таблицы) и составного условия внутри where.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы