Bonsoir,

J'ai une variable qui contient: "1,23,136,58"
J'aimerai selectionner l'id 1,23,136,58 de la table "skills" et afficher leur nom automatiquement dans un foreach du genre:

    $sql = $db->query("REQUETE...");
    while($dada = $sql->fetch(PDO::FETCH_OBJ)) {
        echo $data->name;
    }

Mais je n'ai aucune idée de comment selectionner les éléments, j'ai essayé " WHERE id = '1,23,136,58' mais sa ne fonctionne pas.

Merci.

3 réponses


tleb
Réponse acceptée
<?php

//prepare $db here

$var = '1,23,136,58';

$arr_var = explode(',', $var);

$request_build = 'SELECT * FROM skills WHERE ';
$request_values = [];

foreach ($arr_var as $key => $value) {
    $request_build .= 'id = ? OR ';
    $request_values[] = $value;
}

$request_build = substr($request_build, 0, -4);

$req = $db->prepare($request_build);
$req->execute($request_values);

$return = $req->fetchAll();

J'ai pas testé, désolé si sa ne marche pas.

Fonctionnement :

  • Il faut commencer par avoir une instance de PDO ($db) ;
  • $var contient l'input ;
  • On transforme la string en array dans $arr_var ;
  • On construit la requête, ce qui nous donnera quelque chose comme : SELECT * FROM skills WHERE id = ? OR id = ? OR id = ? OR id = ? ;
  • On l'exécute (il se peut que cette partie ne marche pas, j'oublie toujours comment prepare, execute et fetchAll marche).
skp
Réponse acceptée

Bonjour,

Première possibilité sans requête préparé

$var = "1,23,136,58";

$query = "SELECT * FROM skills WHERE ID IN (" . $var . ")";

$request = $db->query($string);

$request->setFetchMode(PDO::FETCH_OBJ);

$result = $request->fetchAll();

foreach($result as $value)
{
    echo $value->nom;
}

Deuxième possibilité avec requête préparé et selon moi modulable

$var = "1,23,136,58";

//$vars devient un talbeau contenant [1, 23, 136, 58]
$vars = explode(",", $var); 

//pour la chaine $var on remplace les numéros par "?"
$where_in = preg_replace("/[0-9]+/", "?", $vars);
/*
* Autre méthode qui peut servir dans un cas où par exemple les ID's sont directements dans un talbeau
* $where_in = implode(",", array_fill(0, count($vars), "?"));
* array_fill va créer un tableau de la même grandeur que $vars et il va remplir le tableau avec la valeur "?"
* implode va créer une chaine en rassemblent les éléments du résultat de la fonction array_fill
* résultat attendu : "?,?,?,?"
 */

$query = "SELECT * FROM skills WHERE ID IN (" . $where_in . ")";

$request = $db->prepare($query);

//parcourir $vars pour associer les valeurs aux paramètres
foreach($vars as $key => $value)
{
    $key++; //pour éviter l'indice 0
    $request->bindValue($key, $value, PDO::PARAM_INT);
}

//Exécute notre requête
$request->execute();

$request->setFetchMode(PDO::FETCH_OBJ);

//Retourne un talbeau contenant le résultat de notre requête
$result = $request->fetchAll();

foreach($result as $value)
{
    echo $value->nom;
}
MehdiWEB
Auteur

Merci à vous !