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 :

select in( variable) avec oracle [Oracle]


Sujet :

PHP & Base de données

  1. #1
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut select in( variable) avec oracle
    Bonjour a tous
    (oracle10, rhel5, php5)

    je suis en train de coder une page ou la requete SQL est du type:
    select champs from table where id in('valeur1','valeur2','valeur3');

    Les valeurs de $valeurs je les sort d'une boucle...alors si je fais un echo la requete sort bien, mais je n'arrive pas a mettre la requete dans une variable. L'objectid est que cette requete construite dinamiquement entre en un autre oci_exexute($variable).

    Voici le code:
    On part que $q2 est une requete qui sort a partir du champs 2 les veleurs qui seront dans $valeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    oci_execute($q2);
       while ($row = oci_fetch_row($q2)) {
                    $tt="SELECT Z00R_NORMALIZED_TEXT from z00R where Z00R_REC_KEY_1 IN(";
                    for($i=1;$i<count($row);$i++){
                        $tt1="'".$row[$i]."',";
                    }
                    $tt2="') AND z00R.Z00R_FIELD_CODE='520';";
     }
    echo $tt.$tt1.$tt2;
    Si je fait un echo dans la boucle au lieu de mettre $row[$i] dans une variable, toutes les valeurs de $row[$i] sortent, mais si je place dans $tt1 seul la premiere valeur sort et j'arrive pas a contruire la requete.

    J'espere que qqu'un connait le truc..
    D'avance merci

  2. #2
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    bonjour,

    c'est parce que tu as une ',' de trop. Tu dois mettres tes valeurs dans un tableau puis faire un implode dessus par exemple.

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $in = array();
     
    // Boucle de remplissage de tes valeurs dans ton tableau $in
     
    $valeursIn = implode(',', $in);
     
    $tt='SELECT Z00R_NORMALIZED_TEXT from z00R where Z00R_REC_KEY_1 IN('.$valeursIn.') AND z00R.Z00R_FIELD_CODE=\'520\'';

  3. #3
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut
    Salut

    dans ton exemple le $in=array()...ca correspond a ceci dans mon code?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for($i=1;$i<count($row);$i++){
                        $tt1="'".$row[$i]."',";
                    }
    le array c'est le $row[$i] ?

    D'avance merci...je vais essayer comme ça

  4. #4
    Membre éclairé
    Inscrit en
    Juillet 2003
    Messages
    625
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 625
    Points : 673
    Points
    673
    Par défaut
    Bonjour,

    peut être faire un substr($tt1,0,-1) pour enlever le dernier caractere
    Le savoir est utile que s'il est partagé par tous.
    /(bb|[^b]{2})/
    !sleep() ? array((string))

  5. #5
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut
    Salut
    alors oui le substr aussi ça marche,
    mais le probleme c'est pas tant le resultat de l'echo, le probleme c'est que j'arrive pas a mettre dans une variable le contenu de ce for:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while ($row = oci_fetch_row($q2)) {
                    for($i=1;$i<count($row);$i++){
                        $valeurIn=implode(',',$row[$i]);
                    }
      $tt="SELECT Z00R_NORMALIZED_TEXT from z00R where Z00R_REC_KEY_1 IN('".$valeurIn."') AND z00R.Z00R_FIELD_CODE='520';";
     
     }
    Ce code retourne:

    Warning: implode() [function.implode]: Invalid arguments passed in /full1.php on line 21

  6. #6
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    A quoi correspond $q2 ? Peut être y'a t-il une possibilité de faire tout en une seule requete non ?

  7. #7
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut
    Ce code la aussi donne erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    oci_execute($q2);
       while ($row = oci_fetch_row($q2)) {
                    for($i=1;$i<count($row);$i++){
                       $in=$row[$i];
                    }
            $valeur=implode(",",$in);
      $tt="SELECT Z00R_NORMALIZED_TEXT from z00R where Z00R_REC_KEY_1 IN('".$valeur."') AND z00R.Z00R_FIELD_CODE='520';";
     
     }
    echo $tt;
    l'erreur est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Warning: implode() [function.implode]: Invalid arguments passed in /htdocs/full1.php on line 24
    SELECT Z00R_NORMALIZED_TEXT from z00R where Z00R_REC_KEY_1 IN('') AND z00R.Z00R_FIELD_CODE='520';

  8. #8
    Membre éclairé
    Inscrit en
    Juillet 2003
    Messages
    625
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 625
    Points : 673
    Points
    673
    Par défaut
    et un

    ?
    Le savoir est utile que s'il est partagé par tous.
    /(bb|[^b]{2})/
    !sleep() ? array((string))

  9. #9
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    non en faisant ca :


    tu écrases à chaque fois la valeur de ton $in. Il faut que tu fasses ceci :

    Mais a quoi correspond $q2 ?

  10. #10
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut
    Q2 represente un select tel que:

    select id, valeur1,valeur2 etc... from table;

    Le resultat de cette requette est quelque chose comme:

    ID,BASE01,BASE02,BASE03
    000000094,DEM03619,DEM03571,DEM02710

    Les 3 valeurs DEMO.... sont celles que je dois coller dans le IN.

  11. #11
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut
    ouullaaa
    on y est presque
    Regarde le dernier output:

    SELECT Z00R_NORMALIZED_TEXT from z00R where Z00R_REC_KEY_1 IN('IEM00825,IEM00568,IEM02567,IEM02953,IEM02605,IEM02854,IEM02855') AND z00R.Z00R_FIELD_CODE='520';
    la le seul probleme que je vois c'est qu'il manquera les ' aux valeurs...
    vu que ce sont des varchar2().

  12. #12
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut
    Je crois que cette fois c'est la bonne
    en remplacant ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $valeur=implode(",",$in);
    par ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $valeur=implode("','",$in);
    ca marche !!
    Genial !! Merci pour les conseils
    Bon week

  13. #13
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    oci_fetch_row :
    Retourne un tableau indexé numériquement contenant la prochaine ligne d'une requête. Chaque élément de ce tableau correspond à une colonne de la ligne. Cette fonction est appelé typiquement dans une boucle tant qu'elle ne retourne pas FALSE, indiquant qu'il n'y a plus de lignes de disponible.
    Ce qui t'intéresses pour chaque tour de boucle ce sont les valeurs 5, 6, 7 correspondant aux indices DEMO. Donc tu dois faire quelque chose comme ceci :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $tableau = array();
     
    while ($row = oci_fetch_row($q2)) {
       $tableau[] = $row[5];
       $tableau[] = $row[6];
       $tableau[] = $row[7];
    }
     
    $in = implode(',', $tableau);
     
    $requete = 'SELECT ... IN('.$in.')';

    (éventuellement quoter tes valeurs si elles ne sont pas numériques).

    Mais si $q2 te sert uniquement à récupérer les valeurs du IN, tu peux effectuer qu'une seule requete :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT * FROM taTable
    WHERE machin IN (
       SELECT champ_demo1, champ_demo2, champ_demo3 FROM tonAutreTable
    )

  14. #14
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut
    A ben oui.. Ca marche aussi en une seul requete, c'est mieux meme car ca alege le code.
    Super,
    merci encore.
    Week end de 3 jours...

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

Discussions similaires

  1. selection de lignes avec variable
    Par Marys dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 22/04/2018, 11h12
  2. Boucle for avec SELECT et variable indicée
    Par hisin dans le forum Langage
    Réponses: 4
    Dernier message: 14/12/2009, 11h53
  3. Selection de feuille avec un nom variable
    Par kakov dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 23/10/2008, 15h50
  4. [C#] Select avec AVG avec Oracle 10g
    Par kinou dans le forum Windows Forms
    Réponses: 3
    Dernier message: 12/09/2008, 11h48
  5. [MySQL] Récupération variable avec <select>
    Par ritepac dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 10/08/2007, 13h43

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