probleme de requete

Mnaheman
Invité n'ayant pas de compte PHPfrance

15 mars 2008, 21:37

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.

ViPHP
ViPHP | 5924 Messages

15 mars 2008, 23:59

Dans ta requète, tu sélectionnes COUNT(*) qui rend un seul enregistrement, contenant le nombre d'enregistrements correspondant à ta sélection…

Invité
Invité n'ayant pas de compte PHPfrance

16 mars 2008, 00:28

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... :wink:

ViPHP
ViPHP | 5924 Messages

16 mars 2008, 00:38

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.

Invité
Invité n'ayant pas de compte PHPfrance

16 mars 2008, 00:48

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 ?

Invité
Invité n'ayant pas de compte PHPfrance

16 mars 2008, 02:40

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

ViPHP
ViPHP | 5924 Messages

16 mars 2008, 03:02

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é.

Invité
Invité n'ayant pas de compte PHPfrance

16 mars 2008, 09:43

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");  


Invité
Invité n'ayant pas de compte PHPfrance

16 mars 2008, 10:36

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

Invité
Invité n'ayant pas de compte PHPfrance

16 mars 2008, 10:49

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.

Invité
Invité n'ayant pas de compte PHPfrance

16 mars 2008, 11:07

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";
}
}  

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

16 mars 2008, 11:53

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.

Invité
Invité n'ayant pas de compte PHPfrance

16 mars 2008, 12:05

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;
   }
?>


ViPHP
ViPHP | 5924 Messages

16 mars 2008, 12:20

Euh, pour ton problème de 'table8', si tu lui écris "… table8 …", pourquoi devrait-il comprendre "…" . $table8 . "…" ? …

Invité
Invité n'ayant pas de compte PHPfrance

16 mars 2008, 19:49

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 ?