Version complète: sur le forum Webmaster Hub : souci php+mysql
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > PHP
fplus39
bonjour,
J'ai un souci...
En fait j'ai une page qui me sort les données de ma bdd dans un tableau...ca, c'est bon...
En haut de page, je met un petit formulaire qui me sert à trouver rapidement un des artistes de ma base...
Ca fonctinne sauf quand la page se charge la première fois, donc quand il n'y a pas de recherce effectuée...
J'ai ce message :
CODE
Il y a
Warning: mysql_numrows(): supplied argument is not a valid MySQL result resource in /....mon_serveur_ftp/racine/sql/liste.php on line 70
artiste(s) répondant à ce nom:



mon code:
CODE-BOX
<?
include("sql1.inc");
mysql_connect($host, $user, $pass);
mysql_select_db("$bdd")
or die("Ouverture base impossible");

if (isset($HTTP_POST_VARS)) {
$list_query = "SELECT * FROM mp3 WHERE ";
$k = 0;
while(list($variable, $value) = each($HTTP_POST_VARS)) {
//make the query
if ($k) {
$list_query .= " OR $variable like '%$value%'";
} else {
$list_query .= "$variable like '%$value%'";
}
$k++;
}
}
?>
<center>
<form action="liste.php" method="post">
<table width="440">
<tr>
<td width="316">Rechercher un artiste :<input type="text" name="artiste" value="recherche" size="20" maxlength="50"></td>
<td width="114">
<input type="submit" value="Rechercher" style="float: right"></td>
</tr>
</table>
</form>

<table BORDER=5 bgcolor='#cad3fa'bgcolor='#cad3fa' bordercolorlight='#a4f8f7' width='950' style='border-collapse: collapse' bordercolor='#4d6af1' cellpadding='0' cellspacing='0';>
<?php

if (isset($list_query)) {
// if the query exist
$result_query = mysql_query ($list_query);
// submit the query
@$num_rows = mysql_numrows($result_query)
or print ("Il n'y a aucun artiste répondant à ce nom dans la base de données Fréquence Plus");
echo "<p>";
echo "Il y a ";
echo mysql_numrows($result_query);
echo " artiste(s) répondant à ce nom:";

// number of rows
$i = 0;

echo "<td width='25'><center><B><font size='3'>ID</font></B></center></td>";
echo "<td width='100'><center><B><font size='3'>Artiste</font></B></center></td>";
echo "<td width='100'><center><B><font size='3'>Titre</font></B></center></td>";
echo "<td width='100'><center><B><font size='3'>Visuel</font></B></center></td>";
echo "<td width='100'><center><B><font size='3'>Son</font></B></center></td>";
echo "<td width='100'><center><B><font size='3'>Vidéo</font></B></center></td>";
echo "<td width='75'><center><B><font size='3'>Date</font></B></center></td>";
echo "<td width='35'><center><B><font size='3'>Mod</font></B></center></td>";
echo "<td width='35'><center><B><font size='3'>Suppr</font></B></center></td>";

while($i != $num_rows) {
echo "\t<tr>\r\n";
echo "\t\t<td width='25'><center><B><font size='2'>".mysql_result($result_query,$i,"ID")."</font></B></center></td>\r\n";
echo "\t\t<td width='100'><center><B><font size='2'>".mysql_result($result_query,$i,"artiste")."</font></B></center></td>\r\n";
echo "\t\t<td width='100'><center><B><font size='2'>".mysql_result($result_query,$i,"titre")."</font></B></center></td>\r\n";
echo "\t\t<td width='100'><center><font size='2'>".mysql_result($result_query,$i,"img")."</font></center></td>\r\n";
echo "\t\t<td width='100'><center><font size='2'>".mysql_result($result_query,$i,"son")."</font></center></td>\r\n";
echo "\t\t<td width='100'><center><font size='2'>".mysql_result($result_query,$i,"video")."</font></center></td>\r\n";
echo "\t\t<td width='75'><center><font size='2'>".mysql_result($result_query,$i,"date")."</font></center></td>\r\n";
echo"<TD width='50'><CENTER><font size='2'><a href='modifier.php?ID=idatrouver'><img border='0' src='modifier.gif'></a></font></center>";
echo"</font><TD width='50'><CENTER><B><font size='2'><a href='supprimer.php?ID=idatrouver' onclick=\"return confirm(Voulez-vous vraiment supprimer artisteatrouver - titreatrouver ?)\"><img border='0' src='poubelle.gif'></a>";

echo "\t</tr>\r\n";

$i++;
}
}
mysql_close();
?>


Si vous pouviez m'aider un peu à résoudre ce souci, ce serait gentil..
Merci d'avance smartass.gif
Patrick
Hum ...
Vu ton code je dirais que le problème vient de la requête elle-même.
Tu devrais remplacer
CODE
$result_query = mysql_query ($list_query);

par
CODE
$result_query = mysql_query($list_query) or die(mysql_error());


Si l'erreur n'est pas la même c'est que le problème vient de la création de la requête.

Tiens nous informés.

Par ailleurs en tant que nouveau membre, n'hésite pas à te présenter ici. Bienvenue sur le Hub.

++

Patrick
fplus39
Hello!
Merci pour ton aide

J'obtiens ce message :

CODE
Parse error: syntax error, unexpected T_VARIABLE in /monserveur/racine/sql/liste.php on line 67


ligne 67:
$num_rows = mysql_numrows($result_query)
Patrick
C'est bien ce que je pensais !
En affichant le contenu de la variable générée $list_query tu devrais facilement trouver l'erreur.

++

Patrick
fplus39
tu peux m'expliquer parce que j'e n'y connais pas grand chose et je decouvre au fur et à mesure...
Merci à toi
fplus39
tu veux dire que c'est cette variable qui pose problème?
CODE
    if (isset($HTTP_POST_VARS)) {
    $list_query = "SELECT * FROM mp3 WHERE ";
    $k = 0;
        while(list($variable, $value) = each($HTTP_POST_VARS)) {
        //make the query
            if ($k) {
                $list_query .= " OR $variable like '%$value%'";
            } else {
                $list_query .= "$variable like '%$value%'";
            }
        $k++;
        }
    }


tu peux m'expliquer stp?
Dan
Deux commentaires ...

$k est mis à 0 et ensuite tu fais un test if($k) ... il ne sera jamais vérifié.
Ensuite, tu dois écrire tes lignes comme ceci, si tu veux que $value soit interprété :

CODE
            if ($k) {
                $list_query .= " OR $variable like '%".$value."%'";
            } else {
                $list_query .= "$variable like '%".$value."%'";
            }
Patrick
Dan a été plus prompt que moi.
C'est exactement ça à mon avis.

Pour vérifier, tu pourrais mettre cette ligne
CODE
echo "requête : ".$list_query; die;

juste avant celle-ci
CODE
$result_query = mysql_query($list_query) or die(mysql_error());

pour vérifier que ta requête est bonne. Si c'est le cas, enlève la ligne que tu as ajouté et c'est parti, si ce n'est pas le cas tu dois modifier les lignes qui génèrent ta requête pour obtenir ce que tu souhaites.

++

Patrick
captain_torche
CITATION(Dan @ mercredi 8 octobre 2008 à 19:30) *
Ensuite, tu dois écrire tes lignes comme ceci, si tu veux que $value soit interprété :

Il me semble qu'une variable est toujours interprétée lorsqu'elle est mise dans une chaîne de caractères délimitée par doubles quotes (c'est ce dont je me sers, en tout cas).
Patrick
Oui Captain, mais dans le cas présent la variable est placée aussi entre simples quotes et là pas d'interprétation !
CODE
'%$value%'

il faut donc sortir la variable des simples quotes.

++

Patrick
captain_torche
Non, vu qu'ici, les simples quotes sont juste des caractères de la chaîne délimitée par les doubles quotes wink.gif
Patrick
Autant pour moi ! C'est ma fois vrai.

++

Patrick
fplus39
CITATION(Patrick @ jeudi 9 octobre 2008 à 09:24) *
Dan a été plus prompt que moi.
C'est exactement ça à mon avis.

Pour vérifier, tu pourrais mettre cette ligne
CODE
echo "requête : ".$list_query; die;

juste avant celle-ci
CODE
$result_query = mysql_query($list_query) or die(mysql_error());

pour vérifier que ta requête est bonne. Si c'est le cas, enlève la ligne que tu as ajouté et c'est parti, si ce n'est pas le cas tu dois modifier les lignes qui génèrent ta requête pour obtenir ce que tu souhaites.

++

Patrick

voilà le résultat :
CODE
requête : SELECT * FROM mp3 WHERE

Je suis désolé mais je découvre tout juste ce langage (j'aurais peut être dû commencer par le dire hypocrite.gif )
Donc en fait j'ai essayé de réadapter ce script pris ailleurs pour ma page...

concernant :
CODE
$k = 0;
        while(list($variable, $value) = each($HTTP_POST_VARS)) {
        //make the query
            if ($k) {
                $list_query .= " OR $variable like '%$value%'";
            } else {
                $list_query .= "$variable like '%$value%'";
            }
        $k++;

je dois reprendre le code que tu m'as donné tel quel?
Je dois supprimer $k = 0; ?
Je sais même pas sa signification...
Merci pour votre patience, ce n'est pas de la mauvaise volonté, promis smartass.gif
Dudu
Salut

SQL est un langage très simple.

  • SELECT va "sélectionner" quelque chose dans la base.
  • * indique qu'on cherche "tout ce qu'il y a dans une table".
  • FROM te permet de cibler dans quelle table tu vas sélectionner "tout ce qu'il y a dans la table". Dans ton cas, tu chercheras "tout ce qu'il y a dans la table mp3".
  • WHERE te permet d'affiner la recherche via une condition. Par exemple: "SELECT * FROM mp3 WHERE `dudu` = 1" va sélectionner toutes les entrées de la table mp3, mais uniquement celles où le champ "dudu" a la valeur "1"


Revenons à ta requête.
Quand tu n'as pas de recherche effectuée (donc sur ta première page), ton script lance cette requête SQL erronée:
SELECT * FROM mp3 WHERE
ce qui donne en traduction française:
"sélectionner toutes les entrées de la table mp3, mais uniquement celles où..."
Ben oui, mais où quoi ? tu n'indiques aucune condition ensuite !

Il faut donc enlever ce WHERE et ne le mettre dans la requête que lorsque tu effectues une recherche d'artiste.
Tu gardes juste "SELECT * FROM mp3" tout seul. Ou peut-être avec une clause "LIMIT 0, 30" si tu as beaucoup d'artistes.
fplus39
CITATION
Il faut donc enlever ce WHERE et ne le mettre dans la requête que lorsque tu effectues une recherche d'artiste.
Tu gardes juste "SELECT * FROM mp3" tout seul. Ou peut-être avec une clause "LIMIT 0, 30" si tu as beaucoup d'artistes.


Hello!
MAis si je comprends bien ce que tu dis:
En fait quand je ne fais aucune recherche, je ne devrais même pas avoir de Select, puisque je ne recherche rien, donc, je ne dois rien afficher r_question6161.gif

En fait je devrais avoir 2 conditions?
-si aucune recherche effectuée (au chargement de la page) > ne rien faire
-si le mot recherché n'est pas présent dans la base > Afficher un message (ça, ça marche actuellement)
poue le reste, afficher les résultats (ça fonctionne aussi)
Dudu
Salut

Ça dépend: que veux-tu faire de cette page lorsqu'on y accède sans faire de recherche d'artiste ?
Dire bonjour, ou bien afficher par défaut tous les artistes ?

Dans le premier cas, il manque un else dans ton code php. Dans lequel tu définis que lorsqu'il n'y a pas de variables POST envoyées, tu affiches un message de ton choix.
fplus39
Hello!
Désolé pour le retard de réponse...

En fait, quand il n'y a pas de recherche, j'affiche mes données réparties sous plusieurs pages...
Je ne peux pas te donner l'url, car c'est une page protégée mais le code pour afficher mes données est en place, donc, j'ai rajouté le module de recherche en haut de page...

Donc:
Si pas de recherche : on ne fait rien et on passe à la suite du code qui affiche les données...
Si la donnée recherchée n'existe pas dans la base, message qui le dit puis on passe à la suite et on affiche le code...
Si la donnée recherchée existe, on affiche le nombre de résultats et le résultat, puis on passe à la suite du code...

Je te remet toute le code que j'ai concernant la recherche, ce sera peut être plus facile d'apréhender mno souci:

CODE-BOX
<?
include("connect.inc");
mysql_connect($host, $user, $pass);
mysql_select_db("$bdd")
or die("Ouverture base impossible");

if (isset($HTTP_POST_VARS)) {
$list_query = "SELECT * FROM mp3 WHERE ";
$k = 0;
while(list($variable, $value) = each($HTTP_POST_VARS)) {
//make the query
if ($k) {
$list_query .= " OR $variable like '%$value%'";
} else {
$list_query .= "$variable like '%$value%'";
}
$k++;
}
}
?>
<center>
<form action="liste.php" method="post">
<table width="440">
<tr>
<td width="316">Rechercher un artiste :<input type="text" name="artiste" value="recherche" size="20" maxlength="50"></td>
<td width="114">
<input type="submit" value="Rechercher" style="float: right"></td>
</tr>
</table>
</form>

<table BORDER=5 bgcolor='#cad3fa'bgcolor='#cad3fa' bordercolorlight='#a4f8f7' width='950' style='border-collapse: collapse' bordercolor='#4d6af1' cellpadding='0' cellspacing='0';>
<?php

if (isset($list_query)) {
// if the query exist
//echo "requête : ".$list_query; die;
$result_query = mysql_query($list_query);
// submit the query
@$num_rows = mysql_numrows($result_query)
or print ("Il n'y a aucun artiste répondant à ce nom dans la base de données Fréquence Plus");
echo "<p>";
echo "Il y a ";
echo mysql_numrows($result_query);
echo " artiste(s) répondant à ce nom:";

// number of rows
$i = 0;

echo "<td width='25'><center><B><font size='3'>ID</font></B></center></td>";
echo "<td width='100'><center><B><font size='3'>Artiste</font></B></center></td>";
echo "<td width='100'><center><B><font size='3'>Titre</font></B></center></td>";
echo "<td width='100'><center><B><font size='3'>Visuel</font></B></center></td>";
echo "<td width='100'><center><B><font size='3'>Son</font></B></center></td>";
echo "<td width='100'><center><B><font size='3'>Vidéo</font></B></center></td>";
echo "<td width='75'><center><B><font size='3'>Date</font></B></center></td>";
echo "<td width='35'><center><B><font size='3'>Mod</font></B></center></td>";
echo "<td width='35'><center><B><font size='3'>Suppr</font></B></center></td>";

while($i != $num_rows) {
echo "\t<tr>\r\n";
echo "\t\t<td width='25'><center><B><font size='2'>".mysql_result($result_query,$i,"ID")."</font></B></center></td>\r\n";
echo "\t\t<td width='100'><center><B><font size='2'>".mysql_result($result_query,$i,"artiste")."</font></B></center></td>\r\n";
echo "\t\t<td width='100'><center><B><font size='2'>".mysql_result($result_query,$i,"titre")."</font></B></center></td>\r\n";
echo "\t\t<td width='100'><center><font size='2'>".mysql_result($result_query,$i,"img")."</font></center></td>\r\n";
echo "\t\t<td width='100'><center><font size='2'>".mysql_result($result_query,$i,"son")."</font></center></td>\r\n";
echo "\t\t<td width='100'><center><font size='2'>".mysql_result($result_query,$i,"video")."</font></center></td>\r\n";
echo "\t\t<td width='75'><center><font size='2'>".mysql_result($result_query,$i,"date")."</font></center></td>\r\n";
echo"<TD width='50'><CENTER><font size='2'><a href='modifier.php?ID=idatrouver'><img border='0' src='modifier.gif'></a></font></center>";
echo"</font><TD width='50'><CENTER><B><font size='2'><a href='supprimer.php?ID=idatrouver' onclick=\"return confirm(Voulez-vous vraiment supprimer artisteatrouver - titreatrouver ?)\"><img border='0' src='poubelle.gif'></a>";

echo "\t</tr>\r\n";

$i++;
}
}
mysql_close();
?>
</center>
</table>
</form>

</p>
<p>&nbsp;</p>


</center>


merci pour votre gentillesse, votre patience, et votre aide smile.gif
fplus39
CITATION
Dan: lundi 13 octobre 2008 à 18:53
Edition : Comme signalé dans ton premier post, merci d'utiliser CODEBOX pour les codes de plus de 10 lignes !!!


Désolé, je n'avais pas vu que mon premier post avait été édité pour me laisser un message, ni qu'on pouvait utiliser cette balise.
Encore toutes mes excuses
Bonne fin de journée à toutes et tous smile.gif
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.