Как собрать запрос в PDO с элементов перед объединенные
, сомнения, заключается в следующем, в mysql мы можем объединять запрос, а затем выполнить поиск следующим образом:
$cidades = '&& (cidade = 100 || cidade = 101 || cidade = 102)';
$order = 'id ASC';
$sql = 'SELECT * FROM tabela WHERE status = 1 '.$cidades.' ORDER BY '.$order;
переменная $cidade
может быть пустым или иметь n элементов для поиска, я не могу сделать так, я не знаю, также, если это будет таким образом:
$sql = $this->_db->prepare('SELECT * FROM tabela WHERE status = 1 :cidades ORDER BY :order');
$sql->execute(array(':cidades' => $cidades, ':order' => $order));
2 answers
, Чтобы выполнить этот динамический запрос будет, нужны некоторые корректировки, во-первых, это превратить $cidades
в массив и играть в clasula IN()
, обмениваться execute()
, bindValue()
сделать order by работает, bind не может быть сделано с именем столбца, только оглавление.
$in = "";
$posicao = 2;
if(!empty($cidades)){
$cidades = array(100, 101, 102);
$totalInterrogacoes = count($cidades);
$interrogacoes = str_repeat('?,', $totalInterrogacoes);
$interrogacoes = substr($interrogacoes, 0, -1);
$in = " AND cidades IN($interrogacoes) ";
}
$sql = "SELECT * FROM tabela WHERE status = ? "
$stmt = $this->_db->prepare($sql);
$stmt->bindValue(1, 1);
if($in){
$stmt->bindValue($posicao, implode($cidades));
$sql .= $in ." ORDER BY ?";
$posicao++;
}
$stmt->bindValue($posicao, 1, PDO::PARAM_INT);
$stmt->execute();
То, что вы можете сделать, это поместить все идентификаторы города в массиве, если у вас есть код, сделайте взрываться, иначе пусть переменная пустой.
Например:
Имеем коды городов: 26,50 и 20.
$cidades =($arrayCidade != '' && count($arrayCidade) > 0) ? "AND (id='". implode("' OR id='", $arrayCidade) . "')" : '';
Использовать Только в PDO переменную $городов. Убедитесь, что получаете только цифры, вложенных в массив, чтобы не иметь SqlInjection.