Toon posts:

[PDO] WHERE ... IN ...

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Al een tijdje ben ik bezig al mijn mysqli queries om te zetten in PDO. Tot nu toe is het aardig gelukt, maar ik loop nu vast bij een SELECT * FROM ... WHERE ... IN ... query.

Op de formulierpagina ervoor, maak ik een lijst met checkboxes. Als deze worden aangevinkt, dan komen ze binnen en kan ik ze met PHP met
code:
1
$alles= "'" . implode("','", $_POST['SelectedItems']) . "'";
in de variabele $alles gooien en die in het SQL statement neerzetten, bijvoorbeeld DELETE FROM ... WHERE ... IN $alles.

Maar nu met PDO moet het natuurlijk gebind worden in een afgebakend stukje. Dus ik zal een loopje moeten gebruiken maar dan weet ik nog niet hoe ik de query opbouw want die zal ook dynamisch moeten zijn. Of zie ik nu iets heel simpels over het hoofd?

Acties:
  • 0 Henk 'm!

  • Wiebeltje
  • Registratie: Maart 2013
  • Laatst online: 11:29
Wat heb je zelf al gevonden? Als je de topic titel in google gooit heb je volgens mij al direct het antwoord wat je wil hebben. Het idee is in ieder geval dat je bij de prepare() net zoveel vraagtekens gebruikt als dat je waardes voor je IN () statement hebt. WHERE IN (?, ?, ?).
Vervolgens kun je gewoon bindValue met een for loopje of execute() gebruiken.

http://stackoverflow.com/...-array-to-an-in-condition

[ Voor 10% gewijzigd door Wiebeltje op 07-07-2015 11:15 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Met Google vond ik niet echt iets bruikbaars, althans, met de eerste 2 resultaten van Stackoverflow kwam ik niet echt verder en met het derde resultaat geeft iemand het advies om geen PDO te gebruiken.

Maar zojuist nog even naar die eerste 2 resultaten gekeken en ik geloof dat er nu toch iets meer begint te dagen.
Het idee is in ieder geval dat je bij de prepare() net zoveel vraagtekens gebruikt als dat je waardes voor je IN () statement hebt. WHERE IN (?, ?, ?)
Ja maar dat is nu net de vraag. Ik weet niet hoeveel vraagtekens ik nodig heb van tevoren. De ene keer is het er 1 en de andere keer zijn het er 50. Ik geloof dat ik iets mis... ;)

Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 14:32

Saven

Administrator

je kan ook met :placeholders werken

Acties:
  • 0 Henk 'm!

  • Sneezydevil
  • Registratie: Januari 2002
  • Laatst online: 29-09 10:22
In het voorbeeld van Wiebeltje tellen ze ook het aantal waardes en passen het aantal vraagtekens daarop aan :).

code:
1
$inQuery = implode(',', array_fill(0, count($ids), '?'));

Acties:
  • 0 Henk 'm!

  • radem205
  • Registratie: Juni 2002
  • Laatst online: 02-02-2022
Dus het voorbeeld dat je kan vinden in de link van Wiebeltje wordt in jouw geval dan:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
$selected_items     = $_POST['SelectedItems'];

if(is_array($selected_items) AND count($selected_items) > 0) {

$inQuery = implode(',', array_fill(0, count($selected_items), '?'));

$stmt = $db->prepare(
    'SELECT *
     FROM table
     WHERE id IN(' . $inQuery . ')'
);


foreach ($selected_items as $k => $id) {
    $stmt->bindValue(($k+1), $id);
}

$stmt->execute();

}
?>

[ Voor 9% gewijzigd door radem205 op 08-07-2015 12:50 ]


Acties:
  • 0 Henk 'm!

  • Chocochaos
  • Registratie: Februari 2007
  • Laatst online: 07-10 16:39
Als je PDO gebruikt wil je waarschijnlijk FIND_IN_SET gebruiken in plaats van IN. Je kommagescheidenlijst met opties kun je dan als een enkele paramater doorgeven.

http://stackoverflow.com/questions/4155873/find-in-set-vs-in

PHP:
1
2
3
4
5
6
7
8
9
10
11
<?php

if (!empty($_POST['SelectedItems']) && is_array($_POST['SelectedItems'])) {
    $selectedItems = $_POST['SelectedItems'];
} else {
    $selectedItems = [];
}

$stmt = $pdo->prepare("DELETE FROM `table` WHERE FIND_IN_SET(`id`, :items);");
$stmt->bindParam('items', implode(',', $selectedItems));
$stmt->execute();


Ik raad je echter zeer aan om de inhoud van $_POST['SelectedItems'] te validaten of sanitizen, aangezien je nu geen idee hebt wat er binnenkomt.
Pagina: 1