PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 28-12-2009 16:32:42

Ralph303
Membre
Lieu : St-Cyr l'Ecole
Inscription : 30-05-2009
Messages : 98
Site Web

Encore un bug trivial avec une variable de session

Bonjour,

décidément, je n'ai pas de chance avec mes variables de session...
Ce bug est trivial. Il n'y a pas de JavaScript cette fois ci...

J'ai ajouté des liens de navigation dans les derniers inscrits du genre "<<  <  >  >>", premiers, précédents, suivants et derniers.
Pour savoir où j'en suis dans les derniers inscrits, j'ai une variable de session $_SESSION['courant'] qui contient l'id du membre courant.

Dans index.php, j'initialise cette variable de session avec le nombre d'inscrits:


<?php
  // Déclaration des variables de session
  session_start();

  // sélection de la base  
  mysql_select_db('ma_base',$db)  or die('Erreur de selection '.mysql_error());

  // On compte le nombre d'inscrits
  $sql="select * FROM inscription";
  $result=mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
 
  // Le membre courant est le nombre de membres
  $_SESSION['courant']=mysql_num_rows($result);
?>
 

Une fois que l'utilisateur est loggé, on ne reviens jamais dans index.php et on va dans accueil.php:


<?php
  echo "Derniers inscrits (cliquez sur la photo d'un membre pour voir son portrait):  ";
  echo "<a class=\"lien\" href=\"calc_inscrits.php?dir=prem\"><<</a> ";
  echo "<a class=\"lien\" href=\"calc_inscrits.php?dir=prec\"><</a> ";
  echo "<a class=\"lien\" href=\"calc_inscrits.php?dir=suiv\">></a> ";
  echo "<a class=\"lien\" href=\"calc_inscrits.php?dir=dern\">>></a> ";
  echo "<br>";
  echo "Dans accueil.php: ", $_SESSION['courant'];
  require('derniers_inscrits.php');
?>
 

derniers_inscrits.php m'affiche les 20 derniers inscrits dans l'ordre inverse (du plus récent au plus ancien) à partir de $_SESSION['courant'].

calc_inscrits.php, suivant la direction de la navigation, me calcule l'utilisateur courant:


<?php
  $dir=$_GET['dir'];
 
  // connexion à la base
  $db = mysql_connect('localhost', '', '')  or die('Erreur de connexion '.mysql_error());
 
  // sélection de la base  
  mysql_select_db('ma_base',$db)  or die('Erreur de selection '.mysql_error());
 
  // On écrit la requête sql
  $sql="SELECT userid, jesuis, journaiss, moisnaiss, anneenaiss, ville, pseudo, photo FROM inscription";
 
    // On interroge la base
  $result=mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
  $nb_inscrits=mysql_num_rows($result);
 
  if($dir=="prem") {
    $_SESSION['courant']=$nb_inscrits;
  }
  else if($dir=="prec") {
    if($_SESSION['courant']+20>=$nb_inscrits) {
      $_SESSION['courant']=$nb_inscrits;
    }
    else {
      $_SESSION['courant']+=20;
    }
  }
  else if($dir=="suiv") {
    if($_SESSION['courant']-20<=0) {
      $_SESSION['courant']=20;
    }
    else { 
      $_SESSION['courant']-=20;
    }
  }
  else if($dir=="dern") {
    $_SESSION['courant']=20;
  }
 
  echo "Dans calc_inscrits.php: ", $_SESSION['courant'];
 
  mysql_close();  // on ferme la connexion  
 
  // On va directement à l'accueil
  echo '<script type="text/javascript">';
  echo 'window.location.href="accueil.php"';
  echo '</script>';
?>
 

Une fois le calcul effectué, on va directement à l'accueil.

Le bug: une fois le calcul effectué dans calc_inscrits.php, ça m'affiche bien la bonne valeur de la variable de session:
Dans calc_inscrits.php: 20

Par contre, lorsque je suis revenu dans accueil.php, ça m'affiche l'ancienne valeur, à savoir celle avec laquelle j'ai initialisé cette variable de session dans index.php:
Dans accueil.php: 29
(J'ai pour l'instant 29 inscrits).

Or, je ne reviens jamais dans index.php...

Et si je l'initialise avec une valeur arbitraire dans index.php (par exemple: 15), c'est toujours cette valeur qui est affichée:
Dans accueil.php: 15

Tout se passe comme si ma variable de session n'était pas modifiée dans calc_inscrits.php...

Merci pour votre aide !

Ralph303

Hors ligne

#2 28-12-2009 17:37:39

Maskime
Membre
Lieu : Paris 15ème
Inscription : 11-05-2009
Messages : 134
Site Web

Re : Encore un bug trivial avec une variable de session

Hello,

Simplement, tu ne t'y prends pas de la bonne manière...

Pour commencer :
Actuellement ta requête te récupère tous les inscrits de ta base de manière systématique. Il y a une fonction MySql qui compte très bien pour toi et elle s'appelle COUNT() :


SELECT COUNT([ici_nom_de_ton_id_dans_ta_table]) AS Total FROM inscription;
 

Avec un mysql_fetch_array() (http://fr2.php.net/manual/en/function.m … -array.php) tu auras facilement ton total.
Note : En plus tu fais un SELECT * ce qui est bouuuuhhh pas beau vilain !

Ensuite :
Visiblement tu calcule les bornes de l'intervalle d'affichage de tes membres. Encore une fois tu peux facilement rapatrier uniquement les lignes qui t'intéresse avec du SQL, c'est la clause LIMIT [enregistrement de départ], [Nombre de résultats à rapatrier]

Mais encore :
Tu as mis en place une pagination, je te recommande de passer en paramètre la page sur laquelle tu veux te rendre et de faire une fonction qui à partir de ce chiffre te permet de calculer tes bornes. (début et fin si nécessaire)

En conclusion :
Tu n'as pas besoin des variable de sessions pour faire ce que tu fais actuellement.
Les variables de sessions ne sont utilisées que lorsque tu ne peux pas faire autrement ou que le paramètre dont tu as besoin est utilisé partout dans le site et qu'il est lourdingue de le passer d'une page à l'autre systématiquement.
Or tu n'es clairement dans aucun de ces cas.

Si tu as des question sur comment faire ce que tu demande proprement, je me tiens à ton entière disposition smile

Bonne chance


La programmation est composée de 80% de réflexion pour 20% de syntaxe -> réfléchissez à votre problème par étapes

Recommande l'utilisation du pattern Singleton
Si jamais je poste un morceau de code pour vous aider, prenez bien compte que je n'ai pas forcément testé le code que je poste et qu'il est possible qu'il contienne des erreurs wink

Hors ligne

#3 28-12-2009 18:10:25

Ralph303
Membre
Lieu : St-Cyr l'Ecole
Inscription : 30-05-2009
Messages : 98
Site Web

Re : Encore un bug trivial avec une variable de session

Merci d'avoir répondu si rapidement, Maskime ! smile

En effet, mon SQL n'est pas optimisé...
Merci pour cette précision et ces explications.


Mais je suis qd même obligé d'utiliser une variable de session car je veux que le calcul se fasse lorsque je clique sur un lien...
Et je ne sais pas appeler une fonction de calcul en cliquant sur un lien autrement qu'avec JavaScript avec onclick.
Or, je crois qu'il faut utiliser le moins possible JavaScript... (J'ai récemment eu une mésaventure avec JavaScript sur ce forum, j'avais fait
compliqué alors qu'on pouvait faire simple.)

Et comment garder en mémoire la dernière page affichée sans variable de session ?

De plus, l'affichage de mes pages se fait avec un require('derniers_inscrits.php');
Or, je ne sais pas comment passer le résultat du calcul au script derniers_inscrits.php...

Et ce n'est qd même pas normal que cette variable de session ne sois pas modifiée dans calc_inscrits.php, même si je dois procéder autrement
et ne pas utiliser de variable de session...

Ralph303

Dernière modification par Ralph303 (28-12-2009 18:15:19)

Hors ligne

#4 29-12-2009 15:01:50

Maskime
Membre
Lieu : Paris 15ème
Inscription : 11-05-2009
Messages : 134
Site Web

Re : Encore un bug trivial avec une variable de session

Hello,

Pour la variable de session, je ne dis pas, il y a un certainement un problème dans ton code, mais tu as rendu la chose tellement compliquée que je ne suis pas sûr de voir où pourrais être le problème.

Quoi qu'il en soit ton problème sur comment savoir sur quelle page tu te trouve n'en n'est pas un.
Je te donne les grandes ligne de la mécanique que tu dois appliquer pour faire ce que tu veux :

1. Compter le nombre de lignes totales que tu dois afficher.
2. A partir de ce chiffre et le nombre de lignes que tu veux afficher par page tu obtiens un nombre de pages total
3. Une fois que tu connais les 2 infos précédentes, si on te donne la page que l'on veut afficher tu peux déterminer les enregistrements à afficher.

L'astuce que tu ne vois pas est qu'il faut mettre le calcul des bornes de ton intervalle dans la page qui affiche les enregistrements.
Je te met un morceau de code ici, je te renvois à ma signature pour toutes réclamations big_smile :


<?php
//Ici je définis les valeurs par défaut
$iCurrentPage = 1; // Page par défaut
$iNbLinePerPage = 20; // Nombre de lignes par page

// Ici je récupère le nombre total d'utilisateurs dans ta table
$sCountQuery = "SELECT COUNT(userid) as Total FROM inscription";
$rResult = mysql_query($sCountQuery) or die('Erreur SQL !'.$sCountQuery.'<br>'.mysql_error());
$aRow = mysql_fetch_array($rResult);
$iTotalResult = $aRow['Total'];

if($iTotalResult > 0){
    // Ici je calcule le nombre de pages dont je vais avoir besoin pour afficher tous les utilisateurs
    // en me basant sur le fait que je veux afficher "$iNbLinePerPage" lignes par page
    $iNbPages = ceil($iTotalResult / $iNbLinePerPage); // Attention le ceil() est important parce qu'il te faut un entier or une division
                                                       // peut te donner un float
    // Ici je vérifie que le numéro de la page que je recois en paramètre est valide
    // => Ne jamais faire confiance aux informations provenant du navigateur !!! => GOLDEN RULE !!!
    if( (isset($_GET['page']) === true) && (empty($_GET['page']) === false) ){
        $iBrowserPage = $_GET['page'];
        if( ($iBrowserPage > 0) && ($iBrowserPage < $iNbPages) ){
            $iCurrentPage = $iBrowserPage;
        }
    }
    // Ici je calcule l'enregistrement de départ de la page demandée
    $iStartOffset = $iNbLinePerPage * ($iCurrentPage - 1);

    // Et voici la requête SQL qui te permet de ramener uniquement ce dont tu as besoin dans tes informations.
    $sResultQuery = '';
    $sResultQuery .= 'SELECT userid, jesuis, journaiss, ';
    $sResultQuery .= '       moisnaiss, anneenaiss, ville, ';
    $sResultQuery .= '       pseudo, photo ';
    $sResultQuery .= '  FROM inscription '
    $sResultQuery .= ' WHERE 1 = 1 ';
    $sResultQuery .= ' LIMIT ' . $iStartOffset . ', ' . $iNbLinePerPage;

    $rResult = mysql_query($sResultQuery) or die('Erreur SQL !'.$sResultQuery.'<br>'.mysql_error());
    //Une fois que tu as le résultat tu fais ce que tu veux ;)
}
else{
    echo "Pas d'utilisateur à afficher.";
}
?>
 

Tu dois pouvoir mettre ce bout de code à peu près n'importe où dans ton code car le $_GET est accessible de n'importe où dans ton code (c'est pas pour rien que l'on appelle ça un tableau Super Global wink ) Et pas de SESSION wink

Si tu as des questions, pose les wink

Dernière modification par Maskime (29-12-2009 15:10:21)


La programmation est composée de 80% de réflexion pour 20% de syntaxe -> réfléchissez à votre problème par étapes

Recommande l'utilisation du pattern Singleton
Si jamais je poste un morceau de code pour vous aider, prenez bien compte que je n'ai pas forcément testé le code que je poste et qu'il est possible qu'il contienne des erreurs wink

Hors ligne

#5 29-12-2009 16:11:47

Ralph303
Membre
Lieu : St-Cyr l'Ecole
Inscription : 30-05-2009
Messages : 98
Site Web

Re : Encore un bug trivial avec une variable de session

Ah ok ! Je ne savais pas que le $_GET était accessible n'importe où dans mon code...
Donc, je vais utiliser mes 80% de réflexion sur la base de ce que tu m'as dit... smile

Merci Maskime !

Hors ligne

#6 30-12-2009 17:10:03

Ralph303
Membre
Lieu : St-Cyr l'Ecole
Inscription : 30-05-2009
Messages : 98
Site Web

Re : Encore un bug trivial avec une variable de session

Ok, j'ai utilisé ton code et ça marche !
Effectivement, pas besoin de variable de session, le $_GET suffit... smile

J'ai encore un petit pb concernant le calcul de l'offset, car j'affiche ma table du dernier membre inscrit au premier.
Mais ça, je peux le résoudre tout seul. Il me suffit de réfléchir un peu... roll

Enfin, pour le moment, j'ai beaucoup réfléchi et je suis fatigué.
Je verrai ce pb qd je serai reposé...

Merci encore pour ton aide, Maskime ! smile

Hors ligne

Pied de page des forums