Résultat SELECT count erroné

Résolu
Evelyne31 Messages postés 56 Statut Membre -  
Bionik Messages postés 4232 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

Je fais une requête pour compter les résultats suite à une recherche via un formulaire php.
Tout se passe bien dans PhpMyAdmin mais rien à faire dans mon fichier de traitement du formulaire de recherche.
Je vous soumets mes 2 requêtes si vous aviez un début de piste ? Merci par avance,
Evelyne

Requête SQL dans PhpMyAdmin qui renvoie bien le bon nombre de résultats :
SELECT count(ID_gite) AS total FROM GITE g
		JOIN AS_COMMU_DEPAR acd ON g.ID_commune = acd.COMMUNE_ID_commune
		JOIN DEPARTEMENT d ON d.ID_departement = acd.DEPARTEMENT_ID_departement
                WHERE codeDepartement LIKE '%31%';


Requête dans mon fichier php qui renvoie la totalité des enregistrements sans tenir compte du numéro de département sélectionné :
$clauseWhere = " WHERE codeDepartement LIKE '%".mysql_real_escape_string($_SESSION['recherche']['mot'])."%' ";
$retour_total_query = 
		"SELECT count(ID_gite) AS total FROM GITE g
		JOIN AS_COMMU_DEPAR acd ON g.ID_commune = acd.COMMUNE_ID_commune
		JOIN DEPARTEMENT d ON d.ID_departement = acd.DEPARTEMENT_ID_departement 
		";
	$clauseWhere; // Critères de recherche
	$retour_total = mysql_query($retour_total_query) or die (mysql_error());
	$donnees_total = mysql_fetch_assoc($retour_total); //On range retour sous la forme d'un tableau.
	$total = $donnees_total['total']; //On récupère le total pour le placer dans la variable $total.


7 réponses

  1. Bionik Messages postés 4232 Date d'inscription   Statut Modérateur Dernière intervention   185
     
    Salut,

    C'est très normal d'avoir tous les enregistrements, t'as déclaré une variable $clauseWhere que t'as jamais utilisé dans ta requête.

    Essaies plutôt ceci:
    <?php
        $clauseWhere = " WHERE codeDepartement LIKE '%" . mysql_real_escape_string($_SESSION['recherche']['mot']) . "%' ";
        $retour_total_query =
                "SELECT count(ID_gite) AS total FROM GITE g
    		JOIN AS_COMMU_DEPAR acd ON g.ID_commune = acd.COMMUNE_ID_commune
    		JOIN DEPARTEMENT d ON d.ID_departement = acd.DEPARTEMENT_ID_departement $clauseWhere";
        $retour_total = mysql_query($retour_total_query) or die(mysql_error());
        $donnees_total = mysql_fetch_assoc($retour_total); //On range retour sous la forme d'un tableau.
        $total = $donnees_total['total']; //On récupère le total pour le placer dans la variable $total.
    ?>
    


    1
    1. arth Messages postés 84 Date d'inscription   Statut Contributeur Dernière intervention   1 296
       
      Pluz'un !
      0
  2. Evelyne31 Messages postés 56 Statut Membre 5
     
    Bonsoir Bionik,
    Un grand merci pour ta réponse. Ta solution fonctionne, c'est déjà énorme. Malheureusement je ne comprends pas pourquoi ? Je mets ci-dessous 2 codes (extraits de fichiers php) que j'essaie en vain de comparer pour comprendre. Hormis une modification du MCD donc des requêtes, le déroulement reste le même ?
    Merci 1000 fois si tu avais une idée pour m'expliquer ?
    Désolée arth, je ne comprends pas ton "Pluz'un !"
    Evelyne

    Voici un ancien code qui renvoyait un résultat OK (MCD refait depuis) :
    Création de la requête
    switch (($_SESSION["recherche"]["type"])) {
    	case 'codeDepartement':	// contient le mot ...$mot_recherche...
    		IMPORTANT => mysql_real_escape_string(...) pour PROTEGER des injections SQL !!
    $clauseWhere = " WHERE codeDepartement LIKE '%".mysql_real_escape_string($_SESSION['recherche']['mot'])."%' ";
    $retour_total_query = 
    "SELECT count(ID_gite) AS total FROM GITE g
    		JOIN DEPARTEMENT d ON g.ID_departement = d.ID_departement
    		JOIN COMMUNE c ON g.ID_commune = c.ID_commune 
    		".
    		$clauseWhere; // Critères de recherche
    	$retour_total = mysql_query($retour_total_query) or die (mysql_error());
    	$donnees_total = mysql_fetch_assoc($retour_total); //On range retour sous la forme d'un tableau.
    	$total = $donnees_total['total']; //On récupère le total pour le placer dans la variable $total.


    Et le nouveau code soumis qui ne marchait pas :
    // Création de la requête
    switch (($_SESSION["recherche"]["type"])) {
    	case 'codeDepartement':	// contient le mot ...$mot_recherche...
    		// IMPORTANT => mysql_real_escape_string(...) pour PROTEGER des injections SQL !!
    $clauseWhere = " WHERE codeDepartement LIKE '%" . mysql_real_escape_string($_SESSION['recherche']['mot']) . "%' ";
        $retour_total_query =
                "SELECT count(ID_gite) AS total FROM GITE g
    		JOIN AS_COMMU_DEPAR acd ON g.ID_commune = acd.COMMUNE_ID_commune
    		JOIN DEPARTEMENT d ON d.ID_departement = acd.DEPARTEMENT_ID_departement $clauseWhere";
        $retour_total = mysql_query($retour_total_query) or die(mysql_error());
        $donnees_total = mysql_fetch_assoc($retour_total); //On range retour sous la forme d'un tableau.
        $total = $donnees_total['total']; //On récupère le total pour le placer dans la variable $total.
    
    0
    1. Bionik Messages postés 4232 Date d'inscription   Statut Modérateur Dernière intervention   185
       
      Je ne connais pas la structure de tes tables mais les deux scripts sont totalement différents.

      Regarde bien, les requêtes ne sont pas pareilles, donc pas étonnant que tu n'aies pas le même résultat.
      0
  3. Evelyne31 Messages postés 56 Statut Membre 5
     
    Bonsoir Bionik,
    et merci pour ton aide.
    Oui les 2 codes, donc requêtes, sont différents mais la logique reste la même ?
    En fait j'ai intégré, selon tes conseils, la variable $clauseWhere dans mes requêtes.
    Cela fonctionne et me renvoie le bon résultat (le bon nombre d'enregistrements).

    Une 1ère requête qui compte le nombre d'enregistrements pour la pagination se termine normalement par ";
    $retour_total_query =
                "SELECT count(ID_gite) AS total FROM GITE g
    		JOIN AS_COMMU_DEPAR acd ON g.ID_commune = acd.COMMUNE_ID_commune
    		JOIN DEPARTEMENT d ON d.ID_departement = acd.DEPARTEMENT_ID_departement $clauseWhere
    		";
    


    La seconde est concaténée pour intégrer la variable $clauseWhere

    $retour_messages_query = 
    		"SELECT g.numGite
    		FROM GITE g
    		JOIN AS_COMMU_DEPAR acd ON g.ID_commune = acd.COMMUNE_ID_commune
    		JOIN DEPARTEMENT d ON d.ID_departement = acd.DEPARTEMENT_ID_departement $clauseWhere		
    		".
    		$clauseWhere. // Critères de recherche
    		" ORDER BY numGite 
    		ASC LIMIT ".$premiereEntree.", ".$messagesParPage." "; // Pagination
    


    Le résultat renvoyé est correct. Par contre j'ai un nouveau message d'erreur :
    Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /Applications/MAMP/htdocs/archeotheques/lithotheque/lith_structure/lith_traitement_form_rech.php on line 252


    La ligne 252 est :
    while($donnees_messages = mysql_fetch_array($retour_messages)) { ...

    Je vous soumets mon code complet en précisant qu'il s'agit d'un fichier php de traitement d'un formulaire de recherche. L'extrait que je donne ci-après concerne un choix de recherche par numéro de département. Je soumets ce code juste pour une relecture rapide par un oeil plus expérimenté que moi. Un grand merci par avance si vous pouviez débloquez ce problème sur lequel je cale depuis lundi :

    <?php session_start(); // je démarre la session
    
    // ------------------------
    // Création de la requête
    switch (($_SESSION["recherche"]["type"])) {
    	case 'codeDepartement':	// contient le mot ...$mot_recherche...
    		// IMPORTANT => mysql_real_escape_string(...) pour PROTEGER des injections SQL !!
    		/*$clauseWhere = " WHERE codeDepartement LIKE '%" . mysql_real_escape_string($_SESSION['recherche']['mot']) . "%' ";
        $retour_total_query =
                "SELECT count(ID_gite) AS total FROM GITE g
    		JOIN AS_COMMU_DEPAR acd ON g.ID_commune = acd.COMMUNE_ID_commune
    		JOIN DEPARTEMENT d ON d.ID_departement = acd.DEPARTEMENT_ID_departement $clauseWhere
    		".
        $retour_total = mysql_query($retour_total_query) or die(mysql_error());
        $donnees_total = mysql_fetch_assoc($retour_total); //On range retour sous la forme d'un tableau.
        $total = $donnees_total['total']; //On récupère le total pour le placer dans la variable $total.*/
        
        
        $clauseWhere = " WHERE codeDepartement LIKE '%" . mysql_real_escape_string($_SESSION['recherche']['mot']) . "%' ";
        $retour_total_query =
                "SELECT count(ID_gite) AS total FROM GITE g
    		JOIN AS_COMMU_DEPAR acd ON g.ID_commune = acd.COMMUNE_ID_commune
    		JOIN DEPARTEMENT d ON d.ID_departement = acd.DEPARTEMENT_ID_departement $clauseWhere
    		";
        $retour_total = mysql_query($retour_total_query) or die(mysql_error());
        $donnees_total = mysql_fetch_assoc($retour_total); //On range retour sous la forme d'un tableau.
        $total = $donnees_total['total']; //On récupère le total pour le placer dans la variable $total.
        
    	// -----------------------
    // Pagination
    $messagesParPage = 3; // Nous allons afficher 2 messages par page.
    //Nous allons maintenant compter le nombre de pages.
    $nombreDePages = ceil($total/$messagesParPage);
    // ------------------------
    // Récupération du numéro de page
    if(isset($_GET['page'])) // Si la variable $_GET['page'] existe...
    {
         $pageActuelle = intval($_GET['page']); // Récupération via URL
         if($pageActuelle>$nombreDePages) // Si la valeur de $pageActuelle (le numéro de la page) est plus grande que $nombreDePages...
         {
             $pageActuelle = $nombreDePages;
         }
    } else { // Sinon
        $pageActuelle = 1; // La page actuelle est la n°1    
    }
    $premiereEntree = ($pageActuelle-1)*$messagesParPage; // On calcule la première entrée à lire
    	
    		mysql_query("SET NAMES 'utf8'");
    	$retour_messages_query = 
    		"SELECT g.numGite
    		FROM GITE g
    		JOIN AS_COMMU_DEPAR acd ON g.ID_commune = acd.COMMUNE_ID_commune
    		JOIN DEPARTEMENT d ON d.ID_departement = acd.DEPARTEMENT_ID_departement $clauseWhere		
    		".
    		$clauseWhere. // Critères de recherche
    		" ORDER BY numGite 
    		ASC LIMIT ".$premiereEntree.", ".$messagesParPage." "; // Pagination*/
    	$retour_messages = mysql_query($retour_messages_query);
    	break;
    
    ...	
    
    }
    ?>
    
    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8" />
    		<link rel="stylesheet" href="../lith_css/lith_style_form_rech.css" />
    		<title>Lithothèque, résultat d'une recherche</title>
    	</head>
    	<body>
    
    <?php include("lith_entete_form.php");?>
    
    <p class="titre_form">Résultat de votre recherche</p>
    
    <span class="centre"><p>Pour le terme recherché : <span class="vert_gras"><?php echo $_SESSION['recherche']['mot']; ?></span>, il y a <span class="vert_gras"><?php echo $total; ?></span> enregistrement<?php if($total>1){ echo 's'; } ?> dans la Lithothèque.</p></span>
    
    <?php
    if($total) {
        // début du tableau
        echo '<table id=table1>'."\n";
            // première ligne on affiche les titres prénom et surnom dans 2 colonnes
            echo '<tr>';
            echo '<th>Numéros des gîtes</th>';
            //echo '<th>Nature des gîtes</th>';
            echo '</tr>'."\n";
        // lecture et affichage des résultats sur 1 colonne, 1 résultat par ligne.    
    while($donnees_messages = mysql_fetch_array($retour_messages)) {
            echo '<tr>';
            echo '<td ><a href="../lith_page_gite.php?numGite='. $donnees_messages['numGite'] . '">' . $donnees_messages['numGite'] . '</a></td>';
            echo '</tr>'."\n";
        
        }    echo '</table>'."\n";
        // fin du tableau.
       }
    else echo 'Il n\'y a pas encore d\'enregistrement dans la Lithothèque correspondant au terme de votre recherche.';
    // ------------------------
    // Affichage de la PAGINATION
    
    echo '<p style="text-align:center;">Page(s) : '; //Pour l'affichage, on centre la liste des pages
    for($i=1; $i<=$nombreDePages; $i++) //On fait notre boucle
    {
     //On va faire notre condition
    	if($i==$pageActuelle) //Si il s'agit de la page actuelle...
    	{
    	echo ' [ '.$i.' ] '; 
    	} else { //Sinon...
    		echo ' <a href="lith_traitement_form_rech.php?page='.$i.'">'.$i.'</a> ';
    	}
    }
    echo '</p>';
    
    
    ?>
    
    <IMG SRC="../lith_images/puce_biface.png">&nbsp;<a href="../lith_acces/lith_acces.php">Retour accueil Lithothèque</a>   
    <br /><br />
        
    <?php include("lith_pied_page_form_rech.php"); ?>
    
    </body>
    </html>
    0
    1. Bionik Messages postés 4232 Date d'inscription   Statut Modérateur Dernière intervention   185
       
      L'erreur que t'obtiens signifie que tu as donné un boolean en argument.
      Regardes la variable $retour_messages_query, elle contient deux fois la variable $clauseWhere avec ces deux concaténations.
      0
  4. Evelyne31 Messages postés 56 Statut Membre 5
     
    Bonjour Bionik,
    Je te remercie pour cette nouvelle réponse. J'essaie de régler le problème ce matin et espère pouvoir enfin mettre ce post en résolu.
    Très bonne journée,
    Evelyne
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Evelyne31 Messages postés 56 Statut Membre 5
     
    re-bonjour,
    Mon problème est enfin résolu grâce à ton aide. Il y avait bien 2 fois la clause where dans mes 2 requêtes.
    Je mets une partie de mon code ci-dessous pour l'exemple d'une recherche par n° de département. S'il pouvait servir à d'autres ?
    Très bonne journée et encore merci Bionik,
    Evelyne
    0
    1. Bionik Messages postés 4232 Date d'inscription   Statut Modérateur Dernière intervention   185
       
      Pas de quoi, bonne journée ;)
      0
  7. Evelyne31 Messages postés 56 Statut Membre 5
     
    Le code oublié lors du message précédent. Il s'agit du résultat de l'envoi d'un formulaire de recherche et de présenter les résultats sous forme de liste avec pagination.
    // ------------------------
    // Création de la requête
    switch (($_SESSION["recherche"]["type"])) {
    	case 'codeDepartement':	// contient le mot ...$mot_recherche...
    		// IMPORTANT => mysql_real_escape_string(...) pour PROTEGER des injections SQL !!
    
        $clauseWhere = " WHERE codeDepartement LIKE '%" . mysql_real_escape_string($_SESSION['recherche']['mot']) . "%' ";
        $retour_total_query =
                "SELECT count(ID_gite) AS total FROM GITE g
    		JOIN AS_COMMU_DEPAR acd ON g.ID_commune = acd.COMMUNE_ID_commune
    		JOIN DEPARTEMENT d ON d.ID_departement = acd.DEPARTEMENT_ID_departement $clauseWhere
    		";
        $retour_total = mysql_query($retour_total_query) or die(mysql_error());
        $donnees_total = mysql_fetch_assoc($retour_total); //On range retour sous la forme d'un tableau.
        $total = $donnees_total['total']; //On récupère le total pour le placer dans la variable $total.
    echo $retour_total_query;    
    	// -----------------------
    // Pagination
    $messagesParPage = 3; // Nous allons afficher 2 messages par page.
    //Nous allons maintenant compter le nombre de pages.
    $nombreDePages = ceil($total/$messagesParPage);
    // ------------------------
    // Récupération du numéro de page
    if(isset($_GET['page'])) // Si la variable $_GET['page'] existe...
    {
         $pageActuelle = intval($_GET['page']); // Récupération via URL
         if($pageActuelle>$nombreDePages) // Si la valeur de $pageActuelle (le numéro de la page) est plus grande que $nombreDePages...
         {
             $pageActuelle = $nombreDePages;
         }
    } else { // Sinon
        $pageActuelle = 1; // La page actuelle est la n°1    
    }
    $premiereEntree = ($pageActuelle-1)*$messagesParPage; // On calcule la première entrée à lire
    	
    		mysql_query("SET NAMES 'utf8'");
    	$retour_messages_query = 
    		"SELECT g.numGite
    		FROM GITE g
    		JOIN AS_COMMU_DEPAR acd ON g.ID_commune = acd.COMMUNE_ID_commune
    		JOIN DEPARTEMENT d ON d.ID_departement = acd.DEPARTEMENT_ID_departement $clauseWhere		
    		".
    		//$clauseWhere. // Critères de recherche
    		" ORDER BY numGite 
    		ASC LIMIT ".$premiereEntree.", ".$messagesParPage." "; // Pagination*/
    	$retour_messages = mysql_query($retour_messages_query);
    	echo  $retour_messages_query;
    	break;
    0
    1. Bionik Messages postés 4232 Date d'inscription   Statut Modérateur Dernière intervention   185
       
      Je revois les deux clauses where ($clauseWhere) dans ta requête $retour_messages_query. Supprime l'un :)
      0
  8. Evelyne31 Messages postés 56 Statut Membre 5
     
    Non Bionik, j'avais laissé la 2ème est en commentaire par erreur.
    Je rectifie ci-dessous pour être sûre que c'est parfait ? Merci.
    Evelyne

    $retour_messages_query = 
    		"SELECT g.numGite
    		FROM GITE g
    		JOIN AS_COMMU_DEPAR acd ON g.ID_commune = acd.COMMUNE_ID_commune
    		JOIN DEPARTEMENT d ON d.ID_departement = acd.DEPARTEMENT_ID_departement $clauseWhere		
    		".
    		" ORDER BY numGite 
    		ASC LIMIT ".$premiereEntree.", ".$messagesParPage." "; // Pagination
    	$retour_messages = mysql_query($retour_messages_query);
    	echo  $retour_messages_query;
    	break;
    0
    1. Bionik Messages postés 4232 Date d'inscription   Statut Modérateur Dernière intervention   185
       
      Ah ok, je m'en doutais aussi.
      0