Résultat SELECT count erroné [Résolu/Fermé]

Signaler
Messages postés
55
Date d'inscription
mardi 17 juillet 2012
Statut
Membre
Dernière intervention
13 septembre 2016
-
Bionik
Messages postés
4521
Date d'inscription
jeudi 19 août 2010
Statut
Modérateur
Dernière intervention
3 août 2016
-
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

Messages postés
4521
Date d'inscription
jeudi 19 août 2010
Statut
Modérateur
Dernière intervention
3 août 2016
155
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 74310 internautes nous ont dit merci ce mois-ci

arth
Messages postés
9390
Date d'inscription
mardi 27 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2016
1 212
Pluz'un !
Messages postés
55
Date d'inscription
mardi 17 juillet 2012
Statut
Membre
Dernière intervention
13 septembre 2016
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.
Bionik
Messages postés
4521
Date d'inscription
jeudi 19 août 2010
Statut
Modérateur
Dernière intervention
3 août 2016
155
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.
Messages postés
55
Date d'inscription
mardi 17 juillet 2012
Statut
Membre
Dernière intervention
13 septembre 2016
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>
Bionik
Messages postés
4521
Date d'inscription
jeudi 19 août 2010
Statut
Modérateur
Dernière intervention
3 août 2016
155
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.
Messages postés
55
Date d'inscription
mardi 17 juillet 2012
Statut
Membre
Dernière intervention
13 septembre 2016
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
Messages postés
55
Date d'inscription
mardi 17 juillet 2012
Statut
Membre
Dernière intervention
13 septembre 2016
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
Bionik
Messages postés
4521
Date d'inscription
jeudi 19 août 2010
Statut
Modérateur
Dernière intervention
3 août 2016
155
Pas de quoi, bonne journée ;)
Messages postés
55
Date d'inscription
mardi 17 juillet 2012
Statut
Membre
Dernière intervention
13 septembre 2016
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;
Bionik
Messages postés
4521
Date d'inscription
jeudi 19 août 2010
Statut
Modérateur
Dernière intervention
3 août 2016
155
Je revois les deux clauses where ($clauseWhere) dans ta requête $retour_messages_query. Supprime l'un :)
Messages postés
55
Date d'inscription
mardi 17 juillet 2012
Statut
Membre
Dernière intervention
13 septembre 2016
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;
Bionik
Messages postés
4521
Date d'inscription
jeudi 19 août 2010
Statut
Modérateur
Dernière intervention
3 août 2016
155
Ah ok, je m'en doutais aussi.