Portál AbcLinuxu, 12. května 2025 07:40
$ids = '2,6,12,15,13,14,7,8,9,10,'; $stmt = $pdo->prepare('SELECT * FROM table WHERE col IN (?) ORDER BY ID ASC;'); $stmt->execute(array($ids));
$ids = array(2,6,12,15,13,14,7,8,9,10); $stmt = $pdo->prepare('SELECT * FROM table WHERE col IN (?) ORDER BY ID ASC;'); $stmt->execute($ids);tohle funguje ale je mi to k ničemu
$stmt = $pdo->prepare('SELECT * FROM table WHERE col IN (2,6,12,15,13,14,7,8,9,10) ORDER BY ID ASC;'); $stmt->execute();
"SELECT name, age FROM people WHERE name IN (?)" # wronga předpokládám, že v PHP to bude podobné. Tedy pokud je to náhodný počet libovolných čísel, tak pravděpodobně budete muset spouštět
prepare
pro každé $ids
zvlášť.
$query=$pdo->prepare(
'SELECT * FROM table WHERE col IN ('
.implode(',', array_map(array($pdo, 'quote'), $ids)) .
') ORDER BY ID ASC;'
);
$ids
. Určitě ji takto neplní. Možná je to uživatelský vstup, možná výsledek dotazu v databázi. Každý případ se řeší jinak.
$ids = array(2, 6, 12, 15, 13, 14, 7, 8, 9, 10); $sql = "SELECT * FROM table WHERE col IN (" . implode(", ", array_fill(0, count($ids), "?")) . ") ORDER BY ID ASC;"; $stmt = $pdo->prepare($sql); $stmt->execute($ids);
Zjednodušeně: nemůže protože to v zásadě neexistuje, MySQL server má dotaz s otazníky + sadu hodnot a vnitřně si to tam dosadí ... juk.
Nicméně to bala trochu „lež dětem“, pro dospělé je to trochu zamotanější na více úrovních, například dle PDO::ATTR_EMULATE_PREPARES lze zjistit (a nastavit) jestli, jsou to prováděné „server-side“ připravené dotazy nebo to PDO emuluje a tedy teoreticky, ten kompletní dotaz existuje sestavený na úrovni PDO.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.