2015-09-06 2 views
1

У меня есть приложение, которое отображает список файлов из таблицы базы данных. Я хотел бы, чтобы пользователь мог создавать группу, выбирая опции, которые будут фильтровать список файлов и отображать только те, которые соответствуют. Параметры группы добавляются в другую таблицу для последующего использования.Создать динамический подготовленный MYSQLi оператор в PHP

Вот варианты: nameyeartyperoomdaytime

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

Вот мой код, чтобы добавить эту информацию:

if ($addGrp = $m->prepare("SELECT * FROM pro_files WHERE userid=?, name=? ...")) { 
    $addGrp->bind_param('is ...',$userid, $name ...; 
} 

Для справки, чтобы выбрать эти dymanic столбцы Я буду использовать:

WHERE room in (g23,f43,g43) AND type in ('pptx,ppt,ai,pdf') 

и переменные используются для связывания их являются запятая разделенные значения как таковые (сгенерированные на основе того, что пользователь выбирает, переменная не будет существовать, если пользователь ничего не выбрал):

$room = 'g23,f43,g43'; 
$type = 'pptx,ppt,ai,pdf'; 

Используя старый метод MYSQL, я мог бы просто создать строку запроса без проблем. Как создать динамический запрос, когда у меня также есть линия bind_param?

Для демонстрации я добавил ..., где мне нужно динамически генерировать запрос.

Я не могу использовать PDO из-за того, что в остальной части приложения в настоящее время используется MYSQLi, работа будет слишком большой.

В качестве альтернативы можно ли использовать подстановочный знак в разделе IN? В этом случае я мог бы сделать '' = '*' в PHP. Однако room in ('*') не работает.

+0

Вы должны рассмотреть структуру или [ORM] (https://en.wikipedia.org/wiki/Object-relational_mapping), которая уже охватывает такой прецедент. – Gumbo

ответ

1

Ну, с ванильными mysqli подготовленными заявлениями, это был бы довольно сложный вызов.
Но с некоторыми DBAL или ORM это может быть упрощено. Скажем, используя DBAL I wrote, это можно сделать довольно аккуратным способом:

Сначала определите свои переменные на основе ввода пользователем.

$name = 'Bill'; 
$year = NULL; 
$room = ['g23','f43','g43']; 
$type = NULL; 
$day = 4; 
$time = NULL; 

Затем написать запрос, где каждая переменная используется дважды

$sql = "SELECT * pro_files WHERE name=?s 
(AND ?s is NULL OR year = ?s) 
(AND ?a is NULL OR type = ?a) 
(AND ?a is NULL OR room = ?a) 
(AND ?s is NULL OR day = ?s) 
(AND ?s is NULL OR time = ?s)"; 

И, наконец, выполнить запрос:

$data = $db->getAll($sql,$name,$year,$year,$room,$room,$type,$type,$day,$day,$time,$time); 

Это будет возвращать результат поиска на основе значений непустые, предусмотренных ,

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

Кстати, я хотел бы видеть подход от других DBAL или ORM. Порекомендовать одно - это одно, а показать рабочий пример - другое.

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