IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Une page simple, oui mais...


Sujet :

Langage PHP

  1. #1
    Membre éclairé Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    405
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 405
    Par défaut Une page simple, oui mais...
    Bonjour.

    Je me suis lancé dans la conception d'une page originale PHP/TPL avec comme prise en main, une page qui affiche la liste des membres et le nombre de leurs messages postés. Seulement, les données ne s'affichent pas...

    Fichier stats.php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    <?php
     
    define('IN_PHPBB', true);
    $phpbb_root_path = './';
    include($phpbb_root_path . 'extension.inc');
    include($phpbb_root_path . 'common.'.$phpEx);
     
    $result = mysql_query('SELECT username, user_posts FROM phpbb_users');
     
    $userdata = session_pagestart($user_ip, PAGE_STATS);
    init_userprefs($userdata);
     
    $page_title = $lang['Stats'];
    include($phpbb_root_path . 'includes/page_header.'.$phpEx);
     
    $template->set_filenames(array(
        'body' => 'stats_body.tpl')
    );
     
    while( $row = mysql_fetch_array($result) )
    	{
    		$template->assign_block_vars( 'user', array(
    			'STATS_USER' => stripslashes($row['username']),
    			'STATS_USER_POSTS' => $row['user_posts']
    		));
    	}
     
    $template->assign_vars( array(
    	'L_STATS_USER_POSTS' => $lang['Stats_user_posts'],
      ));
     
    $template->pparse('body');
     
    include($phpbb_root_path . 'includes/page_tail.'.$phpEx);
     
    ?>
    Fichier stats_body.tpl (juste le code utile) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <table width="100%" cellpadding="2" cellspacing="1" border="0" class="forumline">			
    	<tr>
    		<td height="25" colspan="2" class="catHead"><span class="genmed"><b>{L_STATS_USER_POSTS}</b></span></td>
    	</tr>			
    	<tr>
    		<td width="70%" align="left" class="row1"><span class="genmed">{user.STATS_USER}</span></td>
    		<td width="30%" align="left" class="row1"><span class="genmed">{user.STATS_USER_POSTS}</span></td>
    	</tr>
    </table>
    Le formatage et s'aspect sont conformes, l'étiquette L_STATS_USER_POSTS s'affiche (configurée dans lang_main.php) mais les colonnes de données restent désespérément vides.

    Un petit coup de main serait le bienvenu...

    Merci.

  2. #2
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Salut

    Il me semble que tu n'as pas défini le block dans ton fichier tpl. Par conséquent, le moteur de templates ne sait pas ce qu'il doit répéter.

    Essaie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <!-- BEGIN user -->
       <tr>
          <td width="70%" align="left" class="row1"><span class="genmed">{user.STATS_USER}</span></td>
          <td width="30%" align="left" class="row1"><span class="genmed">{user.STATS_USER_POSTS}</span></td>
       </tr>
    <!-- END user -->

  3. #3
    Membre éclairé Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    405
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 405
    Par défaut
    Bon, je pouvais toujours chercher l'erreur dans le fichier PHP ! Je te remercie...

    Tant qu'on y est, que faut-il rajouter à la requête pour que ne s'affichent uniquement que les 10 "meilleurs" posteurs par ordre décroissant ?

  4. #4
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    LIMIT 10 et ORDER BY DESC

  5. #5
    Membre éclairé Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    405
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 405
    Par défaut
    Ok, ça fonctionne. Mais cela m'amène à un autre problème. A supposer que je veuille intégrer deux tableaux (ou plus) dans la page php, par exemple :

    - 1 qui affiche les 10 meilleurs posteurs
    - 1 qui affiche les 10 derniers inscrits

    Comment faire pour intégrer les deux requêtes dans "result" et ordonner correctement les données ?

  6. #6
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Tu as deux solutions :
    • dans la même requête avec UNION en SQL
    • dans une autre requête : fais ton while(mysql_fetch) pour mettre toutes les lignes des résultats de chaque requête dans le même tableau puis trie-le ; tu accèderas ensuite aux éléments de ton tableau par foreach au lieu de while

  7. #7
    Membre éclairé Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    405
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 405
    Par défaut
    Merci encore, mais là, ça dépasse mes compétences (je n'y connais pratiquement rien dans la manipulation des données SQL).

    J'avais bien essayé de mettre deux requêtes successives, une "result1" et une "result2", et d'instinct, j'ai formaté comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    $result1 = mysql_query('SELECT username, user_posts FROM phpbb_users ORDER BY user_posts DESC LIMIT 0 , 10');
     
    $result2 = mysql_query('SELECT username, user_id FROM phpbb_users ORDER BY user_id DESC LIMIT 0 , 10');
     
    while( $row = mysql_fetch_array($result1) )
       {
          $template->assign_block_vars( 'user', array(
             'STATS_USER' => stripslashes($row['username']),
             'STATS_USER_POSTS' => $row['user_posts']
          ));
       }
     
    while( $row = mysql_fetch_array($result2) )
       {
          $template->assign_block_vars( 'user', array(
             'STATS_USER' => stripslashes($row['username']),
             'STATS_USER_ID' => $row['user_id']
          ));
       }
    Et naturellement, ça ne fonctionne pas, j'ai des données redondantes dans les deux tableaux...

  8. #8
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Comment ça "redondantes" ?
    Tu voudrais ne pas répéter les utilisateurs qui apparaissent dans les 2 résultats ?

    Sans rien comprendre à la finalité de la chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    $result1 = mysql_query('SELECT user_id, username, user_posts FROM phpbb_users ORDER BY user_posts DESC LIMIT 0 , 10');
     
    $result2 = mysql_query('SELECT user_id, username FROM phpbb_users ORDER BY user_id DESC LIMIT 0 , 10');
     
    $users = array();
     
    while( $row = mysql_fetch_array($result1) ){
       if(!in_array($row['user_id'], $users){
          $users[] = $user['user_id'];
       }
    }
     
    while( $row = mysql_fetch_array($result2) ){
       if(!in_array($row['user_id'], $users){
          $users[] = $user['user_id'];
       }
    }
     
     
    foreach($users as $user){
       $template->assign_block_vars( 'user', array(
             'STATS_USER' => stripslashes($user['username']),
             'STATS_USER_ID' => $user['user_id'],
             'STATS_USER_POSTS' => empty($user['user_posts']) ? '' : $user['user_posts']
       ));
    }

    Sinon, pourquoi ne pas mettre plusieurs champs dans le ORDER BY ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT user_id, username, user_posts
    FROM phpbb_users
    ORDER BY user_posts DESC, user_id DESC
    DESC LIMIT 0, 10

  9. #9
    Membre éclairé Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    405
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 405
    Par défaut
    Oui, "redondantes". Je fais un test avec trois utilisateurs. Avec le formatage de mon post précédent, j'ai :

    - utilisateur 1
    - utilisateur 2
    - utilisateur 3
    - utilisateur 1
    - utilisateur 2
    - utilisateur 3

    Dans les deux tableaux, au lieu de n'en avoir que trois dans chaque tableau, classés selon les requêtes.

    Je vais essayer ce que tu viens de poster.

  10. #10
    Membre éclairé Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    405
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 405
    Par défaut
    Bon, la finalité de la chose. Je voudrais intégrer une page "statistiques" dans un forum, où j'aurais plusieurs petits tableaux :

    - les 10 meilleurs posteurs
    - les 10 derniers inscrits
    - les 10 sujets les plus vus
    - les 10 sujets ayant eu le plus de réponses
    - etc...

    Je cherche donc à formater tout ça car c'est la première fois que je conçois une page php originale avec récupération directe de données dans la base, et c'est pas facile facile.
    La solution de "facilité" aurait été de créer une page php par requête, mais...

    Ca donne ça (en construction) :



    Voilà...

  11. #11
    Membre éclairé Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    405
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 405
    Par défaut
    Message d'erreur :

    Parse error: parse error, unexpected '{' in /var/www/sdb/8/8/forum/forum/stats.php on line 34

    Ce qui correspond à cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(!in_array($row['user_id'], $users){

  12. #12
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Bien sûr que tu as des données redondantes si tu fais le test avec une petite base !
    Oublie le dernier code que je t'ai donné, il ne te correspond pas.

    Tu es sur la bonne voie avec ce que tu m'as donné (les deux boucles while), continue.

  13. #13
    Membre éclairé Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    405
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 405
    Par défaut
    Avec ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $result1 = mysql_query('SELECT username, user_posts FROM phpbb_users ORDER BY user_posts DESC LIMIT 0 , 10');
    $result2 = mysql_query('SELECT username, user_id FROM phpbb_users ORDER BY user_id DESC LIMIT 0 , 10');
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    while( $row = mysql_fetch_array($result1) )
       {
          $template->assign_block_vars( 'user', array(
             'STATS_USER' => stripslashes($row['username']),
             'STATS_USER_POSTS' => $row['user_posts']
          ));
       }
     
    while( $row = mysql_fetch_array($result2) )
       {
          $template->assign_block_vars( 'user', array(
             'STATS_USER' => stripslashes($row['username']),
    		 'STATS_USER_ID' => $row['user_id']
          ));
       }
    Voilà ce que j'appelle des données redondantes :


  14. #14
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Ah, oui, pardon.

    Il faut appeler un block différent, ça me paraissait évident puisque ça apparait dans un bloc différent !

    Au lieu de 'user' pour les deux (ce nom est trop générique), tu peux en appeler un 'most_posts' et l'autre 'last_registered'.

  15. #15
    Membre éclairé Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    405
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 405
    Par défaut
    Plus rien qui s'affiche... Je te remercie quand même...

  16. #16
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Il faut changer le nom à la fois dans le .php et dans le .tpl hein

  17. #17
    Membre éclairé Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    405
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 405
    Par défaut
    C'est bon, ça fonctionne ; j'avais oublié de renommer les "begin" et "end" dans le tpl. Merci pour ton aide...

    Par contre, j'aurais encore une petite demande :

    - le code de la requête pour afficher les sujets les plus vus
    - le code de la requête pour les sujets qui ont eu le plus de réponses
    - le code de la requête pour afficher le nombre de sujets postés par membre

    Et aussi, dans chaque requête, comment faire pour ne pas afficher l'utilisateur "Anonymous" ?
    Et pour finir, dans les 10 derniers inscrits, j'aimerais savoir comment formater le champ "user_regdate" pour avoir un affichage qui ne soit pas une série de chiffres. En fait, je connais la manoeuvre mais je ne sais pas l'intégrer au php.

    Merci d'avance.

  18. #18
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Groumpf...

    Je veux bien aider mais il y a des limites quand même :/
    Tu as l'air de très bien te débrouiller tout seul donc je préfère te donner un lien, ça ira plus vite pour moi et ce sera largement plus intéressant pour toi :
    http://sql.developpez.com/

  19. #19
    Membre éclairé Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    405
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 405
    Par défaut
    Merci. J'ai déjà bien avancé. Cependant, il y a une requête où je bloque car elle utilise deux tables : l'affichage des meilleurs posteurs de sujets.

    J'avais déjà installé le mod pour l'afficher dans chaque message et dans le profil des membres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $sql = "SELECT COUNT(topic_id) AS topics 
        FROM ". TOPICS_TABLE ." 
        WHERE topic_poster = '". $postrow[$i]['user_id'] ."'";
    Seulement, pour "l'intégration", je ne sais pas comment "convertir" ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     $topics = $db->sql_fetchrow($result); 
      $poster_topics = ( $postrow[$i]['user_id'] != ANONYMOUS ) ? $lang['Topics'] . ': '.  ( $topics['topics'] == 0 ? $lang['None'] : $topics['topics'] ) : '';
    Sous cette forme là, comme pour les autres requêtes simples :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while( $row = mysql_fetch_array($result) )
       {
          $template->assign_block_vars( 'stats_04', array(
            'STATS_USER' => stripslashes($row['user_id']),
             'STATS_USER_TOPICS' => $row['topics']
          ));
       }

Discussions similaires

  1. Préparer une certification UNIX. Oui mais laquelle?
    Par ceroxan dans le forum Distributions
    Réponses: 4
    Dernier message: 26/04/2009, 04h48
  2. Réponses: 15
    Dernier message: 30/08/2008, 02h41
  3. probleme de deploiement d'une page simple en JSP
    Par abohafss dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 18/10/2007, 16h39
  4. Double background sur une page simple sans frame.
    Par kuranes dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 20/09/2006, 22h59
  5. [C#] Redirection d'une frame vers une page simple
    Par st0j dans le forum ASP.NET
    Réponses: 6
    Dernier message: 17/06/2005, 15h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo