Partage
  • Partager sur Facebook
  • Partager sur Twitter

Jointure entre deux tables

Sujet résolu
    18 octobre 2011 à 11:51:42

    Bonjour les Zéros.

    J'ai un petit problème, je n'arrive pas lors de l'ajout d'un client dans ma table "client",
    a faire le lien entre ma table "client" et ma table "client_type"

    Lors de l'ajout, j'introduis mes données client ( nom_client, adresse_client, tel_client ,..., et id_type_client)
    La table "client_type" ( id_client_type , nom_client_type)
    Donc j'aurai dans mes deux tables le champ "id_type_client"

    SELECT client.id_client_type, client_type.id_client_type
         FROM client_type
         INNER JOIN client
         ON client_type.id_client_type = client.id_client_type
    


    Puis lors de l'ajout sa fonctionne bien
    INSERT INTO client (nom_client,id_client_type,...)
         VALUES (:nom_client,:id_client_type,:...'
    

    Mais il ne me reconnait pas l'id_client_type il n'indique 0

    Quel est mon soucis.

    Merci d'avance
    • Partager sur Facebook
    • Partager sur Twitter
      18 octobre 2011 à 12:11:55

      Je t'avoue que c'est pas très clair ton soucis ....
      • Partager sur Facebook
      • Partager sur Twitter
        18 octobre 2011 à 12:12:17

        SELECT client.id_client_type, client_type.id_client_type
             FROM client_type
             INNER JOIN client
             ON client_type.id_client_type = client.id_client_type;
        SELECT @last:=LAST_INSERT_ID();
        INSERT INTO client (nom_client,id_client_type,...)
             VALUES (:nom_client,@last,:...'
        


        le @last est une variable qui contient le résultat de la fonction native LAST_INSERT_ID()

        Je pense que le nom de la fonction est assez explicite pour se passer de l'expliquer

        Il ne reste qu'a passer @last a la place de id_client_type
        • Partager sur Facebook
        • Partager sur Twitter
        Never Trust User Input This is the truth
          18 octobre 2011 à 13:41:14

          Ce que je veux, c'est faire le lien de ma table "client" avec la table "client_type" pour ne pas créer deux fois le type de client.

          Donc dans un premier temps, j'affiche un formulaire pour encoder les données client et un "select" pour aller chercher les type client existant.
          Puis quand je les ajoute avec le "INSERT INTO" j'aimerai bien qu'il introduise dans la table l'id du type client
          pour ne pas qu'il soit en double.

          OK merci mais le @last affichera le dernier id et non celui du type de client que j'ai selectionné.

          Je vais encore essayé avec le last si c'est la bonne solution
          • Partager sur Facebook
          • Partager sur Twitter
            18 octobre 2011 à 14:03:19

            Ok autant pour moi j'ai répondu un peu vite...

            Je suis rentré plus en profondeur sur le sujet et je me pose une question

            SELECT client.id_client_type, client_type.id_client_type
                 FROM client_type
                 INNER JOIN client
                 ON client_type.id_client_type = client.id_client_type
            


            ça sert a quoi ça ?

            Si je le transpose de manière littérale ça donne

            Je sélectionne deux fois le même champs dans deux tables différentes si les deux champs de ces deux tables sont égaux

            je suis a peu prés sûr que la requête suivante retourne les même résultats

            SELECT id_client_type FROM client_type
            


            Ensuite si l'insertion se passe mal sur ton insert into c'est que la variable $id_client_type (ou peu importe comme tu la nomme dans ton php) ne contient pas ce que tu attend (ou même ne contient rien du tout)
            • Partager sur Facebook
            • Partager sur Twitter
            Never Trust User Input This is the truth
              18 octobre 2011 à 15:43:55

              Effectivement sa donne le même résultat xD

              Donc une jointure de table ne sert pas à avoir de doublon entre deux tables?
              J'ai beau relire la théorie des jointure c'est pas facile a comprendre.

              Je suis arrivé à l'inserer et sa me donne bien l'id_type de la table type mais lorsque que je vais l'afficher et il va me mettre le numéro de l'id et non le nom du type? a mon avis..

              Complexe le php ^^
              • Partager sur Facebook
              • Partager sur Twitter
                18 octobre 2011 à 15:48:57

                Balance la requête qui te sert a récupérer les donnée a afficher ainsi que la structure de tes deux tables s'il te plait !!!
                • Partager sur Facebook
                • Partager sur Twitter
                Never Trust User Input This is the truth
                  18 octobre 2011 à 17:05:26

                  id_client_type client_type
                  1 carriere
                  2 aeronautique


                  id_client nom_client adresse_client cp_client id_type_client tva_client tel_client fax_client gsm_client
                  - - - - - - - - -


                  <?php
                  try
                  {
                  	$db = new PDO('mysql:host=localhost;dbname=lardigest', 'root', '');
                  }
                  // je défini tous les champs..
                  $nom_client    = isset($_POST['nom_client'])    ? trim($_POST['nom_client'])    : "";
                  //...
                  
                  query=$db->prepare('SELECT test_client.id_client_type, client_type.id_client_type
                  		FROM client_type
                  		INNER JOIN test_client
                  		ON client_type.id_client_type = test_client.id_client_type
                  		');
                  //SELECT à revoir alors			
                  $query->bindValue(':id_client_type',$id_client_type);
                  $query->execute();
                  
                  //Quelques vérifs
                  ?>
                  
                  <!-- Debut du formulaire -->
                  <SELECT name="id_client_type">	
                  	<OPTION VALUE="" name=""></OPTION>
                  	<?php
                  		try
                  			{
                  				// On se connecte à MySQL
                  				$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
                  				$bdd = new PDO('mysql:host=localhost;dbname=sonaclardi', 'root', '', $pdo_options);							
                  				// On récupère le contenu de la table vehicule
                  				$reponse = $bdd->query('SELECT client_type FROM client_type ORDER BY client_type');
                  				 
                  				// On affiche chaque entrée une à une
                  				while ($donnees = $reponse->fetch())
                  			{
                  	?>				
                  	<OPTION value="<?php echo $donnees['id_client_type']; ?>" name="id_client_type"><?php echo $donnees['client_type']; ?></OPTION>
                  	<?php
                  		}					
                  		$reponse->closeCursor(); // Termine le traitement de la requête					
                  		}
                  		catch(Exception $e)
                  		{
                  			// En cas d'erreur précédemment, on affiche un message et on arrête tout
                  			die('Erreur : '.$e->getMessage());
                  		}	
                  	?>
                  </SELECT>
                  <?php
                  $query=$db->prepare('INSERT INTO test_client (nom_client,id_client_type,adresse_client,cp_client,tva_client,tel_client,gsm_client,fax_client) 
                  					VALUES (:nom_client,:id_client_type,:adresse_client,:cp_client,:tva_client,:tel_client,:gsm_client,:fax_client)');
                  $query->bindValue(':nom_client', $nom_client, PDO::PARAM_INT);
                  //....
                  $query->execute(); // execute error
                  $_SESSION['nom_client'] = $nom_client;
                  //....
                  $_SESSION['id_client_free'] = $db->lastInsertId(); 
                  $query->CloseCursor();								
                  header('Location: clients.php');
                  ?>
                  


                  Voila un gros résumer si tu t'y retrouve pas pas grave je ferai des doublons

                  Merci
                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 octobre 2011 à 17:30:10

                    SELECT client.* , client_type.client_type
                         FROM client
                         JOIN client_type
                         ON client_type.id_client_type = client.id_client_type
                    


                    Ceci te renverra toutes les info client de TOUT les client + le label de ton client type en fonction du client


                    Si tu veux le limiter a un seul client
                    WHERE client.id_client = 'id_dun_client'
                    

                    si tu veux le limiter a un seul type
                    WHERE client.id_client_type = 'id_dun_type_client'
                    
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Never Trust User Input This is the truth
                      19 octobre 2011 à 18:08:24

                      L'insertion fonctionne mtn.

                      L'affichage avec ce que tu me dit sa me mets
                      <?php
                      Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in C:\WampServer\www\SonacLardi\contenu-php\clients.php on line 168
                      ?>
                      

                      Ligne 168 c'est celle avec le while. Donc il y a juste encore une petite faute quelques part puis sa devrais être correcte.

                      <?php
                      $retour_messages=mysql_query('SELECT client.* , client_type.id_client_type
                      			FROM client
                      			ON test_client.id_client_type = client_type.id_client_type
                      			ORDER BY nom_client															LIMIT '.$premiereEntree.', '.$messagesParPage.'');
                      while($donnees_messages=mysql_fetch_assoc($retour_messages))
                      ?>
                      
                      • Partager sur Facebook
                      • Partager sur Twitter
                        19 octobre 2011 à 18:46:51

                        mysql_query retourne une ressource ou false en cas d'erreur.

                        mysql_fetch_assoc n'accepte pas les boolean et "false" est un boolean

                        controle avant de faire le mysql_fetch_assoc que ton resultat est !== false

                        if ($retour_messages !== false) {
                        while(...blabla)
                        }
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Never Trust User Input This is the truth
                          19 octobre 2011 à 22:00:59

                          Il ne retourne aucune erreur mais n'affiche quand meme aucun resultat.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            20 octobre 2011 à 9:10:39

                            <?php
                            $retour_messages=mysql_query('SELECT client.* , client_type.id_client_type
                            			FROM client
                            			ON test_client.id_client_type = client_type.id_client_type
                            		        ORDER BY nom_client					
                                                    LIMIT '.$premiereEntree.','.$messagesParPage) or die('Une erreur est survenue a l’exécution de la requête');
                            


                            change ta requete par celle la
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Never Trust User Input This is the truth
                              20 octobre 2011 à 18:32:02

                              La il m'affiche ton message "Une erreur est survenue a l’exécution de la requête"
                              • Partager sur Facebook
                              • Partager sur Twitter
                                21 octobre 2011 à 8:56:38

                                ça signifie que la requête est foireuse !!!

                                essaye de l’exécuter directement dans ta base de donnée

                                et essaye aussi un var_dump() de la requête dans ton php
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Never Trust User Input This is the truth
                                  21 octobre 2011 à 19:54:24

                                  C'est une erreur dans la requete de jointure.
                                  Quand je fait
                                  <?php
                                  $retour_messages=mysql_query('SELECT *
                                  			FROM client, client_type
                                  			ORDER BY nom_client	LIMIT '.$premiereEntree.', '.$messagesParPage.'');
                                  while($donnees_messages=mysql_fetch_assoc($retour_messages))
                                  ?>
                                  

                                  La il m'affiche bien mon client ( le seul pour le moment )
                                  Mais il me l'affiche deux fois car j'ai deux type de client
                                  Il m'affiche
                                  nom_client adresse_client cp_client type_client tva_client tel_client fax_client gsm_client
                                  Dorian Wierde 5100 dessinateur BE0... 081 0473 081..
                                  Dorian Wierde 5100 ouvrier BE0... 081 0473 081..

                                  Faut que j'arrive a comprendre comment fonctionne les jointures dans leur totalité parce que par la suite j'en aurai encore besoin.

                                  En tout cas merci de m'aider c'est fort aimable :)
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    21 octobre 2011 à 21:47:47

                                    Ta requête fait exactement ce que tu lui demandes. Quel est le problème ?

                                    Je constate par ailleurs que tu as de la difficulté à séparer les concepts. Si tu postes dans ce forum, ça veut dire que tu ne devrais pas poster de code PHP quelconque. Le PHP n'a rien à voir avec les bases de données et vice versa.
                                    Attarde-toi d'abord à trouver une requête fonctionnelle, qui répond à tes besoins. Tu penseras à l'implémentation en PHP plus tard, ce n'est pas le moment.

                                    Avant même d'écrire tes requêtes, pose le problème. Quelles sont les tables qui sont en jeu ? Quel est le résultat que tu souhaites obtenir ? Choisis un jeu d'essai, et détermine en fonction de ce jeu d'essai quel résultat ta requête devrait retourner en fonction de ce jeu d'essai. Puis, teste cette requête sur ta vraie table, et vérifie que tout fonctionne.

                                    Une fois ceci fait, tu peux ensuite l'implémenter en PHP. Si tu rencontres des problèmes à cette étape, c'est sur le forum PHP où tu devras te diriger.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      24 octobre 2011 à 9:27:50

                                      Un petit indice : il manque une clause WHERE a ta requête pour arriver au comportement que tu souhaite
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Never Trust User Input This is the truth
                                        21 novembre 2011 à 19:36:14

                                        Merci à toi Hani.

                                        J'ai revu mon cours et suivit tes conseils Fayden.

                                        J'ai réussi et j'ai cherché un peu trop loin je crois.

                                        SELECT *
                                        FROM client, client_type
                                        WHERE client.id_client_type = client_type.id_client_type

                                        et sa m'affiche correcte le type de client pour le client voulu ^^

                                        Je cloture merci :)
                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        Jointure entre deux tables

                                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                        • Editeur
                                        • Markdown