Я расширяю сайт cakePHP 1.3.13, и мой пользователь должен иметь возможность практически создавать свои собственные SELECT
запросы для некоторых данных через веб-приложение.Раньше они буквально запрашивали базу данных MS Access, но теперь им придется использовать элементы управления формой для поиска по сайту, но они привыкли и требуют определенной гибкости.
Они ищут билеты, и есть пара SELECT
полей, которые они не всегда должны видеть, и пара WHERE
условий, по которым они не всегда должны фильтроваться, и яЯ пытаюсь выяснить, как разрешить функциональность без добавления целых систем безопасности динамического SQL.
Вот мой метод поиска:
$tickets = $this->Hauler->find('all', array(
'conditions'=>array("ticketDate between'$startDate' and '$endDate'", "LocationID='$plant_id'", 'paid=0'),
'fields'=>array('LocationID','OrderID','TicketDate','TicketNo','FreightPay','Qty','Total', 'Paid'),
'order'=>array('TicketDate', 'LocationID','OrderID'),
));
Единственный способ, которым я могу подумать, включить динамические полябудет использовать операторы if
для выбора одного из предопределенного набора всех возможных комбинаций полей (не масштабируемых, раздражающих) или для создания массива $fields
для добавления к клавише [fields]
.
Условия имеют схожие проблемы, и мне уже неудобно, включая конкатенацию строк, например between '$startDate'
, но я не знаю лучшего способа там.CakePHP утверждает, что они дезинфицируют меня , если я использую метод find()
, но я не уверен, насколько хорошо.
Существует ли какой-либо конкретный метод, разрешающий эти "динамические" поискибез рискованного на самом деле динамического SQL? Я хотел бы продолжать использовать метод find () в CakePHP, я знаю, что хранимые процедуры позволяют мне это делать, но это тот случай, когда я хочулогика в коде.Кроме того, я должен предпринять дополнительные шаги очистки вне того, что метод Cake find()
делает в любом случае?
У меня есть только два очень доверенных пользователя, таким образом, безопасность не является самой большой проблемой в этом точном поиск, но я действительно хотел бы знать, как правильно выполнить поиск такого рода.
Обновление: я обновил свой код и решил проблему fields
согласно предложению @Anh Pham, но я все еще продолжаюне могу получить опционально conditions
работу еще.Вот мой новый код:
$tickets = $this->Hauler->find('all', array(
'conditions'=>array('Hauler.ticketDate BETWEEN ? AND ?' => array($startDate,$endDate), 'Hauler.LocationID'=>$plant_id, 'Hauler.paid'=>0),
'order'=>array('TicketDate', 'LocationID','OrderID'),
));
Это генерирует запросы наподобие WHERE LocationID=''
, если LocationID не передается через форму, вместо проверки на пустую строку. Я бы хотел, чтобы мой запрос пропускал часть LocationID=
WHERE
, если LocationID не указан.