Dynamický dotaz do databáze – jak na parametry? – There are more placeholders than passed parameters

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

Ahoj, mám takový dotaz do db:

$q = $this->database->query("SELECT * FROM items WHERE CATEGORY LIKE ?", $cats[0]);

To je v pořádku, ale dotaz musí počítat s tím, že kategorií budu hledat víc, třeba dvě:

$q = $this->database->query("SELECT * FROM items WHERE CATEGORY LIKE ? AND CATEGORY LIKE ?", $cats[0], $cats[1]);

Ale dynamicky. Napadlo mě teda podle count($cats) poskládat dotaz tak, aby odpovídal, tzn. příklad:

$cats = array("prvni", "druha", "treti");
$select = "CATEGORY LIKE ? AND CATEGORY LIKE ? AND CATEGORY LIKE ?";
$q = $this->database->query("SELECT * FROM items WHERE $select", $cats);

což mi v případě, kdy je v $cats více než jedna položka, vrátí: There are more placeholders than passed parameters. Jak bych měl dotaz poskládat, aby to prošlo a nemusel jsem dávat do $select rovnou (ne)ošetřená data? Díky za pomoc

Editoval nettolog (23. 9. 2015 22:59)

David Matějka
Moderator | 6445
+
+4
-

pouzij queryArgs, ktere akceptuje jako druhy argument pole parametru pro dotaz

nettolog
Člen | 68
+
0
-

Dík moc, to jsem hledal. Čistý dotaz bez dalších parametrů jde v pohodě jak potřebuju, ale tenhle neprojde se stejnou chybou:

$this->database->queryArgs("SELECT * FROM items WHERE $select LIMIT ? OFFSET ?", $cats, $params['show'],(($params['page'] - 1) * $params['show']));

Můžu se zeptat, jak přesně to funguje? Našel jsem jen popis vstupních parametrů v API. :(

EDIT: aha, už mi to došlo, všechny parametry jen do jednoho pole, chápu, DÍK!

Editoval nettolog (23. 9. 2015 23:17)

Unlink
Člen | 298
+
0
-

V php 5.6 by malo fungovať aj

$cats = array("prvni", "druha", "treti");
$select = "CATEGORY LIKE ? AND CATEGORY LIKE ? AND CATEGORY LIKE ?";
$q = $this->database->query("SELECT * FROM items WHERE $select", ...$cats);