Skládaní častí dotazu do proměnné
- tomfz6
- Člen | 32
Čau všem,
v jednom extrémním případě používám věc, že skládám části dotazu do proměných a z toho pak složím finální dotaz.
Toto je opravdu zjednodušený příklad mého problému (reálně je v tom dotazu asi 5× joinu, v DB nejsou cizí klíče atd…)
<?php
$sql = "SELECT * FROM tabulka WHERE
if (!empty($promnena) {
$sql.=" Sloupec='" . $promnena . "'";
}
if (!empty($promnena1) {
$sql.=" AND Sloupec1='" . $promnena1 . "'";
}
$query = $this->db->query($sql)->fetchAll();
?>
Tento příklad by šel jednoduše přepsat do Nette Database ale o to nejde, jde mi o to elegantně zapsat nebo ošetřit tu proměnou v podmínce IF.
Našel jsem něco o SqlLiteral a SqlFragment ale moc nevím co stím, jestli je to na vůbec vhodné.
Dík moc za rady.
- h4kuna
- Backer | 740
Metoda query má dva parametry, první je kam vložíš sql dotaz a kam chceš dát proměnné dej otazníky a druhý parametr je seznam proměnných co chceš nahradit.
<?php
$sql = "SELECT * FROM tabulka WHERE";
$params = [];
if (!empty($promnena)) {
$sql .= " Sloupec = ?";
$params[] = $promnena;
}
if (!empty($promnena1)) {
$sql .= " AND Sloupec1 = ?";
$params[] = $promnena1;
}
$query = $this->db->query($sql, ...$params)->fetchAll(); // php 5.6+, jinak použij metodu queryArgs
?>
Editoval h4kuna (9. 2. 2017 6:17)
- tomfz6
- Člen | 32
Tak na první pohled se zdálo že to frčí ale když jsou splněny obě podmínky tak „There are more placeholders than passed parameters“ takto to vypadá vygenerovaný…
<?php
SELECT * FROM tabulka WHERE Sloupec = ? AND Sloupec1 = ?
?>
dump $params
<?php
array (2)
0 => 1
1 => 2
?>
Moc nechápu proč by to mělo dělat. Mohl bych ještě poprosit o radu?
Dík moc
- tomfz6
- Člen | 32
A ješte jsem narazil na jednu věc a to je problém s „limitem“ a „order by“ a to ten, že ted mě to tam přidá samo apostrofy a pak to padne na chybě mysql.
<?php
.....ORDER BY ? ? LIMIT ?,?
$params[] = $columns[$requestData['order'][0]['column']];
$params[] = $requestData['order'][0]['dir'];
$params[] = $requestData['start'];
$params[] = $requestData['length'];
....ORDER BY 'sloupec' 'desc' LIMIT '0','15'
?>
šlo by stímto něco udělat?
Dík moc
- David Matějka
- Moderator | 6445
koukam, ze je tam dokonce specialni modifikator pro „order“ , viz testy