как выполнить поиск по диапазону дат в расширенном сераче

#php #mysql #codeigniter

#php #mysql #codeigniter

Вопрос:

я использую эту функцию для построения расширенного поиска по многим критериям, но при поиске по времени я сталкиваюсь с одной проблемой, как использовать условие between — or (или) только с датой

// опубликовать входные данные

 $pi_num = $this->input->post('pi_num');
$pi_name = $this->input->post('pi_name');
$pi_passport = $this->input->post('pi_passport');
$pi_date_reg = $this->input->post('pi_date_reg');
$pi_date_reg2 = $this->input->post('pi_date_reg2');
$pi_branch_id = $this->input->post('pi_branch_id');
$pi_gender = $this->input->post('pi_gender');
$pi_importance = $this->input->post('pi_importance');
  

// поместить его в массив
$conditions = array();

 if ($pi_num !== '') {
    $conditions[] = 'pi_num LIKE "' . $pi_num . '"';
}
if ($pi_name !== '') {
    $conditions[] = 'pi_name LIKE "%' . $pi_name . '%"';
}
if ($pi_passport !== '') {
    $conditions[] = 'pi_passport = "' . $pi_passport . '"';
}
if ($pi_date_reg !== '') {
    $conditions[] = 'pi_date_reg = "' . strtotime($pi_date_reg) . '"';
}
if ($pi_date_reg2 !== '') {
    $conditions[] = 'pi_date_reg = "' . strtotime($pi_date_reg2) . '"';
}
if ($pi_gender !== '') {
    $conditions[] = 'pi_gender = "'.$pi_gender.'"';
}
if ($pi_importance !== '') {
    $conditions[] = 'pi_importance = "' . $pi_importance . '"';
}
if ($pi_branch_id !== '') {
    $conditions[] = 'pi_branch_id = "' . $pi_branch_id . '"';
}
  

затем соберите все это с помощью функции implode .. но я хочу использовать другое условие запроса для даты .. как это сделать?

 $sqlStatement = 'SELECT
            d_branch.*,
            d_patient.*
          FROM  d_patient
            LEFT JOIN d_branch
              ON d_branch.branch_id = d_patient.pi_branch_id WHERE ' . implode(' AND ', $conditions)
;
$result = $this->db->query($sqlStatement);

return $result->result_array();
  

}

это пример запроса

 SELECT d_branch.*, d_patient.* FROM d_patient LEFT JOIN d_branch ON d_branch.branch_id = d_patient.pi_branch_id WHERE pi_num LIKE "555555" AND pi_passport = "333333" AND pi_date_reg = "1404684000" AND pi_date_reg = "1405029600" AND pi_gender = "1" AND pi_importance = "1" AND pi_branch_id = "1443"
  

Комментарии:

1. Со столбцами дат вы могли бы использовать mysql между . Никаких дополнительных скобок не требуется.

2. вы не поняли мой вопрос .. как отредактировать php-код, чтобы использовать between только с датой

3. Просто для ясности, вы хотите, чтобы pi_date_reg столбец был между $pi_date_reg и $pi_date_reg2 ? И скажите мне, что это за формат столбца pi_date_reg .

4. эти два поля — всего лишь одно поле .. я хочу выполнить поиск по датам регистрации всех пользователей с указанной даты на другую дату, например, с 7/7/2014 по 7/10/2014

Ответ №1:

 if ($pi_date_reg !== '') {
  if ($pi_date_reg2 !== '') {
    $conditions[] = '(pi_date_reg BETWEEN "'. $pi_date_reg .'" AND "'. $pi_date_reg2 .'")'; 
  }
  else {
    $conditions[] = 'pi_date_reg >= "'. $pi_date_reg .'"';
  }
}
  

Таким образом, вторая дата необязательна, но вы можете выполнить поиск по всем строкам с помощью pi_date_reg >= $pi_date_reg .
Убедитесь, что формат вводимой даты — гггг-мм-дд

Просто я хочу улучшить безопасность вашего кода, используя заполнители:

 $conditions = $values = array();
if ($pi_num !== '') {
    $conditions[] = 'pi_num LIKE "%d"';
    $values[] = $pi_num;
}
if ($pi_name !== '') {
    $conditions[] = 'pi_name LIKE "%%s%"';
    $values[] = $pi_name;
}
//...
  

и так далее

Затем:

 $result = $this->db->query($sqlStatement, $values);
  

Ответ №2:

вы можете сделать что-то вроде этого

 if ($pi_date_reg !== '' AND $pi_date_reg2 !== '') {
    $conditions[] = "(pi_date_reg  BETWEEN '" . strtotime($pi_date_reg) . "' AND '" . strtotime($pi_date_reg2)."')";
}
  

Комментарии:

1. Это именно тот ответ, который я хотел дать ему только что. Однако эти скобки не обязательны 😀

2. @machineaddict да, не требуется, но требуется для активной записи.

3. Нет, это не обязательно. Я разрабатываю в CodeIgniter и никогда не сталкивался с проблемой, о которой вы говорите.

4. @machineaddict это случай, когда у вас есть 2 столбца даты в базе данных для сравнения, и вы хотите выбрать строки ** condition1 И condition2 И (uploaded_on между $ d1 и $ d2 ИЛИ updated_on между $ d1 и $ d2 )** для такого запроса в активных записях требуются квадратные скобки. Потому что без этих скобок это было бы ** condition1 И condition2 И uploaded_on между $ d1 и $ d2 ИЛИ updated_on между $ d1 и $ d2 **, что дает ложный результат.

5. Теперь я понимаю, что вы имели в виду. Однако он не требует OR в своем запросе.