Partage
  • Partager sur Facebook
  • Partager sur Twitter

Req SQL retourne plusieurs fois la même donnée

    31 mars 2020 à 11:41:11

    Tout est dans la titre, j'ai des requêtes SQL qui retournent 4 fois les mêmes données. 

    Étant débutant, et ma requête comportant une jointure, j'ai du me tromper quelque part mais je ne trouve pas mon erreur. Voici le code (J'ai mis la page entière, mais la requête qui pose problème est à partir de la ligne 93): 

    <!DOCTYPE HTML>
    <html>
    <head>
    	<meta charset="utf-8"/>
    	<link rel="stylesheet" href="css/bootstrap.css">
    	<link rel="stylesheet" href="css/kanji-sheet.css">
    	<title>  </title> 
    </head> 
    <body>
    <?php
    	
    	if(isset($_GET['id'])) {
    		
    		$idKanji = $_GET['id'];
    		
    		try
    		{
    			$database = new PDO('mysql:host=localhost;dbname=site-japon;charset=utf8', 'root', 'root');
    		}
    		catch (Exception $e)
    		{
    		        die('Erreur : ' . $e->getMessage());
    		}
    		
    		$requestKanji = $database->prepare("SELECT * FROM kanjis WHERE id = :id");
    		$requestKanji->execute(array(
    			":id" => $idKanji
    		));
    		
    		$returnKanji = $requestKanji->fetch();
    		
    		if($returnKanji){ 
    			
    			if($returnKanji['note_k'] == NULL) {
    				$note = "N/a";
    			} else {
    				$note = $returnKanji['note_k'];
    			}
    			
    			if($returnKanji['learned_k'] == 2) {
    				$class = "table-success";
    				
    			} elseif($returnKanji['learned_k'] == 1) {
    				$class = "table-warning";
    				
    			} else {
    				$class = "table-danger";
    			}
    ?>
    			<div id="body" class="container">
    				
    				<div class="row br">
    					<div class="col-md-12"> <strong class="sheet-kind">Fiche kanji</strong> </div>
    				</div>
    				
    				<div class="row"> 
    					<div class="col-md-6 col-sm-12"> <h1 id="h1"> <?php echo $returnKanji['kanji_k']; ?> </h1> </div>	
    					<div class="col-md-6 col-sm-12">
    						<div class="row justify-content-around">	
    							<div class="kanji-button jlpt col-md-5 col-sm-4"> JLPT : <?php echo $returnKanji['jlpt_level']; ?> </div>
    							<div class="kanji-button etat <?php echo $class; ?> col-md-8 col-sm-4"> 
    								<form method="post" action="change_learned_kanji.php"> 
    									État d'apprentissage :   
    									<input type="hidden" name="id" value="<?php echo $returnKanji['id']; ?>">
    									<select name="learned" required="#">
    										<option disabled selected>Choisir</option>
    										<option value="0">Pas appris</option>
    										<option value="1">En Cours</option>
    										<option value="2">Appris</option>
    									</select>
    									<input class="etat-button" type="submit" value="Valider">
    								</form>	
    							</div>
    						</div>
    						<div class="row">
    							<div class="line col-md-4 col-sm-4"> <strong class="return-data">Kun yomi :</strong> </div>
    							<div class="line col-md-8 col-sm-8"> <p class="return-data"><?php echo $returnKanji['kun_yomi']; ?></p> </div>
    						</div>
    						<div class="row">
    							<div class="line col-md-4 col-sm-4"> <strong class="return-data">On yomi :</strong> </div>
    							<div class="line col-md-8 col-sm-8"> <p class="return-data"><?php echo $returnKanji['on_yomi']; ?></p> </div>
    						</div>
    						<div class="row">
    							<div class="line col-md-4 col-sm-4"> <strong class="return-data">Définition :</strong> </div>
    							<div class="line col-md-8 col-sm-8"> <p class="return-data"><?php echo $returnKanji['meaning_k']; ?></p> </div>
    						</div>
    						<div class="row">
    							<div class=" col-md-4 col-sm-4"> <strong class="return-data">Note :</strong> </div>
    							<div class=" col-md-8 col-sm-8"> <p class="return-data"><?php echo $note; ?></p> </div>
    						</div>
    					</div>
    				</div>
    <?php
    			$kanji = $returnKanji['kanji_k'];
    			
    			$requestKanji->closeCursor();
    														
    			$requestVocTab = $database->prepare("SELECT * FROM vocabulary INNER JOIN kanjis ON vocabulary.kanji LIKE CONCAT('%', :kanji_k, '%') ORDER BY learned DESC, n_lesson");
    			$requestVocTab->execute(array(
    				":kanji_k" => $kanji
    				));
    			$returnVocTab = $requestVocTab->fetch();
    			
    			
    			if($returnVocTab) {
    			
    	?>			<div class="separator"> </div>
    				
    				<table id="table" class="table table-condensed">
    					<caption id="caption">Mots composés de ce kanji :</caption>
    					<tr>
    						<th> Kanji : </th>
    						<th> Hiragana : </th>
    						<th> Romaji : </th>
    						<th> Traduction : </th>
    						<th> Leçon N° : </th>
    						<th> Note : </th>
    					</tr>	
    	
    					<?php 
    				while($returnVocTab = $requestVocTab->fetch()) { 
    	
    					if($returnVocTab['note'] == NULL) {
    						$returnVocTab['note'] = "N/a";
    					}
    					
    					if($returnVocTab['learned'] == 2) {
    						$class = "table-success";
    						
    					} elseif($returnVocTab['learned'] == 1) {
    						$class = "table-warning";
    						
    					} else {
    						$class = "table-danger";
    					}
    					
    				?>	<tr class="<?php echo $class ?>">
    						<td><?php echo $returnVocTab['kanji']; ?></td>
    						<td><?php echo $returnVocTab['hiragana']; ?></td>
    						<td><?php echo $returnVocTab['romaji']; ?></td>
    						<td><?php echo $returnVocTab['meaning']; ?></td>
    						<td><?php echo $returnVocTab['n_lesson']; ?></td>
    						<td><?php echo $returnVocTab['note']; ?></td>
    					</tr> <?php
    				}
    				$requestVocTab->closeCursor();
    ?>
    				</table>
    <?php		}
    			
    			$requestVerbsTab = $database->prepare("SELECT * FROM verbs INNER JOIN kanjis ON verbs.kanji LIKE CONCAT('%', :kanji_k, '%') ORDER BY learned DESC, n_lesson");
    			$requestVerbsTab->execute(array(
    				":kanji_k" => $kanji
    				));
    			$returnVerbsTab = $requestVerbsTab->fetch();
    			
    			
    			if($returnVerbsTab) {
    			
    	?>			<!-- <div class="separator"> </div> -->
    				
    				<table id="table" class="table table-condensed">
    					<caption id="caption">Verbes composés de ce kanji :</caption>
    					<tr>
    						<th> Kanji : </th>
    						<th> Hiragana : </th>
    						<th> Romaji : </th>
    						<th> Traduction : </th>
    						<th> Leçon N° : : </th>
    						<th> Note : </th>
    					</tr>	
    	
    	<?php 
    				while($returnVerbsTab = $requestVerbsTab->fetch()) { 
    	
    					if($returnVerbsTab['note'] == NULL) {
    						$returnVerbsTab['note'] = "N/a";
    					}
    					
    					if($returnVerbsTab['learned'] == 2) {
    						$class = "table-success";
    						
    					} elseif($returnVerbsTab['learned'] == 1) {
    						$class = "table-warning";
    						
    					} else {
    						$class = "table-danger";
    					}
    					
    				?>	<tr class="<?php echo $class ?>">
    						<td><?php echo $returnVerbsTab['kanji']; ?></td>
    						<td><?php echo $returnVerbsTab['hiragana']; ?></td>
    						<td><?php echo $returnVerbsTab['romaji']; ?></td>
    						<td><?php echo $returnVerbsTab['meaning']; ?></td>
    						<td><?php echo $returnVerbsTab['n_lesson']; ?></td>
    						<td><?php echo $returnVerbsTab['note']; ?></td>
    					</tr> <?php
    				}
    				$requestVerbsTab->closeCursor();
    ?>			
    				</table>
    <?php		}
    		
    		} else {
    		//	header("Location:erreur.php");
    		}
    		
    	} else {
    //		header("Location:erreur.php");
    	}
    		
    ?>		
    </body>
    </html>



    -
    Edité par Nicoji 31 mars 2020 à 11:50:15

    • Partager sur Facebook
    • Partager sur Twitter
      31 mars 2020 à 14:21:27

      Bonjour,

      Ta jointure n'en est pas une ... Il faut te former au SQL ...

      Si tu veux joindre la table vocabulary et la table kanji, il faut que la clause ON soit une égalité entre une colonne de chaque table, généralement entre la clé primaire de l'une et la clé étrangère de l'autre...

      Je dirais au pif :

      SELECT *
      FROM
      	vocabulary V
      		INNER JOIN kanjis K
      			ON V.kanji = K.kanji_k
      WHERE V.kanji LIKE CONCAT('%', :kanji_k, '%')
      ORDER BY learned DESC, n_lesson

      Et :

      SELECT *
      FROM
      	verbs V
      		INNER JOIN kanjis K
      			ON V.kanji = K.kanji_k
      WHERE V.kanji LIKE CONCAT('%', :kanji_k, '%')
      ORDER BY learned DESC, n_lesson

      Mais c'est bien au hasard que j'écris cela ...

      Quelle est la structure (colonnes et types) de tes deux tables ?

      -
      Edité par Benzouye 31 mars 2020 à 16:21:52

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        31 mars 2020 à 17:39:04

        Bonjour,

        Ton fichier est presque illisible. Ceci est dû au non repect de NORME W3C. S'il te plâit, à l'avenir, essaie de mieux organiser ton travail car, moi de ma part, je m'y retrouve pas; je gagne pas du temps à lire ton fichier.

        /** fichier.php **/
        
        // Ma classe de ..
        class Fichier{
        
         // Fonction qui ....
         
        
        } // Fin de class
        
        <!-- index.html -->
        <html>
         <body>
           <!-- Remplissage du tableau de -->
           <table></table>
         </body>
        </html>

        Essai s'il te plait d'appliquer cette méthode

        Bon courage car t'es capable de répondre ta propre question en étant organisé.


        • Partager sur Facebook
        • Partager sur Twitter
          31 mars 2020 à 18:18:02

          Voici mes deux tables : 

          Si jamais j'ai bien compris la requête que tu as écrit, je sélectionne toutes les correspondances entre la colonne kanji_k de la table kanjis et la colonne kanji de la table vocabulaire ? 

          Parce que ce que je souhaite c'est sélectionner uniquement les kanji de vocabulary qui contiennent le kanji de la table kanji_k. 

          En gros kanjis.kanji_k représente uniquement 1 caractère, et vocabulary.kanji représente une chaine de plusieurs caractères. Ce que je souhaite afficher sur ma page c'est tous les éléments dans vocabulary qui sont composé du kanji_k de la page (un caractère) 

          En tout cas merci pour vos retours ! 

          @ValuelsEmpty, oui tu as totalement raison .. C'est mon premier projet que j'essais de réaliser dans le but d'apprendre, et je me suis directement lancé dans le code, fait beaucoup de modification, et c'est vrai que c'est un énorme foutoir ... Je vais y remédier ! 

          Merci des conseils 

          -
          Edité par Nicoji 31 mars 2020 à 18:21:46

          • Partager sur Facebook
          • Partager sur Twitter
            31 mars 2020 à 19:11:50

            Peux tu poster un exemple de données avec le résultat attendu ? J'ai du mal à comprendre ta structure ...

            • Partager sur Facebook
            • Partager sur Twitter
            Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
              31 mars 2020 à 22:59:47

              Si par exemple dans la première table (vocabulaire) on a 学科 et 学生 dans le champs kanji, et que dans la deuxième table (kanjis) on a 学 dans le champs kanji_k, je souhaite que sur la page web ou j'affiche 学, les deux autres 学科 et 学生 apparaissent automatiquement étant donné qu'ils contiennent le 'kanji' en question.
              • Partager sur Facebook
              • Partager sur Twitter
                2 avril 2020 à 10:53:27

                Essai de voir ce lien si tu pense que c'st un souci SQL : https://sql.sh/cours/jointures

                Sinon, essai de d'appliquer ce que j'ai écris en haut.

                // Ceci est un object de la class Member
                $member_id = new Member();
                
                // Je veux obtenir son adresse
                $member_id->getAddress();
                $member_id->getCurrentUser()->getAddress();
                
                // Ceci sont des variables impropres
                $MemberId = null;
                $memberId = null;
                // CONSTATANTES
                $STATUS = [];
                $MEMBER_PERMISSIONS = [];
                
                // Ceci est une classe propre
                class MemberPermissions{}
                
                // Ceci sont des fonctions proprement déclarées
                public function getAdress(){}
                public function address_get(){}
                public function get_address(){}
                
                
                



                -
                Edité par ValueIsEmpty 2 avril 2020 à 10:56:00

                • Partager sur Facebook
                • Partager sur Twitter
                  2 avril 2020 à 12:30:10

                  Nicoji a écrit:

                  Si par exemple dans la première table (vocabulaire) on a 学科 et 学生 dans le champs kanji, et que dans la deuxième table (kanjis) on a 学 dans le champs kanji_k, je souhaite que sur la page web ou j'affiche 学, les deux autres 学科 et 学生 apparaissent automatiquement étant donné qu'ils contiennent le 'kanji' en question.

                  Ok, je comprends ... mais du coup, en effet ta première requête était correcte ...

                  Peut-être essayer de faire la concaténation pour le LIKE côté PHP. Dans ton post initial, la ligne 151 (et suivantes) deviendrait :

                  $requestVocTab = $database->prepare("
                  	SELECT *
                  	FROM vocabulary
                  	WHERE kanji LIKE ?
                  	ORDER BY learned DESC, n_lesson"
                  );
                  $requestVocTab->execute( array( '%'.$kanji.'%' ) );

                  J'ai retiré la jointure qui ne sert à rien puisque tu as déjà le kanji en amont dans ton code.

                  Sinon, on pourrait imaginer une structure de base de données plus rigoureuse, qui formalise la relation kanji / vocabulaire :

                  Certes ce modèle t'oblige à créer un enregistrement par couple mot / idéogramme dans la table de relation, mais du coup, les recherches ne s'appuieront plus sur le caractère (avec les éventuels problèmes d'encodage) mais sur son id ...

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL

                  Req SQL retourne plusieurs fois la même donnée

                  × 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