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 :

2 boucle while imbriquées [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut 2 boucle while imbriquées
    Bonjour a tous,

    j'ai 2 tables mysql, et je souhaite creer une table html avec les données de la tabla A.
    Une des colones de la tables sera un <select> dans lequel je souhaite parcourir avec un autre while, une requête de la table B.

    Donc je fais quelque chose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     while($row = mysql_fetch_array($result, MYSQL_ASSOC)){
                  echo "<td>{$row['champs']}</td>";
                  echo "<select>";
                      while($row = mysql_fetch_array($result, MYSQL_ASSOC)){
                          echo"<option= bla bla bla";
                      }
                  echo "</td>";
     }
    Le premier while affiche bien mes données
    et le second fonctione mais seulement sur la premiere ligne.

    Quelqu'un a une idée de pourquoi?
    D'avance merci

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    Tu parles de 2 requêtes : Table A et Table B
    Dans ton code tu utilises $result pour les 2 requêtes ! Sans compter que le 2ème while ne fait même pas d'interrogation de la base.
    Postes les requêtes sql stp

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    Bonjour.
    Je poste ici le vrai code, avant c'etait pour essayer d'expliquer le probleme.

    Alors voila les 2 requêtes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // Lista los grupos hijos cargados
     $sql="select * from hijo where nombre_hijo !='bibviewer'";
     
     // Ejecucion de la query
     $result = mysql_query($sql);
     
    // Lista los grupos definidos como padres
     $sql1="select * from padre";
     
     // Ejecucion de la query
     $result1 = mysql_query($sql1);
    Comme tu oeux voir ce sont 2 requêtes simples.
    donc on a $result et $result1

    ensuite voici les 2 whiles
    Le resultat a l'ecran est une table de 3 colones, la 3e colones est un select
    il est OK sur la premiere ligne et vide a toutes les autres.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
     
            while($row = mysql_fetch_array($result, MYSQL_ASSOC)){
                     echo "<td>{$row['id_grupo_hijo']}</td>
                           <td>{$row['nombre_hijo']}</td>
                            <td><select>";
                    while($row1 = mysql_fetch_array($result1, MYSQL_ASSOC)){
                            echo "<option value='{$row['nombre_padre']}'>'{$row1['nombre_padre']}'</option>";
                    }
                    echo "</td></select></tr>";
            }
    ?>

  4. #4
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Je ferais plus quelque chose dans ce genre :
    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
    <?php
     
    // Lista los grupos definidos como padres
    $rows = array();
    $sql  = "SELECT * FROM padre";
    $qry  = mysql_query($sql);
    while($row = mysql_fetch_assoc($qry)) {
        $rows[] =
    <<<HTML
    <option value="{$row['nombre_padre']}">{$row['nombre_padre']}</option>
    HTML;
    }
    $padres = '<select>'.implode("\n", $rows).'</select>';
     
    // Lista los grupos hijos cargados
    $sql = "SELECT * FROM hijo WHERE nombre_hijo != 'bibviewer'";
    $qry = mysql_query($sql);
     
    while($row = mysql_fetch_assoc($qry)) {
        echo
    <<<HTML
        <td>{$row['id_grupo_hijo']}</td>
        <td>{$row['nombre_hijo']}</td>
        <td>{$padres}</td>
    </tr>
    HTML;
    }
    ?>
    Tu affiches toujours le même select pour chaque enregistrement, du coup pas la peine de le réécrire à chaque fois.

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    Yessss
    genial ça marche.
    Alors si je comprend bien ce que tu as fait:
    La requête qui correspond au SELECT en fait tu la place dans un array et ensuite
    au lieu de refaire un while tu place la variable.

    Je ne comprends pas ceci:
    Et autre chose que je ne suis pas sur, dans $row[]tu place tout ça?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <<<HTML
    <option value="{$row['nombre_padre']}">{$row['nombre_padre']}</option>
    HTML;
    ?
    Je deduis que la variable $padres en fait a la fin sera la commande <select> entiere avev les direfentes valeurs dans option...C'est bien ça?

    D'?avance merci

  6. #6
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    La notation <<<HTML ... HTML; s'appelle la syntaxe heredoc.
    C'est très utile pour garder une super lisibilité du code et si tu nommes judicieusement tes tag : <<<HTML CSS JS XML... tu vois en un clin d'oeil le genre de code que tu manipules.

    Pour le bout de code ceci devrait être plus clair :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        $options = implode("\n", $rows); // on transforme le tableau en string
     
        $padres  = 
    <<<HTML
        <select>
            {$options}
        </select>
    HTML;

  7. #7
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    A oui ça a l'air super, je ne connaissais pas.
    Je vais regarder la doc.

    Merci pour toutes les infos !! et pour l'aide !
    Bonne jounrée !

  8. #8
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    Bonjour

    alors la je comprends pas, j'ai reessayer le même code sur une autre page, et ça marche plus. Le comportement est etrange.

    Voici les requêtes etc:


    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
    $sql="select distinct(biblionumber) from biblioitems where biblionumber in(select biblionumber from issn_master where issn1 in($lista)or issn2 in($lista) or issnL in ($lista))";
     $qry = mysql_query($sql);
     
     $sql1="select embargo,fondo,tipo_fondo from stage1 where grupo='".$grupo."' and issn in(select issn1 from issn_master where issn1 in($lista)) or issn in(select issn2 from issn_master where issn2 in($lista));";
    $qry1 = mysql_query($sql1);
     
    $data = array();
    while ($row = mysql_fetch_assoc($qry)) {
        $data[] = $row[biblionumber]."\n";
    }
     
    $bib=implode("\n",$row[biblionumber]);
     
     while($row1 = mysql_fetch_assoc($qry1)) {
            $inc++;
            $sql_item= "insert into items (biblionumber,biblioitemnumber,itype,enumchron,booksellerid,itemcallnumber,barcode,homebranch,holdingbranch,notforloan,damaged,itemlost,wthdrawn,timestamp)values('".$bib."','".$bib."','".$row1[tipo]."','".$row1[fondo]."','".$row1[embargo]."','".$grupo."-".$inc.$row1['type']."-".$bib."','".$grupo."-".$inc.$row1['type']."-".$bib."','".$grupo."','".$grupo."',0,0,0,0,'".$date."')";
     
     echo $sql_item;
     
     }
    Le resulta de l'echo est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into items (biblionumber,biblioitemnumber,itype,enumchron,booksellerid,itemcallnumber,barcode,homebranch,holdingbranch,notforloan,damaged,itemlost,wthdrawn,timestamp)values('','','','1996-','','MHUPA-1-','MHUPA-1-','MHUPA','MHUPA',0,0,0,0,'')insert into items (biblionumber,biblioitemnumber,itype,enumchron,booksellerid,itemcallnumber,barcode,homebranch,holdingbranch,notforloan,damaged,itemlost,wthdrawn,timestamp)values('','','','2001-','','MHUPA-2-','MHUPA-2-','MHUPA','MHUPA',0,0,0,0,'')
    Tu vois l'erreur c'est que le $bib a toujours la même valeur, ici NULL
    Pas bon...
    Si je fais ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach($data as $bib){
            echo $bib;
    }
    J'obtiens ceci:

    La c'est correcte, 21758 est le premier biblionumber et 68413 le second.

    J'ai dû faire une erreur mais je vois pas ou.

    Si t'as 5 mn...
    D'avance merci

  9. #9
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    plusieurs choses :
    tu abuses tu SELECT WHERE IN, le IN est séquentiel et du coup très très lent. Il vaudrait mieux les remplacer par des jointures.
    Ton 1ere select est équivalent à ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        $sql =
    <<<SQL
    SELECT DISTINCT
        biblionumber
    FROM
        issn_master 
    WHERE
        issn1 IN ($lista)
        OR issn2 IN ($lista)
        OR issnL IN ($lista)
    SQL;
    ensuite cela devrait aller mieux avec ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $data[] = $row['biblionumber']."\n";
     
    $bib = implode("\n", $data);

  10. #10
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    Bonsoir,

    tout d'abord, merci pour ta reponse.
    Maintenant j'ai un doute (pour changer)

    Le select nouveau que t'as fais...
    $sql =
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <<<SQL
    SELECT DISTINCT
        biblionumber
    FROM
        FROM issn_master 
    WHERE
        issn1 IN ($lista)
        OR issn2 IN ($lista)
        OR issnL IN ($lista)
    SQL;
    y'a 2 FROM suivis...Je suppose que c'est une erreur.. Mais bref disons que la requête donne le resultat escompté. Et bien le resultat est celui ci:

    Le premier tour de boucle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into items (biblionumber,biblioitemnumber,itype,enumchron,booksellerid,itemcallnumber,barcode,homebranch,holdingbranch,notforloan,damaged,itemlost,wthdrawn,timestamp)values('23757 68314 ','23757 68314 ','','2001-','','MHUPA-1-23757 68314 ','MHUPA-1-23757 68314 ','MHUPA','MHUPA',0,0,0,0,'')

    Et le second:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into items (biblionumber,biblioitemnumber,itype,enumchron,booksellerid,itemcallnumber,barcode,homebranch,holdingbranch,notforloan,damaged,itemlost,wthdrawn,timestamp)values('23757 68314 ','23757 68314 ','','1996-','','MHUPA-2-23757 68314 ','MHUPA-2-23757 68314 ','MHUPA','MHUPA',0,0,0,0,'')
    Comme tu vois nous avons bien les 2 biblionumber mais ils ils devraient apparaitre comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into items (biblionumber,biblioitemnumber,itype,enumchron,booksellerid,itemcallnumber,barcode,homebranch,holdingbranch,notforloan,damaged,itemlost,wthdrawn,timestamp)values('23757','23757','','2001-','','MHUPA-1-23757 ','MHUPA-1-23757','MHUPA','MHUPA',0,0,0,0,'')
    Tu vois le premier ID dans le premier INSERT et le second dans l'autre.

    Peu être que faudrait concatener un ; et faire l'implode avec ; ?

  11. #11
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Je n'ai pas tout compris
    le premier numéro $bib, il va avec le premier enregistrement de $qry1 et le deuxième $bib avec le deuxième enregistrement ?

  12. #12
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    Salut

    en fait avant cette page, tu as une page ou l'utilisateur peu choisir une serie de livres. Ce sont des checks box.
    Lorsque tu valides tu passe dans $liste la valeur des issn des livres que tu choisis. Donc dans la page que nous sommes en train de retoucher, tu vois que dans la requete je fais mes issn in(blabla ) avec $liste.

    Le but est de creer dinamiquement une instruction INSERT INTO avec des donnees qui emanent de 2 tables differentes et impossible a joindre avec une requete. Voila pourquoi je suis oblige d'extraire et de sinchroniser les donnees.

    Donc pour repondre a ta question, dans l'exemple l'utilisateur a choisi 2 livres dans la page php precedente il passe les 2 issn dans le tableau liste. Donc pour chaque livre tu as un biblionumber unique (donc dans les instructions INSERT tu peux pas avoir differents biblionumber ça doit etre le meme partout.

    Dans le dernier exemle que t'as envoyer on voit bien les bibliobumbers mais ils apparaissent les 2 dans le meme insert et c'est pas bon, ca doit etre un dans chaque insert.
    Si l'utilisateur choisi 150 livres a la page precedente, tu auras 150 insert into avec un unique bilionumber.

    Voila j'espere expliquer mieux le probleme.

    Tiens t'as un français qui vient de gagner le premier set dans le tournois de tenis de paris !! Ole !

  13. #13
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par ldiaz Voir le message
    Le but est de creer dinamiquement une instruction INSERT INTO avec des donnees qui emanent de 2 tables differentes et impossible a joindre avec une requete.
    Quelle est l'utilité de dupliquer tes données ainsi ?

  14. #14
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    Et bien l'utilité est d'inserer dans une base de données des exemplaires de livres. C'est la commande INSERT INTO qui recupere toutes les valeurs des exemplaires et les insere dans la table de destination.

    Tu crois que c'est faisable alors d'imbriquer ces 2 sql?

  15. #15
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Tu ne m'as pas compris. Tes données sont déjà présentes dans la base de données, pas la peine d'aller les récupérer pour les insérer par copie dans une nouvelle table, non ?

    Bien sûr que c'est faisable mais est-ce vraiment utile ?

  16. #16
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    Ha ok,
    oui c'est util car seuls les biblionumber existe deja, les autres infos sont chargées via un csv dans une autre table et il faut les joindres pour creer les exemplaires.

  17. #17
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Ok, si tu as des cases à cocher dans ton interface, tu récupères un tableau de issn. Donc $lista doit correspondre à un implode() de ce tableau.

    Le mieux serait je crois que tu postes le code entier de ce traitement parce que c'est assez obscure de mon côté.

  18. #18
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    Bonjour

    je te passe ici les infos, et je joins les 2 fichiers aussi.

    fichier avec les check box:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $sql=requete qui recupere des issn;
    $row['issn'];
     
    //Bucle qui genere les check box
    <?php
    while($row = mysql_fetch_array($result, MYSQL_ASSOC)){
    	$id = $row['id_inc'];
    	echo "<tr>
    	<td class='checkbox'><input type='checkbox' name='carga[]' value='".$row['issn']."' id='".$row['issn']."' /><label for='".$row['issn']."'><span class='ui-icon ui-icon-check'></span></label></td>
    }
    Le while se trouve dans un formulaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <form name="form1" action="carga_issn.php" method="post">
    //Dans l'autre fichier carga_issn.php je recupere les valeurs de carga[]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //recupera la lista como array desde el valor "name" del checkbox
     $lista = "'". implode("' , '",$_POST['carga']) ."'";
    // et la je fais mes 2 select
    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
     $sql="select distinct(biblionumber) from biblioitems where biblionumber in(select biblionumber from issn_master where issn1 in($lista)or issn2 in($lista) or issnL in ($lista))";
     $qry = mysql_query($sql);
     
     $sql1="select embargo,fondo,tipo_fondo from stage1 where grupo='".$grupo."' and issn in(select issn1 from issn_master where issn1 in($lista)) or issn in(select issn2 from issn_master where issn2 in($lista));";
     $qry1 = mysql_query($sql1);
     
     $data = array();
     while ($row = mysql_fetch_assoc($qry)) {
            $data[] = $row['biblionumber']."\n";
     }
     
     $bib = implode("\n", $data);
     
     while($row1 = mysql_fetch_assoc($qry1)) {
            $inc++;
            $sql_item= "insert into items (biblionumber,biblioitemnumber,itype,enumchron,booksellerid,itemcallnumber,barcode,homebranch,holdingbranch,notforloan,damaged,itemlost,wthdrawn,timestamp)values('".$bib."','".$bib."','".$row1[tipo]."','".$row1[fondo]."','".$row1[embargo]."','".$grupo."-".$inc.$row1['type']."-".$bib."','".$grupo."-".$inc.$row1['type']."-".$bib."','".$grupo."','".$grupo."',0,0,0,0,'".$date."')";
    		echo $sql_item;
     
            //$result_items=mysql_query($sql_item);
     
            //if (!$result_items) {
            //      die('Invalid query: ' . mysql_error());
            //}
     }
    La table biblioitems et stage1 sont imposible a joindre car y'a aucun champ en commun.
    C'est pourquoi je dois faire les 2 requête et les associer pour creer l'INSERT

    // Le resultat actuel est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     insert into items (biblionumber,biblioitemnumber,itype,enumchron,booksellerid,itemcallnumber,barcode,
     homebranch,holdingbranch,notforloan,damaged,itemlost,wthdrawn,timestamp)
     values('23757 68314 ','23757 68314 ','','2001-','','MHUPA-1-23757 68314 ','MHUPA-1-23757 68314 ','MHUPA','MHUPA',0,0,0,0,'')
     
     insert into items (biblionumber,biblioitemnumber,itype,enumchron,booksellerid,itemcallnumber,barcode,
     homebranch,holdingbranch,notforloan,damaged,itemlost,wthdrawn,timestamp)
     values('23757 68314 ','23757 68314 ','','1996-','','MHUPA-2-23757 68314 ','MHUPA-2-23757 68314 ','MHUPA','MHUPA',0,0,0,0,'')
    // Le resultat souhaité est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     insert into items (biblionumber,biblioitemnumber,itype,enumchron,booksellerid,itemcallnumber,barcode,
     homebranch,holdingbranch,notforloan,damaged,itemlost,wthdrawn,timestamp)
     values('23757','23757','','2001-','','MHUPA-1-23757','MHUPA-1-23757','MHUPA','MHUPA',0,0,0,0,'')
     
     insert into items (biblionumber,biblioitemnumber,itype,enumchron,booksellerid,itemcallnumber,barcode,
     homebranch,holdingbranch,notforloan,damaged,itemlost,wthdrawn,timestamp)
     values('68314','68314 ','','1996-','','MHUPA-2-68314 ','MHUPA-2-68314 ','MHUPA','MHUPA',0,0,0,0,'')
    Fichiers attachés Fichiers attachés

  19. #19
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    Bonjour,

    tu vois en faisant ceci avec un foreach dans le while:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while($row1 = mysql_fetch_assoc($qry1)) {
            foreach ($data as $bib){
            $inc++;
            $sql_item= "insert into items (biblionumber,biblioitemnumber,itype,enumchron,booksellerid,itemcallnumber,barcode,homebranch,holdingbranch,notforloan,damaged,itemlost,wthdrawn,timestamp)values('".$bib."','".$bib."','".$row1[tipo]."','".$row1[fondo]."','".$row1[embargo]."','".$grupo."-".$inc.$row1['type']."-".$bib."','".$grupo."-".$inc.$row1['type']."-".$bib."','".$grupo."','".$grupo."',0,0,0,0,'".$date."')";
            echo $sql_item;
            }
     }
    J'arrive presque au resultat:
    La les biblionumber sont correctes mais quelque chose a dupliquer la quantité de INSERT, il devrait y en avoir que 2 et la y'en a 4

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into items (biblionumber,biblioitemnumber,itype,enumchron,booksellerid,itemcallnumber,barcode,homebranch,holdingbranch,notforloan,damaged,itemlost,wthdrawn,timestamp)values('23757 ','23757 ','','2001-','','MHUPA-1-23757 ','MHUPA-1-23757 ','MHUPA','MHUPA',0,0,0,0,'')insert into items (biblionumber,biblioitemnumber,itype,enumchron,booksellerid,itemcallnumber,barcode,homebranch,holdingbranch,notforloan,damaged,itemlost,wthdrawn,timestamp)values('68314 ','68314 ','','2001-','','MHUPA-2-68314 ','MHUPA-2-68314 ','MHUPA','MHUPA',0,0,0,0,'')insert into items (biblionumber,biblioitemnumber,itype,enumchron,booksellerid,itemcallnumber,barcode,homebranch,holdingbranch,notforloan,damaged,itemlost,wthdrawn,timestamp)values('23757 ','23757 ','','1996-','','MHUPA-3-23757 ','MHUPA-3-23757 ','MHUPA','MHUPA',0,0,0,0,'')insert into items (biblionumber,biblioitemnumber,itype,enumchron,booksellerid,itemcallnumber,barcode,homebranch,holdingbranch,notforloan,damaged,itemlost,wthdrawn,timestamp)values('68314 ','68314 ','','1996-','','MHUPA-4-68314 ','MHUPA-4-68314 ','MHUPA','MHUPA',0,0,0,0,'')

    Je passe aussi le resulta des 2 requêtes pour voir les données:

    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
    mysql> select distinct(biblionumber) from biblioitems where biblionumber in(select biblionumber from issn_master where issn1 in('1873-5150' , '1558-299X')or issn2 in('1873-5150' , '1558-299X') or issnL in ('1873-5150' , '1558-299X'));
    +--------------+
    | biblionumber |
    +--------------+
    |        23757 |
    |        68314 |
    +--------------+
    2 rows in set (2.14 sec)
     
    mysql> select embargo,fondo,tipo_fondo from stage1 where grupo='MHUPA' and issn in(select issn1 from issn_master where issn1 in('1873-5150' , '1558-299X')) or issn in(select issn2 from issn_master where issn2 in('1873-5150' , '1558-299X'));
    +---------+-------+------------+
    | embargo | fondo | tipo_fondo |
    +---------+-------+------------+
    |         | 2001- | EJNL       |
    |         | 1996- | EJNL       |
    +---------+-------+------------+

  20. #20
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    y a toujours un truc qui ne passe pas :
    comment avec ton code tu peux lier un biblionumber à un enregistrement de ta table stage1 ?
    Les éléments ne se croisent pas. Tout ce que tu fait c'est des filtres avec des IN. Le IN compare les valeurs à une liste donc j'en reviens toujours à la même question comment tu peux dire que le 1er $bib saisi correspond au 1er enregistrement de ta liste en provenance de stage1 ?

    J'ai repris ton code de manière plus lisible :
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    $sql =
    <<<SQL
    SELECT DISTINCT
        biblionumber
    FROM
        issn_master
    WHERE
        issn1 IN ({$lista})
        OR issn2 IN ({$lista})
        OR issnL IN ({$lista})
    SQL;
        $qry = mysql_query($sql);
     
        $sql =
    <<<SQL
    SELECT
        embargo,
        fondo,
        tipo_fondo
    FROM
        stage1
    WHERE
        grupo ='{$grupo}'
        AND (
            issn IN (
                SELECT
                    issn1
                FROM
                    issn_master
                WHERE
                    issn1 IN ({$lista})
            )
            OR issn IN (
                SELECT
                    issn2
                FROM
                    issn_master
                WHERE
                    issn2 IN ({$lista})
            )
        )
    SQL;
        $qry1 = mysql_query($sql);
    Tu devrais revoir la gestion des ISSN parce qu'avoir des colonnes ISSN ISSN1 ISSN2 ISSNL ça facilite pas les choses.
    J'aurais mis une colonne unique ISSN et à côté le type

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Boucle while imbriqué, problème de renvoi de valeur
    Par biche1 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/09/2008, 17h09
  2. Boucle while imbriquées
    Par quentincabo dans le forum VB.NET
    Réponses: 14
    Dernier message: 04/04/2008, 11h29
  3. problème d'execution de 2 boucles while imbriquées
    Par missyos dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 17/03/2008, 14h01
  4. [MySQL] Boucle while imbriqué
    Par agbononamour dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 31/05/2007, 18h09
  5. [Tableaux] Boucle while imbriquer
    Par Le-Cortex dans le forum Langage
    Réponses: 11
    Dernier message: 09/09/2005, 14h22

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