PHP/MySql: requete sur plusieurs tables

Le code suivant ne genere aucune erreur.

1- Je fais une requete sur 2 tables; chacune des tables contient un champ "matricule". Il me
semble qu'il y'a une confusion a l'affichage du matricule. Comment puis preciser le matricule
que je voudrai afficher en fonction de la table qui le contient?

2- J'affiche ensuite les enregistrements sous forme de tableau: le tableau est affiche 4 fois
de suite; je ne sais pourquoi.

Merci a ceux qui voudront bien m'aider.

<?php // ligne 1
{

$host = "localhost"; // ligne 4
$user = "root"; // ligne 5
$passwd = ""; // ligne 6
$dataB = "annuaireUo"; //ligne 7: chemin de la base de donnees
// ligne 8
$connBD = mysql_connect ($host, $user, $passwd); //ligne 9: connection au serveur MySql or die("Erreur de connection ".mysql_error())

mysql_select_db ($dataB, $connBD); // ligne 11: connection a la BD or die("Erreur de selection ".mysql_error())
$InsertionPersonnel = "insert into personnel (matricule, nom, prenom, sexe, profession, email, adresse, telDomicile, telMobile, grade ) VALUES ('".$_POST['matricule']."', '".$_POST['nom']."', '".$_POST['prenom']."', '".$_POST['sexe']."', '".$_POST['profession']."', '".$_POST['email']."', '".$_POST['adresse']."', '".$_POST['telDomicile']."', '".$_POST['telMobile']."', '".$_POST['grade']."')"; // insertion des donnes dans la BD personnel

$varcodePoste = $_POST['matricule'].$_POST['telPoste'];
$InsertionPosteTravail = "insert into postedetravail (codePoste, telPoste, codeService, matricule) values ('".$varcodePoste."', '".$_POST['telPoste']."', '".$_POST['codeServ']."', '".$_POST['matricule']."')"; // insertion des donnes dans la BD poste de travail

mysql_query ($InsertionPersonnel);
mysql_query ($InsertionPosteTravail);
//mysql_close(); // ligne 19
}
//////////////////////////////////////// affichage des enregistrements dans un tableau ////////////////////////////////

//$requete = "select * from personnel"; //selection de tous les enregistrements de la table personnel
//$sql_query2 = "select * from postedetravail"; //selection de tous les enregistrements de la table postedetravail ligne 24

$requete ="select
personnel.matricule,
personnel.grade,
personnel.nom,
personnel.prenom,
personnel.sexe,
personnel.profession,
personnel.email,
personnel.telDomicile,
personnel.telMobile,
postedetravail.codePoste,
postedetravail.telPoste,
postedetravail.codeService,
postedetravail.matricule

from personnel, postedetravail";

$result = mysql_query($requete); //ligne 42

//<!--<table> -->// ligne 44
echo "<table border = '1' bordercolor = '#000080'>";
echo '<tr>
<td><b>Matricule</b></td>
<td><b>Grade</b></td>
<td><b>Nom</b></td>
<td><b>Prenom</b></td>
<td><b>Sexe</b></td>
<td><b>Profession</b></td>
<td><b>E-mail</b></td>
<td><b>Téléphone dom</b></td>
<td><b>Téléphone mob</b></td>
<td><b>CodePoste</b></td>
</tr>';
$i=0;
While($row=mysql_fetch_array($result)) //ligne 59
{
if ($i%2==0)
$couleur='#dfdfdf';
else
$couleur='#ebebeb';
$i++; //ligne 65
echo'
<tr>
<td bgcolor="'.$couleur.'">'.$row['matricule'].' </td>
<td bgcolor="'.$couleur.'">'.$row['grade'].' </td>
<td bgcolor="'.$couleur.'">'.$row['nom'].'</td>
<td bgcolor="'.$couleur.'">'.$row['prenom'].' </td>
<td bgcolor="'.$couleur.'">'.$row['sexe'].'</td>
<td bgcolor="'.$couleur.'">'.$row['profession'].'</td>
<td bgcolor="'.$couleur.'">'.$row['email'].'</td>
<td bgcolor="'.$couleur.'">'.$row['telDomicile'].'</td>
<td bgcolor="'.$couleur.'">'.$row['telMobile'].'</td>
<td bgcolor="'.$couleur.'">'.$row['codePoste'].'</td>
</tr>';
}
echo "</table>";
mysql_close(); //ligne 81
?>

13 réponses

  1. Bonjour,

    merci pour tous vos conseils, que j'ai applique. Maintenant, le code ne genere aucune erreur;
    toutefois, il ne produit pas le resultat escompte: l'affichage des enregistrements.

    Pouvez-vous s'il vous plait me dire pourquoi, et comment puis je resoudre ce probleme?

    ======

    <?php // ligne 1
    {

    $host = "localhost"; // ligne 4
    $user = "root"; // ligne 5
    $passwd = ""; // ligne 6
    $dataB = "annuaireUo"; //ligne 7: chemin de la base de donnees
    // ligne 8
    $connBD = mysql_connect ($host, $user, $passwd); //ligne 9: connection au serveur MySql or die("Erreur de connection ".mysql_error())

    mysql_select_db ($dataB, $connBD); // ligne 11: connection a la BD or die("Erreur de selection ".mysql_error())
    $InsertionPersonnel = "insert into personnel (matricule, nom, prenom, sexe, profession, email, adresse, telDomicile, telMobile, grade) VALUES ('".$_POST['matricule']."', '".$_POST['nom']."', '".$_POST['prenom']."', '".$_POST['sexe']."', '".$_POST['profession']."', '".$_POST['email']."', '".$_POST['adresse']."', '".$_POST['telDomicile']."', '".$_POST['telMobile']."', '".$_POST['grade']."')"; // insertion des donnes dans la BD personnel

    $varcodePoste = $_POST['matricule'].$_POST['telPoste']; //concatenation du matricule et du num de tel du poste de travail

    $InsertionPosteTravail = "insert into postedetravail (codePoste, telPoste, codeService, matricule) values ('".$varcodePoste."', '".$_POST['telPoste']."', '".$_POST['codeServ']."', '".$_POST['matricule']."')"; // insertion des donnes dans la BD poste de travail

    $InsertionDirection = "insert into direction (codeDir, nomDir) values ('".$_POST['codeDir']."', '".$_POST['nomDir']."')"; // insertion des donnes dans la BD direction ligne 18
    $InsertionService = "insert into service (codeService, nomService, codeDir, matricule) values ('".$_POST['codeServ']."', '".$_POST['nomServ']."', '".$_POST['matricule']."')"; // insertion des donnes dans la BD direction

    mysql_query ($InsertionPersonnel);
    mysql_query ($InsertionPosteTravail);
    mysql_query ($InsertionDirection);
    mysql_query ($InsertionService);

    //mysql_close(); // ligne 26
    }
    //////////////////////////////////////// affichage des enregistrements dans un tableau ////////////////////////////////

    //$requete = "select * from personnel"; //selection de tous les enregistrements de la table personnel
    //$sql_query2 = "select * from postedetravail"; //selection de tous les enregistrements de la table postedetravail ligne 31

    $requete ="SELECT
    personnel.matricule,
    personnel.grade,
    personnel.nom,
    personnel.prenom,
    personnel.sexe,
    personnel.profession,
    personnel.email,
    personnel.telDomicile,
    personnel.telMobile,
    postedetravail.codePoste,
    postedetravail.telPoste,
    postedetravail.codeService,
    postedetravail.matricule,
    direction.nomDir,
    service.nomService

    FROM personnel

    INNER JOIN postedetravail ON postedetravail.matricule = personnel.matricule
    INNER JOIN service ON service.codeService = postedetravail.codeService
    INNER JOIN direction ON direction.codeDir = service.codeDir";

    $result = mysql_query($requete) or die (mysql_error()); //ligne 56

    //<!--<table> -->// ligne 58
    echo "<table border = '1' bordercolor = '#000080'>";
    echo '<tr>
    <td><b>Matricule</b></td>
    <td><b>Grade</b></td>
    <td><b>Nom</b></td>
    <td><b>Prenom</b></td>
    <td><b>Sexe</b></td>
    <td><b>Profession</b></td>
    <td><b>E-mail</b></td>
    <td><b>Téléphone dom</b></td>
    <td><b>Téléphone mob</b></td>
    <td><b>CodePoste</b></td>
    <td><b>Direction</b></td>
    <td><b>Service</b></td>
    </tr>';
    $i=0;
    While($row=mysql_fetch_array($result)) //ligne 73
    {
    if ($i%2==0)
    $couleur='#dfdfdf';
    else
    $couleur='#ebebeb';
    $i++; //ligne 79
    echo'
    <tr>
    <td bgcolor="'.$couleur.'">'.$row['matricule'].' </td>
    <td bgcolor="'.$couleur.'">'.$row['grade'].' </td>
    <td bgcolor="'.$couleur.'">'.$row['nom'].'</td>
    <td bgcolor="'.$couleur.'">'.$row['prenom'].' </td>
    <td bgcolor="'.$couleur.'">'.$row['sexe'].'</td>
    <td bgcolor="'.$couleur.'">'.$row['profession'].'</td>
    <td bgcolor="'.$couleur.'">'.$row['email'].'</td>
    <td bgcolor="'.$couleur.'">'.$row['telDomicile'].'</td>
    <td bgcolor="'.$couleur.'">'.$row['telMobile'].'</td>
    <td bgcolor="'.$couleur.'">'.$row['codePoste'].'</td>
    <td bgcolor="'.$couleur.'">'.$row['nomDir'].'</td>
    <td bgcolor="'.$couleur.'">'.$row['nomService'].'</td>
    </tr>';
    }
    echo "</table>";
    //mysql_free_result($result);
    mysql_close(); //ligne 96
    ?>
    1. Bonjour,

      je voudrais effectuer une requete sur 4 tables, et voudrai afficher le resultat de la
      requete dans un seul tableaux.

      J'ai pu realiser une jointure avec 2 tables, mais ait des problemes pour realiser une
      jointure entre 4 differentes tables.

      Mes tables

      table personnel(matricule varchar (10) not null,
      nom varchar (30) not null,
      prenom varchar (30) not null,
      sexe varchar (30) not null,
      profession varchar (40) not null,
      email varchar (20) not null,
      adresse varchar (40),
      telDomicile varchar (16),
      telPhoto varchar (16),
      grade varchar (20), primary key(matricule))

      table postedetravail(codePoste varchar(10),
      telPoste varchar(10),
      codeService varchar(10),
      matricule(5),
      primary key (codePoste))

      table direction (codeDir varchar (10) not null,
      nomDir varchar (50) primary key (codeDir))

      table service (codeService varchar (10) not null,
      nomService varchar (50) not null,
      codeDir varchar (10),
      primary key (codeService))

      mon code

      <?php // ligne 1
      {

      $host = "localhost"; // ligne 4
      $user = "root"; // ligne 5
      $passwd = ""; // ligne 6
      $dataB = "annuaireUo"; //ligne 7: chemin de la base de donnees
      // ligne 8
      $connBD = mysql_connect ($host, $user, $passwd); //ligne 9: connection au serveur MySql or die("Erreur de connection ".mysql_error())

      mysql_select_db ($dataB, $connBD); // ligne 11: connection a la BD or die("Erreur de selection ".mysql_error())
      $InsertionPersonnel = "insert into personnel (matricule, nom, prenom, sexe, profession, email, adresse, telDomicile, telMobile, grade ) VALUES ('".$_POST['matricule']."', '".$_POST['nom']."', '".$_POST['prenom']."', '".$_POST['sexe']."', '".$_POST['profession']."', '".$_POST['email']."', '".$_POST['adresse']."', '".$_POST['telDomicile']."', '".$_POST['telMobile']."', '".$_POST['grade']."')"; // insertion des donnes dans la BD personnel

      $varcodePoste = $_POST['matricule'].$_POST['telPoste'];
      $InsertionPosteTravail = "insert into postedetravail (codePoste, telPoste, codeService, matricule) values ('".$varcodePoste."', '".$_POST['telPoste']."', '".$_POST['codeServ']."', '".$_POST['matricule']."')"; // insertion des donnes dans la BD poste de travail

      $InsertionDirection = "insert into direction (codedir, nomdir) values ('".$_POST['codeDir']."', '".$_POST['nomDir']."')"; // insertion des donnes dans la BD direction
      $InsertionService = "insert into service (codeService, nomService, codeDir, matricule) values ('".$_POST['codeServ']."', '".$_POST['nomServ']."', '".$_POST['matricule']."')"; // insertion des donnes dans la BD direction

      mysql_query ($InsertionPersonnel);
      mysql_query ($InsertionPosteTravail);
      mysql_query ($InsertionDirection);
      mysql_query ($InsertionService);

      //mysql_close(); // ligne 19
      }
      //////////////////////////////////////// affichage des enregistrements dans un tableau ////////////////////////////////

      //$requete = "select * from personnel"; //selection de tous les enregistrements de la table personnel
      //$sql_query2 = "select * from postedetravail"; //selection de tous les enregistrements de la table postedetravail ligne 30

      $requete ="select
      personnel.matricule,
      personnel.grade,
      personnel.nom,
      personnel.prenom,
      personnel.sexe,
      personnel.profession,
      personnel.email,
      personnel.telDomicile,
      personnel.telMobile,
      postedetravail.codePoste,
      postedetravail.telPoste,
      postedetravail.codeService,
      postedetravail.matricule
      direction.nomDir,
      service.nomService,

      from personnel, postedetravail, direction, service where postedetravail.matricule = personnel.matricule AND service.matricule = personnel.matricule AND direction.codeDir = service.codeDir";

      $result = mysql_query($requete); //ligne 51

      //<!--<table> -->// ligne 53
      echo "<table border = '1' bordercolor = '#000080'>";
      echo '<tr>
      <td><b>Matricule</b></td>
      <td><b>Grade</b></td>
      <td><b>Nom</b></td>
      <td><b>Prenom</b></td>
      <td><b>Sexe</b></td>
      <td><b>Profession</b></td>
      <td><b>E-mail</b></td>
      <td><b>Téléphone dom</b></td>
      <td><b>Téléphone mob</b></td>
      <td><b>CodePoste</b></td>
      </tr>';
      $i=0;
      While($row=mysql_fetch_array($result)) //ligne 68
      {
      if ($i%2==0)
      $couleur='#dfdfdf';
      else
      $couleur='#ebebeb';
      $i++; //ligne 74
      echo'
      <tr>
      <td bgcolor="'.$couleur.'">'.$row['matricule'].' </td>
      <td bgcolor="'.$couleur.'">'.$row['grade'].' </td>
      <td bgcolor="'.$couleur.'">'.$row['nom'].'</td>
      <td bgcolor="'.$couleur.'">'.$row['prenom'].' </td>
      <td bgcolor="'.$couleur.'">'.$row['sexe'].'</td>
      <td bgcolor="'.$couleur.'">'.$row['profession'].'</td>
      <td bgcolor="'.$couleur.'">'.$row['email'].'</td>
      <td bgcolor="'.$couleur.'">'.$row['telDomicile'].'</td>
      <td bgcolor="'.$couleur.'">'.$row['telMobile'].'</td>
      <td bgcolor="'.$couleur.'">'.$row['codePoste'].'</td>
      </tr>';
      }
      echo "</table>";
      mysql_close(); //ligne 91
      ?>
      1. Contributeur
        bonjour,

        d'apres moi pour 1 et 2 :

        from personnel, postedetravail";

        un peu avant la ligne 42

        ajoute where postedetravail.matricule = personnel.matricule

        JSS.j'ai.bon.la?
        1. L'exécution du code renvoie l'erreur suivante:

          Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in c:\program files\easyphp1-7\www\annuaireuo\enregbd11.php on line 71

          la ligne 71 est celle ci:

          While($row=mysql_fetch_array($result))

          ce qui signifie que l'erreur est générée par la requête qui se fait plus haut.
          1. Pour maximiser vos chances d'obtenir des réponses à votre message veuillez s'il vous plaît :
            Faire usage de formules de politesse (Bonjour, merci, SVP)

            Bonjour
            Prends l'habitude quand tu as ce message d'afficher la requête pour vérifier sa syntaxe et essaie là dans PhpMyAdmin.
            1. Bonjour
              $requete ="SELECT 
              personnel.matricule, personnel.grade, personnel.nom, personnel.prenom, 
              personnel.sexe, personnel.profession, personnel.email, personnel.telDomicile, personnel.telMobile, 
              postedetravail.codePoste, postedetravail.telPoste, postedetravail.codeService, postedetravail.matricule, 
              direction.nomDir, 
              service.nomService 
              FROM personnel, postedetravail, direction, service
              WHERE postedetravail.matricule = personnel.matricule 
              AND service.codeService = postedetravail.codeService 
              AND direction.codeDir = service.codeDir"; 
              C'est comme cela que je vois ta requête, d'après tes tables.
              Mais explique exactement ce que tu veux extraire de ta base.
              <td bgcolor="'.$couleur.'">'.$row[matricule].' </td> 
              <td bgcolor="'.$couleur.'">'.$row[grade].' </td> 
              <td bgcolor="'.$couleur.'">'.$row[nom].'</td> 
              <td bgcolor="'.$couleur.'">'.$row[prenom].' </td> 
              <td bgcolor="'.$couleur.'">'.$row[sexe].'</td> 
              <td bgcolor="'.$couleur.'">'.$row[profession].'</td> 
              <td bgcolor="'.$couleur.'">'.$row[email].'</td> 
              <td bgcolor="'.$couleur.'">'.$row[telDomicile].'</td> 
              <td bgcolor="'.$couleur.'">'.$row[telMobile].'</td> 
              <td bgcolor="'.$couleur.'">'.$row[codePoste].'</td> 
              <td bgcolor="'.$couleur.'">'.$row[nomDir].'</td> 
              <td bgcolor="'.$couleur.'">'.$row[nomService].'</td> 
              
              J'ai enlevé les quotes dans les variables $row.
              1. Bonjour,
                voici la structure de mes tables:

                table personnel
                (matricule varchar (5) not null,
                nom varchar (30) not null,
                prenom varchar (30) not null,
                sexe varchar (30) not null,
                profession varchar (40) not null,
                email varchar (20) not null,
                adresse varchar (40),
                telDomicile varchar (16),
                telMobile varchar (16),
                grade varchar (20), primary key(matricule))

                table postedetravail
                (codePoste varchar(10),
                telPoste varchar(10),
                codeService varchar(10),
                matricule(5),
                primary key (codePoste))

                table direction
                (codeDir varchar (10) not null,
                nomDir varchar (50) primary key (codeDir))

                table service
                (codeService varchar (10) not null,
                nomService varchar (50) not null,
                codeDir varchar (10),
                primary key (codeService))

                Je voudrais afficher dans le meme tableau,

                personnel.matricule, personnel.grade, personnel.nom, personnel.prenom, personnel.sexe, personnel.profession, personnel.email,
                personnel.adresse, personnel.telDomicile, personnel.Mobile,
                direction.nomDir,
                service.nomService,
                postedetravail.telPoste

                mais je n'y arrive pas depuis. Merci de votre aide.
                1. Salut
                  Essaie déjà cette requête
                  SELECT personnel.matricule, personnel.grade, personnel.nom, personnel.prenom, personnel.sexe, personnel.profession, personnel.email, personnel.telDomicile, personnel.telMobile, postedetravail.codePoste, postedetravail.telPoste, postedetravail.codeService, direction.nomDir, service.nomService 
                  FROM personnel, postedetravail, direction, service 
                  WHERE postedetravail.matricule = personnel.matricule 
                  AND service.codeService = postedetravail.codeService 
                  AND direction.codeDir = service.codeDir;
                  
                  et affiche la simplement
                  echo "<tr><td>$row[matricule]</td>
                  <td>$row[grade]</td>
                  <td>$row[nom]</td>
                  <td>$row[prenom]</td>
                  <td>$row[sexe]</td>
                  <td>$row[profession]</td>
                  <td>$row[email]</td>
                  <td>$row[telDomicile]</td>
                  <td>$row[telMobile]</td>
                  <td>$row[codePoste]</td>
                  <td>$row[nomDir]</td>
                  <td>$row[nomService]</td></tr>
                  
                  Quand cela marchera, tu pourras mettre l'habillage
                  1. moi aussi j'ai une probleme comme ça
                    aprés la remplissage de formulaire j'aurrai envies d'enregistrer dans une table
                    1. Je suppose que personnel.matricule est identique à postedetravail.matricule. Si oui, attention à la cohérence des types VARCHAR(10) et (5)
                      $requete ="SELECT
                      personnel.matricule,
                      personnel.grade,
                      personnel.nom,
                      personnel.prenom,
                      personnel.sexe,
                      personnel.profession,
                      personnel.email,
                      personnel.telDomicile,
                      personnel.telMobile,
                      postedetravail.codePoste,
                      postedetravail.telPoste,
                      postedetravail.codeService,
                      postedetravail.matricule ??? identique à personnel.matricule
                      direction.nomDir,
                      service.nomService,

                      FROM personnel, postedetravail, direction, service
                      WHERE personnel.matricule = postedetravail.matricule
                      AND service.matricule = personnel.matricule ??? service.matricule n'existe pas
                      AND service.codeService = postedetravail.codeService
                      AND direction.codeDir = service.codeDir"
                      ;
                      Utilise des MAJUSCULES, cela facilite le lecture.