Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 08/02/2010, 00h35   #1
Invité de passage
 
Inscription : octobre 2008
Messages : 7
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 7
Points : 0
Points : 0
Par défaut Probleme avec mysql_num_rows

Bonjour,
En utilisant le code qui suit j'obtiens un Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource...

J'ai essayé beaucoup de solution mais là je suis vraiment bloqué,
Est-ce que quelqu'un pourrait m'expliquer la cause de ce message ?

Merci !

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
$debut = ($page - 1) * $limit; // start (requete mysql)

// NOMBRE TOTAL D'ENREGISTREMENTS REPONDANT A LA REQUETE
$requete=mysql_db_query("$sql_bdd","select count(*) from recherches where (produit like $phrase order by produit",$db_link);
$nb_total=mysql_result($requete,0,"count(*)");

$requete=mysql_db_query("$sql_bdd","select * from recherches where (produit like $phrase limit $debut,$limit",$db_link);
$num=mysql_num_rows($requete);


// DEFINITION DU MESSAGE A AFFICHER
if ($num==0) {echo "Désolé, aucune page de ce site ne contient <b>$motSaisi</b>...";} /* chang  la variable appel*/
else if ($mot=="") 	{echo "";}
else if (strlen($mot)<2) {echo "Veuillez saisir au moins 2 caractères.";}
	
// AFFICHAGE DES RESULTATS
else {

echo "<b>$nb_total</b> r&eacute;ponse";
if ($nb_total>1) {echo "s";}
echo "<br>$texte";

$i=0;
while($i<$num)
	{
	$produit=mysql_result($requete,$i,"produit");
	{echo "<br><br>$produit<br><br> \n";
}
	$i++;

Dernière modification par sabotage ; 08/02/2010 à 00h48. Motif: Merci d'utiliser les balises [CODE] (bouton # de l'éditeur)
daniel64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2010, 00h52   #2
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
mysql_db_query() ne s'utilise plus.

Il manque des guillemets a ton LIKE et faire un ORDER sur un COUNT unique ne sert a rien :
Code :
mysql_query("select count(*) from recherches where produit like '%$phrase%'");
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2010, 00h59   #3
Membre Expert
 
Avatar de David Guillot
 
Homme David Guillot
Chef de projet en SSII
Inscription : mars 2004
Messages : 879
Détails du profil
Informations personnelles :
Nom : Homme David Guillot
Âge : 27
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet en SSII
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mars 2004
Messages : 879
Points : 1 149
Points : 1 149
Je suis d'accord sur la solution, mais j'ai quand même une question pour toi Sabotage : pourquoi la fonction qui exécute la requête ne renvoie pas un warning pour dire que la requête a foiré ?
__________________
Avant de poser une question ici :

Après résolution de votre question : un clic sur , un et un vote pour les personnes qui vous ont aidé
David Guillot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2010, 01h06   #4
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
mysql_query() ne renvoit pas les erreurs, il faut utiliser mysql_error() pour les voir.
A mon avis, c'est pour eviter que des informations sur la base de données soient affichées ; bien qu'en production on n'affiche normalement jamais les erreurs.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2010, 20h16   #5
Invité de passage
 
Inscription : octobre 2008
Messages : 7
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 7
Points : 0
Points : 0
Merci Sabotage pour ta réponse,

J'ai fait les modifications mais maintenant en plus du message d'erreur précedent, j'ai un nouveau message d'erreur:
Warning: mysql_result(): supplied argument is not a valid MySQL result resource ...
ce qui correspond à la ligne:
Citation:
$nb_total=mysql_result($requete,0,"count(*)");
J'ai peut-être une piste de solution : Quand je modifie la première ligne qui est:
$debut = ($page - 1) * $limit;
pour la ligne:
$debut =$page*$limit;
en utilisant le code de mon premier message, je n'ai plus aucun message d'erreur mais alors ma pagination en bas des pages est décalée d'une page, ce qui ne règle rien. Par contre, ça ne change rien si j'utilises le code ci-dessous.

Je vous remet le code en incluant les modifications de Sabotage:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$debut = ($page - 1) * $limit; // start (requete mysql)
 
// NOMBRE TOTAL D'ENREGISTREMENTS REPONDANT A LA REQUETE
$requete=mysql_query("select count(*) from recherches where produit like '%$phrase%'");
$nb_total=mysql_result($requete,0,"count(*)");
 
$requete=mysql_query("select * from recherches where produit like '%$phrase%' limit '%$debut%','%$limit%'");
$num=mysql_num_rows($requete);
 
 
// DEFINITION DU MESSAGE A AFFICHER
if ($num==0) {echo "Désolé, aucune page de ce site ne contient <b>$motSaisi</b>...";} /* chang  la variable appel*/
else if ($mot=="") 	{echo "";}
else if (strlen($mot)<2) {echo "Veuillez saisir au moins 2 caractères.";}
 
// AFFICHAGE DES RESULTATS
else {
 
echo "<b>$nb_total</b> r&eacute;ponse";
if ($nb_total>1) {echo "s";}
echo "<br>$texte";
 
$i=0;
while($i<$num)
	{
	$produit=mysql_result($requete,$i,"produit");
	{echo "<br><br>$produit<br><br> \n";
}
	$i++;
Est-ce que quelqu'un à une idée ?

Merci!

P.S.J'utilise Easyphp 3.0.

Dernière modification par sabotage ; 08/02/2010 à 22h52. Motif: Merci d'utiliser les balises [CODE] (bouton # de l'éditeur)
daniel64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2010, 22h56   #6
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Toutes les explications pour bien debuguer :
http://php.developpez.com/faq/?page=...ysql_ressource
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2010, 01h13   #7
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 247
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 247
Points : 2 291
Points : 2 291
Salut,

j'ai pas bien compris, tu veux juste le nombre de lignes ?
Si oui, mets :

Code php :
1
2
3
4
 
$requete=mysql_query("select count(*) from recherches where produit like '%$phrase%'");
while($ligne = mysql_fetch_assoc($requete))
    $nb_ligne = $ligne['count(*)'];

à la place de :
Code php :
1
2
3
 
$requete=mysql_query("select count(*) from recherches where produit like '%$phrase%'");
$nb_total=mysql_result($requete,0,"count(*)");

non ?
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2010, 03h16   #8
Invité de passage
 
Inscription : octobre 2008
Messages : 7
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 7
Points : 0
Points : 0
Merci à Sabotage et Madfrix pour vos réponses,

Madfrix, j'ai essayé ta solution mais maintenant j'ai un Warning avec mysql_fetch_assoc.

Mais je crois avoir cerné où est le probleme, grace au site de Sabotage, j'ai inscrit des or exit(mysql_error()) et j'ai le message suivant:

Erreur de syntaxe près de '%%' or produit like '%%' ...
ce qui correspond à la ligne suivante:

Citation:
$phrase=" '%$mots[0]%' or produit like '%$mots[0]%' ";
Mais où est l'erreur de syntaxe dans ce code ?

daniel64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2010, 09h20   #9
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Dans la premiere condition ca doit être un LIKE pas = ; mais sinon $mot[0] est vide.
D'ailleurs d'ou vient ce $mot ?
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2010, 17h54   #10
Invité de passage
 
Inscription : octobre 2008
Messages : 7
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 7
Points : 0
Points : 0
Bonjour Sabotage,
Ce script sert de moteur recherche. On peut utiliser plusieurs mots pour la recherche dans une table contenant plusieurs colonnes. On peut donc rechercher par no de produit, par nom, par description, par fabricant etc.

C'est ainsi que dans le code:
$phrase=" '%$mots[0]%' or produit like '%$mots[0]%' "
il y a beaucoup d'autres or, je ne les ai pas donner pour ne pas alourdir le message. De toute façon, ça donne le même message d'erreur de syntaxe.

Pour le $mot voici les lignes de code qui le concerne:
Citation:
$page = isset($_GET['page']) ? $_GET['page'] : 0;
$mot = isset($_POST['mot']) ? $_POST['mot'] : (isset($_GET['mot']) ? $_GET['mot'] : "");

$mot=strtolower(addslashes($mot));
$mots=split(" ",$mot);
$nombre_mots=count($mots);
Pour ce qui du LIKE à la place du =, excuse-moi mais je suis débutant et je ne vois pas où je dois faire la modification.

Merci de bien vouloir m'aider.
daniel64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2010, 20h26   #11
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Etant donné qu'il n'y a qu'un seul = dans le bout de requete que tu nous montres, tu devrais trouver

Tu devrais controler ce que vaut $mot et toutes les variables qui servent à le construire car visiblement il ne vaut rien.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 20h04.


 
 
 
 
Partenaires

Hébergement Web