PDO in array kot parameter

Težavo imam s PDO in sicer s queryjem, ki vsebuje operator IN, kjer želim kot parameter podati array, da mi ga pretvori v niz vrednosti, ločene z vejico.

Primer:

$stmt = $db->prepare('SELECT * FROM tabela WHERE polje IN (:vrednosti);');
$stmt->execute([':vrednosti' => [1, 2, 3]]);

Vrstica, kjer je $stmt->execute(), vrže napako Notice: Array to string conversion.

Ali PDO ne zna delati s parametri na ta način? Kako bi lahko to rešil na pravilen način?

2 odgovora

3 2 1

5 sec googlanja vrže ta zadetek PHP - Using PDO with IN clause array

In v kodo predstavim možnost SQL injectiona? Vprašal sem, kakšen je PRAVILEN način. –

Na hitro je videt injection samo v vprašanju, odgovori izgledajo OK. –

Se opravičujem, preveč na hitro sem pogledal očitno. Ko je še @Vini odgovoril podobno, sem v bistvu razumel rešitev. Hvala! –

2 2

Z enako težavo sem si razbijal glavo pred nekaj leti. PDO žal tega ne zna vsaj približno elegantno rešiti, ali pa pač samo še nisem naletel na to. Jaz sem to rešil z nekaj čaranja znotraj neke wrapper funkcije/metode okoli prepare() in execute(), da mi deluje sistemsko znotraj cele aplikacije, detajli so za tale odgovor verjetno nepomembni. Je zadeva sicer grda in hackish, ampak deluje sort of PDO-way. :)

Poenostavljena rešitev za tvoj primer:

$vrednosti = [1,2,3];
$params = [];
$in = [];
foreach ($vrednosti as $c => $value) {
  $key = ':vrednost_'.$c;
  $params[$key] = $value;
  $in[] = $key;
}

$stmt = $db->prepare('SELECT * FROM tabela WHERE polje IN ('.join(',', $in).');');
$stmt->execute($params);

Preveriti verjetno želiš še, če je $c res numeric, ali pa vsaj, recimo, regexp /^[a-z0-9]+$/i, drugače bo lahko $key neveljaven in ti bo PDO ven ruknil napako o napačnih parametrih, ali nekaj podobnega, se ne spomnim natanko, nisem pa preverjal zdaj še enkrat. Tudi gornja koda lahko vsebuje kakšno napako, je nisem stestiral, ampak za ponazoritev rešitve bo verjetno dovolj dobra.

Hvala tudi tebi. Je link do nečesa podobnega že objavil @gnome, ampak nisem razumel. –