Résultat SELECT count erroné

Résolu/Fermé
Evelyne31 Messages postés 55 Date d'inscription mardi 17 juillet 2012 Statut Membre Dernière intervention 13 septembre 2016 - 21 mars 2013 à 20:03
Bionik Messages postés 4234 Date d'inscription jeudi 19 août 2010 Statut Modérateur Dernière intervention 3 août 2016 - 22 mars 2013 à 12:17
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

Bionik Messages postés 4234 Date d'inscription jeudi 19 août 2010 Statut Modérateur Dernière intervention 3 août 2016 183
21 mars 2013 à 22:59
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
arth Messages postés 9374 Date d'inscription mardi 27 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2016 1 291
21 mars 2013 à 23:01
Pluz'un !
0
Evelyne31 Messages postés 55 Date d'inscription mardi 17 juillet 2012 Statut Membre Dernière intervention 13 septembre 2016 5
21 mars 2013 à 23:17
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
Bionik Messages postés 4234 Date d'inscription jeudi 19 août 2010 Statut Modérateur Dernière intervention 3 août 2016 183
21 mars 2013 à 23:34
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
Evelyne31 Messages postés 55 Date d'inscription mardi 17 juillet 2012 Statut Membre Dernière intervention 13 septembre 2016 5
22 mars 2013 à 00:13
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
Bionik Messages postés 4234 Date d'inscription jeudi 19 août 2010 Statut Modérateur Dernière intervention 3 août 2016 183
22 mars 2013 à 01:29
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
Evelyne31 Messages postés 55 Date d'inscription mardi 17 juillet 2012 Statut Membre Dernière intervention 13 septembre 2016 5
22 mars 2013 à 09:13
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Evelyne31 Messages postés 55 Date d'inscription mardi 17 juillet 2012 Statut Membre Dernière intervention 13 septembre 2016 5
22 mars 2013 à 10:43
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
Bionik Messages postés 4234 Date d'inscription jeudi 19 août 2010 Statut Modérateur Dernière intervention 3 août 2016 183
22 mars 2013 à 10:46
Pas de quoi, bonne journée ;)
0
Evelyne31 Messages postés 55 Date d'inscription mardi 17 juillet 2012 Statut Membre Dernière intervention 13 septembre 2016 5
22 mars 2013 à 10:55
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
Bionik Messages postés 4234 Date d'inscription jeudi 19 août 2010 Statut Modérateur Dernière intervention 3 août 2016 183
22 mars 2013 à 11:10
Je revois les deux clauses where ($clauseWhere) dans ta requête $retour_messages_query. Supprime l'un :)
0
Evelyne31 Messages postés 55 Date d'inscription mardi 17 juillet 2012 Statut Membre Dernière intervention 13 septembre 2016 5
22 mars 2013 à 12:13
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
Bionik Messages postés 4234 Date d'inscription jeudi 19 août 2010 Statut Modérateur Dernière intervention 3 août 2016 183
22 mars 2013 à 12:17
Ah ok, je m'en doutais aussi.
0