Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Verwenden Sie die IN-Direktive, um mit einer vorbereiteten Anweisung zu suchen

Die vorbereitete Anweisung hat keine Parameter, da Sie die Liste vor der Vorbereitung in die Anweisung interpoliert haben.

$array=array("item1","item2","item3","item4");
//This is dynamically filled, this is just an example
$in_list = "'".implode("','",$array)."'";//that's why i use implode

$stmt = $this->db->prepare('SELECT libelle,activite,adresse,tel,lat,lng FROM etablissements where type IN ('.$in_list.')');

An diesem Punkt lautet die von Ihnen erstellte SQL-Anweisung:

SELECT libelle,activite,adresse,tel,lat,lng 
FROM etablissements where type IN ('item1','Item2','Item3','Item4')

Da die Anweisung keine Parameter hat, mysqli_stmt::bind_param scheitert. Anstatt die Elemente in die Anweisung zu interpolieren (was anfällig für Injektionen ist), interpolieren Sie eine Reihe von Parametern und binden Sie dann die Werte (die getrennt gehalten werden müssen).

$array=array("item1","item2","item3","item4");

if (count($in_list) > 0) {
    $query = $this->db->prepare('SELECT libelle,activite,adresse,tel,lat,lng FROM etablissements WHERE type IN (' . str_repeat('?, ', count($in_list)-1) . '?)');

    $args = $in_list;
    array_unshift($args, str_repeat('s', count($in_list)));
    call_user_func_array(array($query, 'bind_param'), $args);
    $query->execute();
    $query->bind_result($libelle,$activite,$adresse,$tel,$lat,$lng);
}

Die Schnittstelle von PDO zum Binden ist einfacher.

$array=array("item1","item2","item3","item4");

if (count($in_list) > 0) {
    $query = $this->db->prepare('SELECT libelle,activite,adresse,tel,lat,lng FROM etablissements WHERE type IN (' . str_repeat('?, ', count($in_list)-1) . '?)');

    foreach ($in_list as $i => $arg) {
        // query params are 1-based, so add 1 to the index
        // PDO::PARAM_STR is the default type, so no need to pass 3rd arg
        $query->bindValue($i+1, $arg);
    }
    $query->execute();
    // no need to bind the result
}

Tatsächlich kann es mit PDO sogar noch einfacher sein, da PDOStatement::execute kann eine Liste von Parameterwerten annehmen:

$array=array("item1","item2","item3","item4");

if (count($in_list) > 0) {
    $query = $this->db->prepare('SELECT libelle,activite,adresse,tel,lat,lng FROM etablissements WHERE type IN (' . str_repeat('?, ', count($in_list)-1) . '?)');

    $query->execute($in_list);
}