8710 sujets

Développement web côté serveur, CMS

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.
Bonsoir jb_gfx,

Je te remercie pour ta réponse, mais je suis vraiment désolée, c'est un peu incompréhensible pour moi.
En comparant avec un ancien code qui marchait (ci-dessous) je ne vois toujours pas d'où vient l'erreur.
J'ai changé mon MCD et refais mes requêtes, ceci doit expliquer cela mais je ne vois pas où se situe l'erreur.
Pourrais-tu, STP, m'en dire plus pour ce problème de concaténation, à quel niveau il serait ? Surtout, je ne vois pas où il avait concaténation de la variable $clauseWhere avec la variable qui contenait ma requête dans l'ancien code qui pourtant était opérationnel tip top ?

Voici l'ancien code dans le fichier php qui renvoyait le bon résultat :
$clauseWhere = " WHERE nomDepartement 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.


Un grand merci par avance,
Evelyne
Dans ton premier code tu as une ligne "; et dans ton second code tu as ".

Voilà, le point sert a concaténer des variables, le point virgule sert à terminer une ligne d'instruction.
jb_gfx,
Merci pour ton aide, constructive.
Je vois bien la différence entre la 1ère requête non concaténée et la 2ème qui l'est.
La 1ère se termine par "; et la 2ème par ". car d'autres éléments arrivent ensuite.

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

J'ai étudié ce message fréquent, il reste obscur. Php attend un array et il reçoit un boléen ?
oui, mais ? que faire ? A chaque fois c'est la même question, des centaines de fois posée sur Google, jamais réglée ?

La ligne 252 en cause :
while($donnees_messages = mysql_fetch_array($retour_messages)) {


Je ne pense pas que le problème vienne de là ? Aurais-tu, STP, une idée, une piste pour m'orienter ?

Merci par avance,
Evelyne
Bonjour,
fait un
echo $retour_total_query;
avant d'exécuter la requête pour voir à quoi ressemble la chaîne sql générée.
Une ressource mysql est un booléen fixé en "false" quand la requête MySQL n'a pas pu se faire (généralement parce que elle est erronée).

Et mysql_fetch_array attend une ressource, pas un tableau au passage.

Comprendre par là que la requête générant "$retour_messages" est fausse.
Résultat il te génère dans la variable un boolean portant la valeur "false". C'est une erreur classique où effectivement dans la majorité des cas c'est la requête qui est mal écrite.

Copie la requête dans ton Sgbd et essaye. Corrige là et ensuite seulement, une fois que tu récupère les résultats escompté, réintègre là dans ton code.
Bonjour à tous/toutes,
et merci La_Memoire, Lothindil et loicbcn pour vos réponses.
Je teste tout ça de suite et vous tiens informé.
Très bonne journée,
Evelyne
Enfin, grâce à votre aide, le traitement de mon formulaire de recherche est terminé et fonctionne.
Je ne sais plus quoi dire pour vous remercier.
J'ai fait des echo $retour_total_query; et echo $retour_messages_query;
Cela m'a permis de voir qu'il y avait, pour les 2 variables, 2 fois la clause where.
J'ai repris ma requête dans PhpMyAdmin et j'ai pu rectifier.
Je poste mon code ci-dessous, pour un choix de recherche par numéro de département, s'il pouvait servir à d'autres...
Je vais enfin pouvoir avancer.
Encore merci et très bonne journée à tout le monde sur ce forum.
Evelyne
Le code :
// ------------------------
// 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;
Merci pour le partage de ton code, tu est totalement dans un bon esprit pour le développement à mon sens Smiley cligne

Petit conseil complètement subjectif :

// Pagination
$messagesParPage = 3; // Nous allons afficher 2 messages par page.


Ce genre de bout de code, pour ma part, j'ai tendance à le mettre au début de mon code dans une partie "configuration". Le jour où tu doit reprendre ton code ou faire une simple modification suite à une demande client (ou MàJ etc...), toutes tes variables de configuration sont regroupées Smiley cligne
Modifié par La_Memoire (22 Mar 2013 - 11:04)