8791 sujets

Développement web côté serveur, CMS

Salut à tous,

Je code depuis quelques jours à peine le PHP et je bloque lors qu'une requête SQL.
J'ai 2 tables :
- utilisateurs contenant id ,pseudo
- infos contenant id (le même que dans utilisateurs) et les ips qui ont visité la page du membre.

Je veux faire une requête pour afficher ceux qui ont comptabilisés le plus d'ip en ne gardant que les 10 premiers. Mon problème c'est que j'ai du mal à jongler avec 2 tables ...


// on se connecte à MySQL
mysql_connect("localhost", "utilisateur", "mdp");

// on sélectionne la base
mysql_select_db("database");

// on crée la requête SQL
$sql = 'SELECT pseudo FROM utilisateurs LIMIT 0 , 10 ';

// on envoie la requête
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());

// on fait une boucle qui va faire un tour pour chaque enregistrement
while($data = mysql_fetch_assoc($req))
    {
// on affiche les informations de l'enregistrement en cours
    echo '<b>'.$data['pseudo'].' </b>';
    }
// on ferme la connexion à mysql
mysql_close();
?>


Voilà ma simple requête pour afficher les 10 premiers pseudo mais je les voudrais trier en fonction du nombre d'ip qu'ils ont comptabilisés et afficher le total ce qui donnerait :

utilisateur : Toto . points : 73

Merci de votre aide Smiley biggol
Modifié par k4rnage (09 Jul 2007 - 20:14)
Hello,


Comme tu as pu le lire dans le sujet d'Annonce de ce salon, le but du forum Alsacréations n'est pas de répondre à des questions portant sur vos premiers pas en PHP, ou l'apprentissage des technologies serveurs en général, mais bien des interactions entre les langages serveurs et les Standards.

Je ne vais pas fermer ce sujet car des réponses pourraient t'être apportées, mais je préfère te signaler qu'il ne faut peut-être pas t'attendre à un miracle et qu'il serait préférable de consulter un forum dédié à PHP Smiley cligne
J'y penserais pour la prochaine fois, merci de ne pas avoir fermé le topic Smiley smile
Modifié par k4rnage (10 Jul 2007 - 00:41)
Salut Smiley cligne ,

tu pourrais essayer ça :
<?PHP
mysql_connect("localhost", "utilisateur", "mdp");
mysql_select_db("database");
$sql1 = 'SELECT id, pseudo FROM utilisateurs LIMIT 0 , 10 ';
$req1 = mysql_query($sql1) or die('Erreur SQL !<br>'.$sql1.'<br>'.mysql_error());
while($data1 = mysql_fetch_assoc($req1))
    {
	$id = $data1['id'];
	$sql2 = mysql_query('SELECT count(*) FROM infos WHERE infos.id = '.$id);
	$nb_ips = mysql_result( $sql2, 0 );
    echo '<b>'.$data1['pseudo'].' :</b> '.$nb_ips.'<br>';
    }
mysql_close();
?>


A+ Smiley smile
Il m'affiche bien les pseudos mais avec une erreur :

Warning: mysql_result(): supplied argument is not a valid MySQL result resource in test.php on line 46 toto : (toto étant un des utilisateurs).

Ceci à chaque pseudo, et je crois qu'il me sort les 10 premiers pseudo de la BDD et non ceux qui ont comptabilisés le plus d'ip.
Modifié par k4rnage (10 Jul 2007 - 00:22)
Salut,

Heyoan, tu es fatigué ce soir, quel erreur :

<?PHP

mysql_connect("localhost", "utilisateur", "mdp");

mysql_select_db("database");

$sql1 = 'SELECT id, pseudo FROM utilisateurs LIMIT 0 , 10 ';

$req1 = mysql_query($sql1) or die('Erreur SQL !<br>'.$sql1.'<br>'.mysql_error());

while($data1 = mysql_fetch_assoc($req1))

    {

	$id = $data1['id'];

	$sql2 = mysql_query('SELECT count(*) FROM infos WHERE infos.id = '.$id.'');

	$nb_ips = mysql_result( $sql2, 0 );

    echo '<b>'.$data1['pseudo'].' :</b> '.$nb_ips.'<br>';

    }

mysql_close();

?>


Tu n'auras plus l'erreur k4rnage ainsi Smiley cligne

Pour informations, à chaque fois que Mysql te revois cette erreur c'est soit :

- Que tes requêtes sont mal formées (c'était le cas ici)
- Que ton script n'arrive pas à joindre la base.
Modifié par Super_baloo8 (10 Jul 2007 - 00:51)
Je suis sur que des pointures tel que Heyoan pourront t'aider pour faire la liaison entre tes deux tables. J'en suis incapables.

Par contre, une autre solution serais, lorsque tu rentre une ip dans une table, tu incrémente un chiffre dans la premiere table qui serais le nombre d'ip.
En effet je n'ai plus l'erreur merci, mais les résultats sont simplement les 10 premières entrée de la BDD et non celles qui ont comptabilisées le plus d'ip. Il me semble que pour celà je dois rajouter un "order by" mais je ne sais pas trop comment l'intégrer Smiley confused
Modifié par k4rnage (10 Jul 2007 - 04:21)
Salut,

Tu peux essayer ça :
<?PHP
mysql_connect("localhost", "root", "");
mysql_select_db("test");
$sql = 'SELECT u.id, pseudo, count( * ) AS nb_ips'
        . ' FROM `utilisateurs` AS u, `infos` AS i'
        . ' WHERE u.id = i.id'
        . ' GROUP BY u.id, pseudo'
        . ' ORDER BY nb_ips DESC '
        . ' LIMIT 0 , 10';

$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
while($data = mysql_fetch_assoc($req))
    {
    echo '<b>'.$data['pseudo'].' :</b> '.$data['nb_ips'].'<br>';
    }
mysql_close();
?>


A+

@Super_baloo8 : avec un id numérique le premier code devrait fonctionner (testé chez moi Smiley cligne ). Et merci pour le terme de 'pointure' mais c'est vraiment exagéré pour un dilettante comme moi ! Smiley ravi
Heyoan, tu avais juste oublié de fermer un ' dans les deuxième requête. Ca aurais pu marché si tu ne l'avais ouverte.

Dilettante ? J'ai du chercher pour comprendre ce que cela voulais dire. Et bien dis moi, en tant qu'amateur (comme moi d'ailleurs) tu te débrouilles pas mal !