Skládaní častí dotazu do proměnné

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
tomfz6
Člen | 32
+
0
-

Č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
+
+1
-

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
+
0
-

Jj dík moc šel jsem na to zbytečně složitě,takto frčí dobře a bez problémů.

h4kuna
Backer | 740
+
+1
-

Mimochodem je tam chyba, když se první podmínka vyhodnotí jako FALSE! Tak ti vznikne WHERE AND. Proto je lepší používat abstrakce, které tyto případy řeší. Nebo se to řeší WHERE 1 = 1 a pak po každý připojuješ pomocí AND.

Editoval h4kuna (7. 2. 2017 6:38)

tomfz6
Člen | 32
+
0
-

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

CZechBoY
Člen | 3608
+
0
-

@tomfz6 Použij metodu queryArgs, ta totiž přijímá pole jako druhý parametr. Metoda query přijímá 1 parametr sql příkazu jako 1 parametr volání funkce.

Editoval CZechBoY (8. 2. 2017 11:52)

tomfz6
Člen | 32
+
0
-

Jj dík moc to je ted už to frčí jak má…

h4kuna
Backer | 740
+
0
-

Nebo to musíš zapsat pro php 5.6+

<?php
$query = $this->db->query($sql, ...$params)->fetchAll();
?>
tomfz6
Člen | 32
+
0
-

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

n.u.r.v.
Člen | 485
+
0
-

zkusi ty parametry pro limit ošetřit pomocí (int) případně intval… myslím že tím jsem to u sebe vyřešil

David Matějka
Moderator | 6445
+
0
-

a pro orderBy by melo fungovat neco jako ORDER BY ?name, ?name

tomfz6
Člen | 32
+
0
-

Chapi dík moc trochu se to posunulo :-)

@n.u.r.v. ano toto frčí.dík moc

@DavidMatějka z části pomohlo vygeneruje

<?php
ORDER BY `sloupec` `desc`
?>

což ten sloupec je dobře ale to to řazeni

<?php
`desc`
?>

by mělo být bez těch zpětných uvozovek

David Matějka
Moderator | 6445
+
0
-

koukam, ze je tam dokonce specialni modifikator pro „order“ , viz testy

tomfz6
Člen | 32
+
0
-

@DavidMatějka to je ono frčí krásně.

Takže vše vyřešeno.

Dík moc všem.