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 :

IN ($array_glaciers) [SQL-Server]


Sujet :

PHP & Base de données

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 167
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 167
    Par défaut IN ($array_glaciers)
    Bonjour à tous,

    Je coince encore pour extrauire les données d'une base de donnée selon une array.

    J'ai plusieurs menus déroulants afin de sélection 1 ou plusieurs glaciers, 1 ou plusieurs locations, etc.

    Je récupère les données ainsi
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    (isset($_GET['glaciers'])) ? $array_glaciers = $_GET['glaciers'] : $array_glaciers = array();
    print_r($array_glaciers);
    Ca marche.

    Ensuite je faire une requte sur ma base MSSQL.

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $where0 ="la.id_label > 0";
    $tsql0= 'SELECT id_label FROM labels AS la WHERE '.$where0.' ORDER BY la.id_label ASC;';
    $getResults0= sqlsrv_query($conn, $tsql0, array(), array("Scrollable"=>"static"));
    echo $num_rows = sqlsrv_num_rows( $getResults0 );

    Ca marche aussi

    Maintenant, j'aimerais ajouter mes glaciers, donc je pensais ajouter ceci


    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $where0 ="la.id_label > 0";
    $array_glaciers = implode(',',$array_glaciers);
    $where0 .= ' AND la.galciers_id_glacier IN ($array_glaciers)';
    $tsql0= 'SELECT id_label FROM labels AS la WHERE '.$where0.' ORDER BY la.id_label ASC;';
    $getResults0= sqlsrv_query($conn, $tsql0, array(), array("Scrollable"=>"static"));
    echo $num_rows = sqlsrv_num_rows( $getResults0 );

    Donc en mors, il va axtraire tous les glacier qui se ont l'id stocké dans $array_glaciers dont l'id des label est supérieurs a 0

    Le hic c'est que la fonction

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo $num_rows = sqlsrv_num_rows( $getResults0 );
    me retourne cette erreur
    Warning: sqlsrv_num_rows() expects parameter 1 to be resource, boolean given in /var/www/html/opal/index.php on line 317
    Array ( [0] => Array ( [0] => IMSSP [SQLSTATE] => IMSSP [1] => -14 [code] => -14 [2] => An invalid parameter was passed to sqlsrv_num_rows. [message] => An invalid parameter was passed to sqlsrv_num_rows. ) )
    Je me demande si SQL retourne des lignes mais portant les glacier existes bien dans la bas de donnée,
    ou alors j'emploie mal cette partie
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $where0 .= ' AND la.galciers_id_glacier IN ($array_glaciers)';


    Quelle erreur de syntaxe dois-je corrigé alors?

    Milles mercis

  2. #2
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Tu as écrit gaLcier au lieu de gLacier. Si ça ne fonctionne toujours pas c’est qu’il y a d’autres erreurs.

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $where0 .= ' AND la.galciers_

    Un bon conseil. En programmation l’élément le moins fiable est le programmeur. Donc quand on sait ça on se dote de bonnes pratiques qui limitent cette faiblesse. Parmi celles ci il y en a une de base qui consiste à ne jamais utiliser un même nom de variable pour faire deux choses différentes. Dans ton cas tu as

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $array_glaciers = implode(',',$array_glaciers);

    Un tabeau que tu transformes en chaîne. A bannir ! On n’est plus en 1980 quand on avait + ou - 26 variables.
    Suis les bonnes pratiques et tu auras moins besoin de nous.

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 167
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 167
    Par défaut
    Hello
    en effet, c'etait une bête erreur. Ca marche maintenant.
    il y en a une de base qui consiste à ne jamais utiliser un même nom de variable pour faire deux choses différentes
    Merci j'ai corrigé-

    Par contre
    Un tabeau que tu transformes en chaîne
    J'ai changé ainsi
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $arrayglaciers = implode(',',$array_glaciers);
            $where0 .= " AND la.glaciers_id_glacier IN ($arrayglaciers)";
    en
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //$arrayglaciers = implode(',',$array_glaciers);
            $where0 .= " AND la.glaciers_id_glacier IN ($array_glaciers)";

    Mais il ne l'accepte pas
    Notice: Array to string conversion in /var/www/html/opal/index.php on line 309
    la.id_label > 0 AND la.glaciers_id_glacier IN (Array)

  4. #4
    Invité
    Invité(e)
    Par défaut
    1- @badaze

    Dans son cas, il faut bien faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $liste_id_glaciers = implode(',',$array_glaciers);
    En effet, "IN" attends une chaine de valeurs, séparées par des virgules (en supposant ici qu'il s'agit d'une liste d'id, donc numériques)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            $where0 .= " AND la.glaciers_id_glacier IN (".$liste_id_glaciers.")";
    Ou directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            $where0 .= " AND la.glaciers_id_glacier IN (".implode(',',$array_glaciers).")";

    2- Par contre, ce qui m'inquiète, c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (isset($_GET['glaciers'])) ? $array_glaciers = $_GET['glaciers'] : $array_glaciers = array();
    Il y a PEU de chance que $_GET['glaciers'] renvoie un array...

    @pierrot10
    Peux-tu montrer le résultat de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var_dump( $array_glaciers );

  5. #5
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Dis moi que tu rigoles !

    Dans ce que tu as posté tu avais :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $array_glaciers = implode(',',$array_glaciers);
    où tu supprimes le tableau $array_glaciers pour le remplacer par une chaîne de caractères.

    Mais pas :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $arrayglaciers = implode(',',$array_glaciers);
    Qui est informatiquement correct mais pourquoi appeler $arrayglacier une chaîne de caractères ?

    Tu vois à ne pas être clair tu t'y perds toi même alors qu'il n'y a que 3 lignes puisque tu mets en commentaire la ligne qui crée une chaine de caractères à partir d'un tableau et que tu mets ce tableau au sein d'une concaténation qui n'admet pas de tableau !

    Imagine si quelqu'un d'autre doit reprendre ton code. Si dans le nom d'une variable tu mets le mot array c'est qu'on doit s'attendre à avoir un array dedans et pas une chaîne de caractères !
    Tu ne pourras pas évoluer en programmation sans une certaine rigueur. Et cette rigueur elle commence avec des petites choses comme ça.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par badaze Voir le message
    ...Qui est informatiquement correct mais pourquoi appeler $arrayglacier une chaîne de caractères ?...
    Là, je suis d'accord avec badaze.

    Mets des noms de variables EXPLICITES.

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 167
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 167
    Par défaut
    Imagine si quelqu'un d'autre doit reprendre ton code. Si dans le nom d'une variable tu mets le mot array c'est qu'on doit s'attendre à avoir un array dedans et pas une chaîne de caractères
    Oui en efftet, c'est complètement ridicule. Je corrige ca immédiatement!!
    Merci

  8. #8
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    @jreaux62

    Tu as mal interprété mon intervention.

    Le code qui suit fonctionnera car le IN qui suit est basé sur la nouvelle valeur de $array_glaciers.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $array_glaciers = implode(',',$array_glaciers);
    J'ai seulement voulu lui dire qu'on n'appelle pas deux variables qui ont des fonctions différentes avec le même nom.

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

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