Page 1 sur 2
probleme de requete
Posté : 15 mars 2008, 21:37
par Mnaheman
Bonjour la communauté;
Voilà j'essaye de réaliser une messagerie. Par conséquent je voudrais afficher le nombre de messages envoyés par différentes personnes utilisant des pseudos.
Je crée un xml mais celui ci reste vide :
<?php
function onlineMess($pseudo)
{
GLOBAL $db,$table8;
$pseudo = trim($pseudo);
$sql1=mysql_query("SELECT COUNT(*) FROM $table8 WHERE membrePseudoRec= '".$pseudo."'");
$row=mysql_fetch_row($sql1);
$totamessage =$row[0];
// On regarde s'il y a des éléments
if ( mysql_num_rows($sql1))
{
$xml = '<?xml version="1.0" encoding="ISO-8859-1"?>'.'<message>';
while ($data = mysql_fetch_array($sql1)) {
$xml .= '<personne';
$xml .= ' pseudo='.'"'.$data['membrePseudoEnv'].'"';
$xml .= ' nombre='.'"'.$totamessage.'"';
$xml .= '/>';
}
$xml .= '</message>';
$fp = fopen("myPROFECTRONonlineShowMess.xml", 'w+');
fputs($fp, $xml);
fclose($fp);
return "error=ok";}
else
{
return "error=pasok";
}
}
Je dois faire une mauvaise requete ; si qq peut m'aider.
Posté : 15 mars 2008, 23:59
par Sékiltoyai
Dans ta requète, tu sélectionnes COUNT(*) qui rend un seul enregistrement, contenant le nombre d'enregistrements correspondant à ta sélection…
Posté : 16 mars 2008, 00:28
par Invité
Bon je suis un peu perdu...
Voici les noms des champs: id,membrePseudoRec,membrePseudoEnv,membreObjet,membreMessage
et le tableau
1 SCIENCEMAN SCIEEMAN salut coui PROFECTRON
2 SCIENCEMAN PROFECTRON azerty salut couc
3 SCIENCEMAN PROFECTRON
jE SOUHAITE AFFICHER un truc du genre :
de la part de profectron vous avez 2 messages
de la part de scieeman vous avez 1 message
jUSTE UN PEU D'AIDE...

Posté : 16 mars 2008, 00:38
par Sékiltoyai
Tu dois utiliser GROUP BY. GROUP BY te regroupera tes enregistrements selon le champ que tu lui auras donné, c'est à dire que tous les enregistrements ayant la même valeur pour ce champ seront regroupés.
Une fois regroupés, COUNT(*) pourra te donner le nombre d'enregistrements qui ont été regroupés. De la même manière, tu peux sélectionner le(s) champ(s) selon le(s)quel(s) tu as regroupé. Si tu essayes de sélectionner un autre champ, tu auras la valeur de l'un des enregsitrements, mais tu ne seras pas assuré d'avoir une valeur correcte.
Ainsi, une requète de ce genre :
Code : Tout sélectionner
SELECT champ1, COUNT(*) nombre FROM table WHERE champ2="valeur" GROUP BY champ1;
Te retourneras la valeur de champ1 et pour chacune de ces valeur, le nombre d'enregistrements qui ont cette valeur et qui répondent à la condition du WHERE.
Posté : 16 mars 2008, 00:48
par Invité
en tout cas un grand merci pour ton éclairage.
J'ai essayé ceci :
function onlineMess($pseudo)
{
GLOBAL $db,$table8;
$pseudo = trim($pseudo);
$sql1=mysql_query(" SELECT membrePseudoEnv, COUNT(*) nombre FROM table8 WHERE membrePseudoRec= '".$pseudo."' GROUP BY membrePseudoEnv");
if ( mysql_num_rows($sql1))
{
$xml = '<?xml version="1.0" encoding="ISO-8859-1"?>'.'<message>';
while ($data = mysql_fetch_array($sql1)) {
$xml .= '<personne';
$xml .= ' pseudo='.'"'.$data['membrePseudoEnv'].'"';
$xml .= ' nombre='.'"'.$data['nombre'].'"';
$xml .= '/>';
}
$xml .= '</message>';
$fp = fopen("myPROFECTRONonlineShowMess.xml", 'w+');
fputs($fp, $xml);
fclose($fp);
return "error=ok";}
else
{
return "error=pasok";
}
}
mais mon xml affiche :
?xml version="1.0" encoding="ISO-8859-1"?><message></message>
Est-ce un problème avec nombre ?
Posté : 16 mars 2008, 02:40
par Invité
j'ai modifié le code :
function onlineMess($pseudo)
{
GLOBAL $db,$table8;
$pseudo = trim($pseudo);
$sql= mysql_query(" SELECT membrePseudoEnv, COUNT(membreMessage) FROM table8 WHERE membrePseudoRec= '".$pseudo."' GROUP BY membrePseudoEnv");
if (mysql_num_rows($sql))
{
$xml = '<?xml version="1.0" encoding="ISO-8859-1"?>'.'<message>';
while($row = mysql_fetch_array($sql)){
$xml .= '<personne';
$xml .= ' pseudo='.'"'.$row['membrePseudoEnv'].'"';
$xml .= ' nombre='.'"'.$row['COUNT(membreMessage)'].'"';
$xml .= '/>';
}
$xml .= '</message>';
$fp = fopen("myPROFECTRONonlineShowMess.xml", 'w+');
fputs($fp, $xml);
fclose($fp);
return "error=ok";}
else
{
return "error=pasok";
}
}
mais j'ai un :
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /web/profectron/www/myPROFECTRONclub/myPROFECTRONonline.php on line 87,
et si supprimer le code qui correspond à cette erreur j'ai :
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /web/profectron/www/myPROFECTRONclub/myPROFECTRONonline.php on line 91
Posté : 16 mars 2008, 03:02
par Sékiltoyai
Ton code n'est pas correct, réutilise celui que tu as posté à ton post précédent. Pour le débuggage, je te suggère un var_dump() pour examiner le contenu de $data dans ta boucle, ainsi que d'autres variables si tu en vois la nécessité.
Posté : 16 mars 2008, 09:43
par Invité
Bon j'ai quivi ton conseil j'ai repris le code du post précédent en incluant un var_dump mais j'ai toujours les erreurs.
Donc je ne peux pas analyser les variable.
Le problème doit venir de cette ligne :
$sql1=mysql_query("SELECT membrePseudoEnv, COUNT(*) nombre FROM table8 WHERE membrePseudoRec= '".$pseudo."' GROUP BY membrePseudoEnv");
Posté : 16 mars 2008, 10:36
par Invité
Bon j'ai absolument besoin d'y parvenir...
j'ai tout modifier pour comprendre ce qu'il se passe :
j'ai fait ceci :
function onlineMess($pseudo)
{
GLOBAL $db,$table8;
$pseudo = trim($pseudo);
// $sql1=mysql_query("SELECT membrePseudoEnv, COUNT(membrePseudoMess) FROM table8 WHERE membrePseudoRec= '".$pseudo."' GROUP BY membrePseudoEnv");
$query = "SELECT membrePseudoEnv, COUNT(membreMessage) FROM table8 WHERE membrePseudoRec= '".$pseudo."' GROUP BY membrePseudoEnv";
$result = mysql_query($query) or die(mysql_error());
while($row = mysql_fetch_array($result)){
var_dump($row['COUNT(membreMessage)']);
var_dump($row['membrePseudoEnv']);
}
}
et en retour j'ai Table 'profectron.table8' doesn't exist alors qu'elle existe bien.
J'y comprends plus rien
Posté : 16 mars 2008, 10:49
par Invité
si je remplace le nom de la table8 par son nom alors en sortie j'ai :
function onlineMess($pseudo)
{
GLOBAL $db,$table8;
$pseudo = trim($pseudo);
$query = mysql_query("SELECT membrePseudoEnv, COUNT(membreMessage) FROM membre_mail WHERE membrePseudoRec= '".$pseudo."' GROUP BY membrePseudoEnv");
$result = ($query) or die(mysql_error());
while($row = mysql_fetch_array($result)){
var_dump($row['COUNT(membreMessage)']);
var_dump($row['membrePseudoEnv']);
}
}
string(1) "2" string(10) "PROFECTRON" string(1) "1" string(8) "SCIEEMAN"
je ne comprends pas car le nom de ma table8 est dans un fichier qui regroupe tous les noms des tables.
Posté : 16 mars 2008, 11:07
par Invité
J'y suis presque mais je peux pas utiliser table8 mais son nom. Pourquoi ?
function onlineMess($pseudo)
{
GLOBAL $db,$table8;
$pseudo = trim($pseudo);
$query = mysql_query("SELECT membrePseudoEnv, COUNT(membreMessage) FROM membre_mail WHERE membrePseudoRec= '".$pseudo."' GROUP BY membrePseudoEnv");
$result = ($query) or die(mysql_error());
if ( mysql_num_rows($query))
{
$xml = '<?xml version="1.0" encoding="ISO-8859-1"?>'.'<online>';
while ($row = mysql_fetch_array($query)) {
$xml .= '<personne';
$xml .= ' pseudo='.'"'.$row['membrePseudoEnv'].'"';
$xml .= ' nombre='.'"'.$row['COUNT(membreMessage)'].'"';
$xml .= '/>';
}
$xml .= '</online>';
$fp = fopen("myPROFECTRONonlineShowMess.xml", 'w+');
fputs($fp, $xml);
fclose($fp);
return "error=ok";}
else
{
return "error=pasok";
}
}
Posté : 16 mars 2008, 11:53
par Hubert Roksor
Je ne sais pas quel est le problème avec ton "table8" (d'autant plus que ni $table8 ni $db ne sont utilisés) mais il y a d'autres choses que tu devrait changer.
Tu as posté dans le forum PHP5, donc je présume que tu utilises PHP 5. Pourtant, tu n'utilises que des fonctions de PHP 3. PHP 5 possède SimpleXML, qui est le meilleur moyen de créer un document XML. Il offre aussi le support des exceptions, plutôt que d'utiliser des valeurs de retour douteuses. Je te laisse consulter le manuel pour en savoir plus.
<?php
function onlineMess($pseudo)
{
global $db;
$pseudo = trim($pseudo);
$sql = " SELECT membrePseudoEnv, COUNT(membreMessage) AS cnt
FROM membre_mail
WHERE membrePseudoRec = '" . $pseudo . "'
GROUP BY membrePseudoEnv";
$result = mysql_query($sql, $db);
if (!$result)
{
throw new Exception('Erreur SQL: ' . mysql_error($db));
}
$row = mysql_fetch_assoc($result);
if (!$row)
{
throw new Exception('Aucun enregistrement');
}
$online = simplexml_load_string('<?xml version="1.0" encoding="ISO-8859-1"?><online />');
do
{
$personne = $online->addChild('personne');
$personne['pseudo'] = $row['membrePseudoEnv'];
$personne['nombre'] = $row['cnt'];
}
while ($row = mysql_fetch_assoc($result));
$online->asXML('myPROFECTRONonlineShowMess.xml');
}
De plus, cette fonction est
vulnérable à l'injection de SQL et devrait utiliser mysql_real_escape_string.
Posté : 16 mars 2008, 12:05
par Invité
Merci pour ton éclairage. J'apprends...
Sinon pour répondre au problème de table8 :
j'ai en tête du fichier qui contient le code du poste précédent :
if (!file_exists('../myPROFECTRONphp/myPROFECTRONconf.inc.php'))
{
echo 'Le fichier myPROFECTRONconf.inc.php manque à l\'appel !';
}
else {
require('../myPROFECTRONphp/myPROFECTRONconf.inc.php');
}
dans le myPROFECTRONconf.inc.php, j'ai placé toutes les caractéristiques de connexion à la base de données et le nom des tables utilisées par le site.
<?php
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
error_reporting(E_ALL);
$adress = 'http://www.site.com/fichier.php?';
$adressite = 'http://www.site.com';
$adressmail='[email protected]';
$host = '';
$dbuser = '';
$dbpass = '';
$dbname = '';
$table = 'membre_pr';
$table2 = 'membre_df';
$table3 = 'journal';
$table4 = 'membre_vote';
$table5 ='membre_newsletter';
$table6 ='membre_online';
$table7 ='site_vote';
$table8 ='membre_mail';
$semaine = 7; // nombre de jours que sont conservées les IP dans la base de données (défaut : 2 jours)
$mois = 1; // intervalle de temps en minutes pour compter le nombre de connectés des X dernières minutes (défaut : 2 minutes)
$periode = 2; // durée en heures pendant laquelle une IP est comptée comme unique (défaut : 24h)
$total_initial = 0; // nombre initial de visiteurs au compteur
$db = @mysql_connect($host,$dbuser,$dbpass) or die("error=Impossible de se connecter à $host");
$db = mysql_select_db($dbname);
if(!$db)
{
print "error=Impossible de se connecter à la table $dbname";
exit;
}
?>
Posté : 16 mars 2008, 12:20
par Sékiltoyai
Euh, pour ton problème de 'table8', si tu lui écris "… table8 …", pourquoi devrait-il comprendre "…" . $table8 . "…" ? …
Posté : 16 mars 2008, 19:49
par Invité
oulala ... je crois que j'ai de la m.......dans les yeux.
Un énorme merci à toi.
Sinon tu as donné une piste pour éviter les injections; je me suis pressé de voir cela mais je vois pas trop comment l'adapter au code.
Si peux me guider un peu ?