supplied argument is not a valid MySQL result resource

zab
Eléphanteau du PHP | 40 Messages

03 févr. 2008, 12:27

Bonjour voici mon code
<?php
define ("USER", "root") ;
define ("PASSWORD", "") ;
 
$connexion =  mysql_connect("localhost",USER,PASSWORD)
or exit("Erreur 101") ;
 
 mysql_select_db( "aviatec" , $connexion)
or exit("Erreur 102") ;
 
if (isset($_POST['rechercher'])) //si on a validé le formulaire
{
$recherche = mysql_real_escape_string(htmlspecialchars($_POST['recherche'])); //sécurisation des variables
$mode = mysql_real_escape_string(htmlspecialchars($_POST['mode']));
 
if ($mode == "tous_les_mots")
{
$and_ou_or = 'AND'; //on utilisera AND dans la boucle
}
else
{
$and_ou_or = 'OR'; //on utilisera OR dans la boucle
}
if ($mode == "expression_exacte") //si le mode de recherche est par expression exacte
{
$selection_recherche = mysql_query("SELECT * FROM base_articles WHERE titre LIKE '%$recherche%' ORDER BY id DESC");
}
else //si le mode de recherche n'est pas par expression exacte
{
$mots = explode(" ", $recherche); //séparation des mots
$nombre_mots = count ($mots); //compte le nombre de mots
$valeur_requete = '';
for($nombre_mots_boucle = 0; $nombre_mots_boucle < $nombre_mots; $nombre_mots_boucle++) //tant que le nombre de mots de la recherche est supérieur à celui de la boucle on continue en augmentant le nombre de mots de 1 à chaque fois
{
$valeur_requete .= '' . $and_ou_or . ' titre LIKE \'%' . $mots[$nombre_mots_boucle] . '%\''; //modification de la variable $valeur_requete
}
$valeur_requete = ltrim($valeur_requete,$and_ou_or); //suppression de AND ou de OR au début de la boucle
$selection_recherche = mysql_query("SELECT * FROM base_articles WHERE $valeur_requete ORDER BY id DESC") or exit(mysql_error()); //requête avec le résultat de la boucle dedans
}
 
$nombre_resultats = mysql_num_rows($selection_recherche); //compte le nombre d'entrées sélectionnées par la recherche
if ($nombre_resultats == 0) //si il n'y a pas de résultat
{
echo 'aucun resultat.<a href="recherche.php">recommencer</a>';
}
else //il y a au moins un resultat
{
echo 'nombre de résultats: ' . $nombre_resultats . ':<br /><br />'; //nombre de résultats
while($resultats = mysql_fetch_array($selection_recherche) ) //boucle affichant les resultats
{
echo '<strong>Numero:</strong> ' . $resultats['id'] . '<br />
<strong>Titre:</strong> ' . $resultats['titre'] . '<br />
<strong>Fermé:</strong> ' . $resultats['ferme'] . '<br /><br />';
}
echo '<a href="recherche.php">recommencer</a>';
}
}
else //si on a pas validé le formulaire on l'affiche
{
?>
<form method="post" action="recherche.php">
Votre recherche:
<input type="text" name="recherche" />
<br />
Votre mode de recherche:
<select name="mode">
<option value="expression_exacte">Expression exacte</option>
<option value="tous_les_mots">Tous les mots</option>
<option value="un_mot">Au moins un mot</option>
</select>
<br />
 
<input type="submit" value="Rechercher" name="rechercher" />
</form>
<?
}
mysql_close(); //deconnexion de la bdd
?>
le message d'erreur suivant apparait :
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in c:\program files\easyphp1-8\www\autre panier achat\recherche2.php on line 41
La ligne 41 est :
$nombre_resultats = mysql_num_rows($selection_recherche); //compte le nombre d'entrées sélectionnées par la recherche

J'ai l'impressin que c'est ma requête sql :SELECT * FROM base_articles WHERE $valeur_requete ORDER BY id DESC qui n'est pas bonne
pourquoi ma syntaxe n'est pas bonne s'il vous plait ?
merci

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

03 févr. 2008, 12:30

Modération :
zab, afin d'obtenir une réponse sur ce forum, il est indispensable de :

- Préciser quel est le SGBD utilisé ainsi que sa Version
- Poster la Structure des Tables utilisées dans la requête sous la forme d'un "CREATE TABLE ..." :!:
(Vous pouvez exporter la structure d'une table via phpMyAdmin. Retirez les colonnes inutiles)
- Indiquer le message d'erreur SQL le cas échéant.

Pensez à utiliser les balises

Code : Tout sélectionner

pour afficher les requêtes SQL, la Structure des Tables et si nécessaire un échantillon des données. Assurez vous également d'avoir suivi ces [url=http://www.phpfrance.com/forums/voir_sujet-19378.php]conseils de débogage[/url]. [/color]
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

zab
Eléphanteau du PHP | 40 Messages

03 févr. 2008, 12:40

Désolée
alors je travaille avec phpmyadmin 2.6.1, mysql;
ma table est :

Code : Tout sélectionner

CREATE TABLE base_articles ( id int(15) NOT NULL auto_increment, REFERENCE varchar(19) default NULL, DESIGNATION varchar(69) default NULL, FAMILLE varchar(11) default NULL, `DESCRIPTION FRANCAISE` varchar(69) default NULL, `DESCRIPTION ANGLAISE` varchar(69) default NULL, SPECIFICATIONS varchar(35) default NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
et le message d'erreur sql est le suivant :
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in c:\program files\easyphp1-8\www\autre panier achat\recherche2.php on line 44

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

03 févr. 2008, 12:54

Est-ce que tu as suivi ce lien ?
quelques conseils de débogage
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

zab
Eléphanteau du PHP | 40 Messages

03 févr. 2008, 12:59

Est-ce que tu as suivi ce lien ?
quelques conseils de débogage
oui je l'ai fait j'ai rajouté un or exit(mysql_error());
et j'ai aussi rajouté après ma requête sql : echo $selection_recherche;
mais j'obtiens toujours ceci sur la page :
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in c:\program files\easyphp1-8\www\autre panier achat\recherche2.php on line 45
aucun resultat.recommencer

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

03 févr. 2008, 13:08

Sinon, avec un mysql_error(), tu n'as aucun message d'erreur ? autre que celui que tu nous cites ?

PS : indente ton code, ça sera plus lisible ;)
<?php
define ("USER", "root") ;
define ("PASSWORD", "") ;
 
$connexion =  mysql_connect("localhost",USER,PASSWORD)
	or exit("Erreur 101") ;
 
mysql_select_db( "aviatec" , $connexion)
	or exit("Erreur 102") ;
 
if (isset($_POST['rechercher'])) //si on a validé le formulaire
{
	$recherche = mysql_real_escape_string(htmlspecialchars($_POST['recherche'])); //sécurisation des variables
	$mode = mysql_real_escape_string(htmlspecialchars($_POST['mode']));
	 
	if ($mode == "tous_les_mots")
	{
		$and_ou_or = 'AND'; //on utilisera AND dans la boucle
	}
	else
	{
		$and_ou_or = 'OR'; //on utilisera OR dans la boucle
	}
	
	if ($mode == "expression_exacte") //si le mode de recherche est par expression exacte
	{
		$selection_recherche = mysql_query("SELECT * FROM base_articles WHERE titre LIKE '%$recherche%' ORDER BY id DESC");
	}
	else //si le mode de recherche n'est pas par expression exacte
	{
		$mots = explode(" ", $recherche); //séparation des mots
		$nombre_mots = count ($mots); //compte le nombre de mots
		$valeur_requete = '';
		for($nombre_mots_boucle = 0; $nombre_mots_boucle < $nombre_mots; $nombre_mots_boucle++) //tant que le nombre de mots de la recherche est supérieur à celui de la boucle on continue en augmentant le nombre de mots de 1 à chaque fois
		{
			$valeur_requete .= '' . $and_ou_or . ' titre LIKE \'%' . $mots[$nombre_mots_boucle] . '%\''; //modification de la variable $valeur_requete
		}
		$valeur_requete = ltrim($valeur_requete,$and_ou_or); //suppression de AND ou de OR au début de la boucle
		$selection_recherche = mysql_query("SELECT * FROM base_articles WHERE $valeur_requete ORDER BY id DESC") or exit(mysql_error()); //requête avec le résultat de la boucle dedans
	}
	 
	$nombre_resultats = mysql_num_rows($selection_recherche); //compte le nombre d'entrées sélectionnées par la recherche
	if ($nombre_resultats == 0) //si il n'y a pas de résultat
	{
		echo 'aucun resultat.<a href="recherche.php">recommencer</a>';
	}
	else //il y a au moins un resultat
	{
		echo 'nombre de résultats: ' . $nombre_resultats . ':<br /><br />'; //nombre de résultats
		while($resultats = mysql_fetch_array($selection_recherche) ) //boucle affichant les resultats
		{
			echo '<strong>Numero:</strong> ' . $resultats['id'] . '<br />
			<strong>Titre:</strong> ' . $resultats['titre'] . '<br />
			<strong>Fermé:</strong> ' . $resultats['ferme'] . '<br /><br />';
		}
		echo '<a href="recherche.php">recommencer</a>';
	}
}
else //si on a pas validé le formulaire on l'affiche
{
?>
	<form method="post" action="recherche.php">
	Votre recherche:
	<input type="text" name="recherche" />
	<br />
	Votre mode de recherche:
	<select name="mode">
	<option value="expression_exacte">Expression exacte</option>
	<option value="tous_les_mots">Tous les mots</option>
	<option value="un_mot">Au moins un mot</option>
	</select>
	<br />
	 
	<input type="submit" value="Rechercher" name="rechercher" />
	</form>
	<?
}
mysql_close(); //deconnexion de la bdd
?> 
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

zab
Eléphanteau du PHP | 40 Messages

03 févr. 2008, 14:27

Sinon, avec un mysql_error(), tu n'as aucun message d'erreur ? autre que celui que tu nous cites ?

PS : indente ton code, ça sera plus lisible ;)
<?php
define ("USER", "root") ;
define ("PASSWORD", "") ;
 
$connexion =  mysql_connect("localhost",USER,PASSWORD)
	or exit("Erreur 101") ;
 
mysql_select_db( "aviatec" , $connexion)
	or exit("Erreur 102") ;
 
if (isset($_POST['rechercher'])) //si on a validé le formulaire
{
	$recherche = mysql_real_escape_string(htmlspecialchars($_POST['recherche'])); //sécurisation des variables
	$mode = mysql_real_escape_string(htmlspecialchars($_POST['mode']));
	 
	if ($mode == "tous_les_mots")
	{
		$and_ou_or = 'AND'; //on utilisera AND dans la boucle
	}
	else
	{
		$and_ou_or = 'OR'; //on utilisera OR dans la boucle
	}
	
	if ($mode == "expression_exacte") //si le mode de recherche est par expression exacte
	{
		$selection_recherche = mysql_query("SELECT * FROM base_articles WHERE titre LIKE '%$recherche%' ORDER BY id DESC");
	}
	else //si le mode de recherche n'est pas par expression exacte
	{
		$mots = explode(" ", $recherche); //séparation des mots
		$nombre_mots = count ($mots); //compte le nombre de mots
		$valeur_requete = '';
		for($nombre_mots_boucle = 0; $nombre_mots_boucle < $nombre_mots; $nombre_mots_boucle++) //tant que le nombre de mots de la recherche est supérieur à celui de la boucle on continue en augmentant le nombre de mots de 1 à chaque fois
		{
			$valeur_requete .= '' . $and_ou_or . ' titre LIKE \'%' . $mots[$nombre_mots_boucle] . '%\''; //modification de la variable $valeur_requete
		}
		$valeur_requete = ltrim($valeur_requete,$and_ou_or); //suppression de AND ou de OR au début de la boucle
		$selection_recherche = mysql_query("SELECT * FROM base_articles WHERE $valeur_requete ORDER BY id DESC") or exit(mysql_error()); //requête avec le résultat de la boucle dedans
	}
	 
	$nombre_resultats = mysql_num_rows($selection_recherche); //compte le nombre d'entrées sélectionnées par la recherche
	if ($nombre_resultats == 0) //si il n'y a pas de résultat
	{
		echo 'aucun resultat.<a href="recherche.php">recommencer</a>';
	}
	else //il y a au moins un resultat
	{
		echo 'nombre de résultats: ' . $nombre_resultats . ':<br /><br />'; //nombre de résultats
		while($resultats = mysql_fetch_array($selection_recherche) ) //boucle affichant les resultats
		{
			echo '<strong>Numero:</strong> ' . $resultats['id'] . '<br />
			<strong>Titre:</strong> ' . $resultats['titre'] . '<br />
			<strong>Fermé:</strong> ' . $resultats['ferme'] . '<br /><br />';
		}
		echo '<a href="recherche.php">recommencer</a>';
	}
}
else //si on a pas validé le formulaire on l'affiche
{
?>
	<form method="post" action="recherche.php">
	Votre recherche:
	<input type="text" name="recherche" />
	<br />
	Votre mode de recherche:
	<select name="mode">
	<option value="expression_exacte">Expression exacte</option>
	<option value="tous_les_mots">Tous les mots</option>
	<option value="un_mot">Au moins un mot</option>
	</select>
	<br />
	 
	<input type="submit" value="Rechercher" name="rechercher" />
	</form>
	<?
}
mysql_close(); //deconnexion de la bdd
?> 
merci
non je n'ai aucun autre message d'erreur autre que celui que j'ai mis

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

03 févr. 2008, 15:49

Soyons logique...
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource
Ce message t'informe que la valeur passée en paramètre à la fonction mysql_num_rows() n'est pas une ressource valide. C'est donc que ta variable $selection_recherche ne contient pas le résultat normal d'une requête SQL.

Que contient $selection_recherche ? Le résultat de l'exécution d'un mysql_query(). Dans la mesure où tu en as deux (et tu n'as mis le mysql_error() que tu le second) la première question à te poser est de savoir lequel des deux est utilisé. Profites en pour stocker la requête SQL générée dans une variable et l'afficher, car c'est vraissemblablement elle qui contient une erreur (nom de table ou de champ incorrect, syntaxe erronnée, etc.)

Je vois déjà un problème au niveau de "WHERE $valeur_requete", en effet s'il n'y a pas de mot dans ta boucle, tu auras un "WHERE ORDER BY", et donc une erreur, et si tu as un mot ou plus, tu va générer la requête "WHERE AND titre LIKE ..." ce qui sera faux également...
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

zab
Eléphanteau du PHP | 40 Messages

06 févr. 2008, 11:51

Bon alors j'ai simplifié le tout ce qui donne
<?php
define ("USER", "root") ;
define ("PASSWORD", "") ;

$connexion =  mysql_connect("localhost",USER,PASSWORD)
or exit("Erreur 101") ;

 mysql_select_db( "aviatec" , $connexion)
or exit("Erreur 102") ;

if (isset($_POST['rechercher'])) //si on a validé le formulaire
{
$recherche = mysql_real_escape_string(htmlspecialchars($_POST['recherche'])); //sécurisation des variables



$mots = explode(' ', $recherche); //séparation des mots de la recherche à chaque espace
$nombre_mots = count ($mots); //compte le nombre de mots

$valeur_requete = '';
for($nombre_mots_boucle = 0; $nombre_mots_boucle < $nombre_mots; $nombre_mots_boucle++) //tant que le nombre de mots de la recherche est supérieur à celui de la boucle on continue en augmentant la variable $nombre_mots_boucle de 1 à chaque fois
{
$valeur_requete .= 'AND DESCRIPTIONFRANCAISE LIKE \'%' . $mots[$nombre_mots_boucle] . '%\''; //modification de la variable $valeur_requete
}
$valeur_requete = ltrim($valeur_requete,'AND'); //suppresion de AND au début de la boucle
 
$selection_recherche = mysql_query("SELECT * FROM base_articles WHERE $valeur_requete ORDER BY id");
$nombre_resultats = mysql_num_rows($selection_recherche); 
if ($nombre_resultats == 0) //si il n'y a pas de résultat
{
echo 'aucun resultat.<a href="recherche.php">recommencer</a>';
}
else //il y a au moins un resultat
{
echo 'nombre de résultats: ' . $nombre_resultats . ':<br /><br />'; //nombre de résultats
while($resultats = mysql_fetch_array($selection_recherche) ) //boucle affichant les resultats
{
echo '<strong>Numero:</strong> ' . $resultats['id'] . '<br />
<strong>Désignation:</strong> ' . $resultats['DESCRIPTIONFRANCAISE'] . '<br /><br />';
}
echo '<a href="recherche.php">recommencer</a>';
}
}
else //si on a pas validé le formulaire on l'affiche
{
?>

<form method="post" action="recherche.php">
Votre recherche:
<input type="text" name="recherche" />

<br />
<input type="submit" value="Rechercher" name="rechercher" />
</form>
<?php
}
mysql_close(); //deconnexion de la bdd
?>
et ça marche bien merci à tous [/code]