Как искать несколько значений в SQLite? - PullRequest
1 голос
/ 02 декабря 2011

Я создаю очень простой файл PHP, который ищет таблицу в моей базе данных SQLite. Я хочу, чтобы он фильтровал мою таблицу по 2 параметрам, min и max, но я хочу иметь возможность указать один параметр, оба или даже ни одного. Как мне перевести это в запрос SQL?

<?php
$db = new PDO('sqlite:database.db');

$min = $_GET['min'];
$max = $_GET['max'];

if($min == '') $min = -1;
if($max == '') $max = -1;

$res = $db->prepare('SELECT * FROM Roteiro WHERE ...');
$res->execute(array(...));

$test = $res->fetchAll();
print_r($test);
?>

Ответы [ 3 ]

1 голос
/ 02 декабря 2011

Вам необходимо построить оператор динамически:

$db = new PDO('sqlite:database.db');

$min = isset($_GET['min']) && !empty($_GET['min']) ? (integer) $_GET['min'] : null;
$max = isset($_GET['max']) && !empty($_GET['max']) ? (integer) $_GET['max'] : null;
$base = 'SELECT * FROM Roteiro';
$params = array();

if(null != $min && null != $max) {
   // im using BETWEEN here just for simplicity int he example, 
   // but you could (should?) use separate statements with 
   // typical <,> comparison ops.
   $base .= ' WHERE the_column BETWEEN :min AND :max';
   $params[':min'] = $min;
   $params[':max'] = $max;
} elseif(null !== $max) {
   $base .= ' WHERE the_column < :max';
   $params[':max'] = $max;
} elseif(null != $min) {
  $base .= ' WHERE the_column > :min';
  $params[':min'] = $min;
}

$db->prepare($base);
$db->execute($params);
1 голос
/ 03 декабря 2011
where (? > a               or ? is null)
  and (? = foo             or ? is null)

  -- etc...

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

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

эквивалентный способ сказать это

where (? is not null             and ? > a)
  and (? is not null             and ? = foo)

, но я предпочитаю первый способ.

0 голосов
/ 02 декабря 2011

Вы захотите динамически создать запрос из имеющейся у вас информации.

Итак, допустим, вы хотите отфильтровать некоторую таблицу по необязательному минимальному и необязательному максимальному значению.

SELECT some_row
FROM some_table
WHERE filter_row < [max]
AND filter_row > [min]

Простой способ сделать это - просто сохранить часть вашего SQL-запроса, которая фильтруется по максимуму и минимуму, и добавить ее к запросу, когда это необходимо / определено:

$sql = "SELECT some_row
 FROM some_table ";
if (isset($max) && isset($min)){
  $sql .= "WHERE filter_row < ?
   AND filter_row > ?";
} else if (isset($max) ){
  $sql .= "WHERE filter_row < ?";
} else if (isset($min) ){
  $sql .= "WHERE filter_row > ?";
}

if ($stmt = $mysqli->prepare($sql)) {
  // bind parameters according to the given/available
  // parameters and execute
}

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

Это просто очень простое решение, которое получит очень большой и уродливый срастущий список дополнительных параметров.Так что, если вам это нужно чаще и с большим количеством параметров, попробуйте использовать « Query Builder ».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...