Я хотел бы создать запрос в MySQL, который имеет необязательное значение. Когда значение указано, запрос фильтруется этим значением, когда возвращается не все строки. Вот идея:
public function doQuery($item = 'ANY_VALUE') { $query = "SELECT * FROM table WHERE item = ?"; db->fetchAll($query,array($item)) ... } doQuery(); // Returns everything doQuery($item='item1'); // Returns only rows where item = 'item1'
Есть ли простой способ сделать это, не создавая две строки запроса в зависимости от значения $ item?
Насколько мне известно, такого «какого-либо» заполнителя нет.
Если вы можете использовать LIKE, вы можете сделать
SELECT * FROM table WHERE item LIKE '%'
если вы можете добавить условие, вы можете аннулировать предложение item
следующим образом:
SELECT * FROM table WHERE item = ? OR 1=1
(не будет работать в вашем примере, потому что вы передаете «элемент» в качестве параметра)
Вот и все варианты, которые я вижу – это, наверное, проще всего работать с двумя запросами, полностью исключая WHERE
во втором.
Это, вероятно, сработает, но я не уверен, хорошая ли это идея с точки зрения базы данных.
public function doQuery($item = 'ANY_VALUE') { $query = "SELECT * FROM table WHERE item = ? OR 1 = ?"; db->fetchAll($query,array($item, ($item == 'ANY_VALUE' ? 1 : 0)) ... }
Лучший способ сделать это – сначала сгенерировать sql-запрос из параметра, который вам нужно беспокоить, а затем выполнить.
function doQuery($params) { $query = 'SELECT * FROM mytable '; if (is_array($params) // or whatever your condition ) { $query .= 'WHERE item = ' . $params[0]; } $query .= ' ;'; // execute generated query execute($query); }
Нет никаких оснований для этого с одним запросом. Запуск запроса без предложения WHERE делает его явным, что вы хотите вернуть все строки. Запуск его с предложением WHERE делает его явным, что вы хотите фильтровать строки.