IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

PDO et liste de valeurs WHERE NOT IN


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 81
    Par défaut PDO et liste de valeurs WHERE NOT IN
    Bonjour à tous,

    Je souhaite afficher aléatoirement des enregistrements d'une base de données dont l'id ne se trouve pas dans une liste (instruction NOT IN ('value1','value2'...) de SQL.
    Hélas, si cela marche quand je le teste directement dans PHPmyAdmin, ça semble capoter quand je lance l'instruction depuis PDO... et là je sèche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    		// ramène la liste des enregistrements déjà traités :
    		$query = $bdd->prepare("
    		SELECT liste_id
    		FROM base
    		WHERE cle = :cle
    		");
    		$query->execute(array(
    			'cle' => $_COOKIE["id"]
    		));
    		$liste_enregistrements= $query->fetch();
    		$enregitsrements_proposes = "'" . implode("','", explode(",", $liste_enregistrements['liste_id'])) . "'"; // ici je convertis la chaîne de la base "id1,id2,id3" en 'id1','id2','id3' ça fonctionne bien.
    		// ramène une photo aléatoire qui ne soit pas déjà proposée :
    		$query2 = $bdd->prepare("
    		SELECT id, intro
    		FROM base
    		WHERE id NOT IN (:deja_proposees) // ici je passe la nouvelle liste en variable et je pense que le problème est ici
    		ORDER BY RAND()
    		LIMIT 1
    		");
    		$query2->execute(array(
    			'deja_proposees' => $enregitsrements_proposes 
    		));
    		$id_nouveau = $query2->fetch();
    		$nouvel_id = $id_nouveau ['id'];
    Comme indiqué, la requête "query2" décomposée ainsi dans PhpMyAdmin fonctionne correctement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT id, intro FROM base WHERE id NOT IN ('id1','id2','id3') ORDER BY RAND() LIMIT 1
    Y a t'il un souci lié à mon instruction PDO ? Une restriction ?

    Merci pour vos lumières !

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE id NOT IN (:deja_proposees)
    Non.
    On ne peut pas faire comme ça, car il s'agit de PLUSIEURS données, et pas d'une seule.

    Une solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <?php
    $in_placeholder = [];
    $in_params_arr = [];
    foreach( $enregitsrements_proposes as $idx => $val )
    {
       $in_placeholder[] = ':id-'.$idx;
       $in_params_arr[':id-'.$idx] = $val;
    }
     
    		$sql2 = "SELECT id, intro
    		FROM base
    		WHERE id NOT IN ('".implode("','",$in_placeholder)."') 
    		ORDER BY RAND()
    		LIMIT 1
    		;";
    		$query2 = $bdd->prepare( $sql2 );
    		$query2->execute(
    			$in_params_arr
    		);
    Pour vérifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo $sql2;
    var_dump($in_params_arr);

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 81
    Par défaut
    Super ! Un grand merci jreaux62.

    Je convertis toutes mes anciennes instructions à PDO et j'ai encore des lacunes ^^

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 81
    Par défaut
    Arf...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE id NOT IN ('',':id-0',':id-1',':id-2',':id-3',':id-4',':id-5',':id-6',':id-7',':id-8',':id-9',':id-10') ORDER BY RAND() LIMIT 1
    Hélas j'ai encore un souci... je me demande si ça ne vient pas de ce premier '' vide en tête dont je ne comprends pas l'origine...

    EDIT : J'ai ajouté un array_filter et ma requête est cohérente... hélas !! Elle ne marche toujours pas !
    J'ai encore des enregistrements qui remontent qui sont pourtant dans la chaîne ! Je deviens fou !!

  5. #5
    Invité
    Invité(e)
    Par défaut
    Et var_dump($in_params_arr); ?

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 81
    Par défaut
    Je pense que j'ai raté un truc ^^
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    		$query = $bdd->prepare("
    		SELECT pseudo, photos_succes
    		FROM base
    		WHERE cle = :joueur
    		");
    		$query->execute(array(
    			'joueur' => $joueur
    		));
    		$photo_succes = $query->fetch();
    		echo $listes_photos_trouvees = $photo_succes['photos_succes']; // retourne 1,45,23,58
    		$listes_photos_trouvees = explode(',', $listes_photos_trouvees);
    		// on prépare la liste de paramètres :
    		$in_placeholder[] = "";
    		$in_params_arr[] = "";
    		foreach ( $listes_photos_trouvees as $idx => $val )
    		{
    		   $in_placeholder[] = ':id-'.$idx;
    		   $in_params_arr[':id-'.$idx] = $val;
    		}
    		// ramène une photo aléatoire qui ne soit pas déjà proposée :
    		$sql2 = "SELECT id, intro, commune, proposition
    		FROM base
    		WHERE id NOT IN ('".implode("','",array_filter($in_placeholder))."') 
    		ORDER BY RAND()
    		LIMIT 1
    		;";
    		$query2 = $bdd->prepare( $sql2 );
    		$query2->execute(
    			array_filter($in_params_arr)
    		);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    array(4) { [":id-0"]=> string(1) "1" [":id-1"]=> string(2) "45" [":id-2"]=> string(2) "23" [":id-3"]=> string(2) "58" } 
    array(4) { [1]=> string(5) ":id-0" [2]=> string(5) ":id-1" [3]=> string(5) ":id-2" [4]=> string(5) ":id-3" }

  7. #7
    Invité
    Invité(e)
    Par défaut
    ....

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 81
    Par défaut
    Bon effectivement on a affaire à un cas particulier de PDO.

    J'ai trouvé l'explication sur une page internet, je ne publie pas le lien ici pour ne pas faire de pub.
    "PDO is not good with such things. You need to create a string with question marks dynamically and insert into query."

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $in  = str_repeat('?,', count($in_array) - 1) . '?';
    $sql = "SELECT * FROM my_table WHERE my_value IN ($in)";
    $stm = $db->prepare($sql);
    $stm->execute($in_array);
    $data = $stm->fetchAll();

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/05/2017, 12h27
  2. Réponses: 3
    Dernier message: 14/03/2014, 12h39
  3. Obtenir la liste des valeurs possibles d'un type
    Par pascalT dans le forum Langage
    Réponses: 5
    Dernier message: 05/10/2004, 15h46
  4. [CR] PARAMETRE : LISTE DE VALEUR
    Par SYLV1G dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 13/09/2004, 09h52
  5. Combo box et liste de valeurs contenues dans ma table
    Par TieumB dans le forum C++Builder
    Réponses: 14
    Dernier message: 05/04/2004, 18h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo