Problême session php ajax

Signaler
Messages postés
20
Date d'inscription
vendredi 4 avril 2008
Statut
Membre
Dernière intervention
29 avril 2008
-
Messages postés
20
Date d'inscription
vendredi 4 avril 2008
Statut
Membre
Dernière intervention
29 avril 2008
-
bonsoir!




okok!  lol

bon je vais essayer de faire simple , et propre.

le script
chat.php
via ajax fait apel au script
reponse.php pour afficher dans le 

 de




chat.php


les reponses  a la requête de

reponse.php.


la requête de reponse.php fonctionne avec un session 


".$_SESSION['pseudo']." .

donc le problême, c'est que si je met un session_start sur le script

reponse.php ,

ca me deconnecte comme un session_destroy.





Et si j'enleve le session_start  ma requête marche plus.

donc ma question est la suivante:



comment faire passer la session_start  vers reponse.php sans qu'il n y est de deconexion?
 














chat.php






<?php
session_start();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head>
<title>Chat</title>
<script type="text/javascript">
function plop()
        {
        var xhr_object = null;

        if(window.XMLHttpRequest) // Firefox
           xhr_object = new XMLHttpRequest();
        else
                {
                if(window.ActiveXObject) // Internet Explorer
                        xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
                else // XMLHttpRequest non supporté par le navigateur
                        {
                        alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
                        return;
                        }
                } 

        var method   = "POST";
        var filename = "reponse.php";

        var requete  = "message=<?php echo'.$retour.'?>";

        xhr_object.onreadystatechange = function()
                {
                if(xhr_object.readyState == 4)
                        {
                        var reponse = xhr_object.responseText;
                        document.getElementById("content").innerHTML = reponse;
                        }
                }

        xhr_object.open(method, filename, true);

        xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

        xhr_object.send(requete);

        }

</script>

<script>
function refresh()
{
        plop();
        setTimeout("refresh()", 5000);
}
</script>

</head>

<style type="text/css"> </style>

$cnx=mysql_connect("......", "..........", "..........") or die("Pb connexion au serveur".mysql_error());
$db=mysql_select_db("..........") or die("Pb selection base".mysql_error());

if ( isset( $_POST['message'] ) && !is_null( $_POST['message'] ) )
     {
         $message = mysql_real_escape_string( htmlspecialchars( $_POST['message'] ) );
         $timestamp = time();
         $expediteur = $_SESSION['pseudo'];
         $destinataire = $_GET['pseudo'];

         mysql_query( "INSERT INTO chat VALUES('', '$expediteur', '$destinataire', '$message', '$timestamp', '')" );  // et tu ne stockes pas le résultat dans une variable ?
     } 
?>

 



   

 


<?php
mysql_close();
?>

          </form>

<script>
refresh();
</script>

</html>





reponse.php










<?php
session_start();

$cnx=mysql_connect("...........", "...........", "...........") or die("Pb connexion au serveur".mysql_error());

$db=mysql_select_db(".............") or die("Pb selection base".mysql_error());

$reponse = mysql_query("SELECT expediteur, message, timestamp FROM chat WHERE destinataire='".$_SESSION['pseudo']."'OR expediteur='".$_SESSION['pseudo']."'");
while ($donnees = mysql_fetch_array($reponse) )

{

$date = date('d/m/Y à Hhi', $donnees['timestamp']);
$message = $donnees['message'];
$expediteur = $donnees['expediteur'];
$pseudo= $_GET['pseudo'];

echo ' '.$expediteur.' le '.$date.' : '.$message.'

';
}

mysql_close(); // Déconnexion de MySQL

?>

12 réponses

Messages postés
318
Date d'inscription
mardi 27 mai 2003
Statut
Membre
Dernière intervention
11 mars 2010
1
Bonjour,

J'ai testé ton code en l'adaptant légèrement pour qu'il fonctionne en local, ça fonctionne chez moi.

Tu peux essayer de passer l'id de la session en GET lors de l'appel ajax au cas ou.

Grrrrrrrrrrr
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
17
Salut,

Je comprends pas comment session_start() peut déconnecter...
Si ça déconnecte, c'est alors parce que le SID change. Si le SID change, c'est parce que le cookie de session n'est pas correctement écrit sur le client (navigateur).

Sinon, j'vois pas...

<hr size="2" width="100%" />Neige

N'hésitez pas à lire la doc de PHP avant de poser des questions triviales...
Messages postés
1980
Date d'inscription
dimanche 20 février 2005
Statut
Membre
Dernière intervention
24 septembre 2012
5
Hello,

Es-tu bien sûr que la session ne marche pas ? Il n'y a pas de raison que "session start" tre déconnecte comme tu dis.

Essaie de créer une variable de session dans une page et de vérifier vraiment si elle n'est pas retrouvée dans response.php.

à+
Messages postés
20
Date d'inscription
vendredi 4 avril 2008
Statut
Membre
Dernière intervention
29 avril 2008

bonsoir!

et merci de vaut reponse!

je suis sur que sais un problême avec le session_start de reponse.php,

normalement sur le chat il doit y avoir afficher le pseudo du membre, la date, l'heure est le message du membre!

echo ' '.$expediteur.' le '.$date.' : '.$message.'

';

Quand je me connecte sur le t'chat ,le pseudo est afficher 2 seconde et enssuite il disparait!

quand il disparait ca veut dire que sa y est on ai deconnecter!

si j'enleve le sessions _start de reponse.php il n y a pas de deconnexion mais ma requete marche plus du coup.

si vous voulez faire le teste par vous même: http://www.uncupidon.com

voici un compte test:

pseudo = petitfute

password= ouioui

une fois connecter , cliquer sur une des photos de la premiere page et cliquer sur chat!

attendez 5 seconde , fermer le chat retourner a l'acceuil et clique sur << mon espace >> et la normalement vous etes deconnecté donc vous pourrez pas rentre sur votre espace!


<form action="forum-84-269460.html" method="post">
</form>
Messages postés
20
Date d'inscription
vendredi 4 avril 2008
Statut
Membre
Dernière intervention
29 avril 2008

re!

sur  un autre forum on m'a dit ceci!

tu ouvres une nouvelle session, c normal... tu dois récupérer la session précédememnt créée...

session_name('yoplaboum');

session_start();

le problème c'est que je ne sais pas comment faire!
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
17
Oui mais non...
Si tu n'utilises pas session_name(), par défaut, la session s'appelle PHPSESSID
C'est défini dans le fichier php.ini
session_name() sert à MODIFIER le nom de la session (comme il est obligatoire, il y a une valeur par défaut). Donc peu importe que tu le modifies ou non, ça doit fonctionner.

Bon mais le problème se situe peut-être à un autre niveau. Ce ne sont pas les cookies du navigateur, puisque je les ai acceptés, et paf...

J'aimerais bien voir ton code qui gère la connexion du membre, et comment tu vérifies qu'il est connecté.

<hr size="2" width="100%" />Neige

N'hésitez pas à lire la doc de PHP avant de poser des questions triviales...
Messages postés
20
Date d'inscription
vendredi 4 avril 2008
Statut
Membre
Dernière intervention
29 avril 2008

re!

le code qui  logue  quand on rentre le pseudo et le password??
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
17
Oui. Pour voir comment tu gères ça (base de données ou autre), si ça tient la route ou non.
Et aussi le script qui effectue la vérification sur chaque page que le membre est bien connecté.

<hr size="2" width="100%" />Neige

N'hésitez pas à lire la doc de PHP avant de poser des questions triviales...
Messages postés
20
Date d'inscription
vendredi 4 avril 2008
Statut
Membre
Dernière intervention
29 avril 2008

re!

donc voici la page qui sert a ce loguer!

<?php
session_start();
$_SESSION['pseudo'];
 require('fonction.php');
  include('connectes.php');


 


 $cnx=mysql_connect("................", "..................", "......................") or die("Pb connexion au serveur".mysql_error());
$db=mysql_select_db(".............") or die("Pb selection base".mysql_error());
//Si on vient du formulaire
if (!empty($_POST['pseudo']) && !empty($_POST['mot_de_passe']))
{
$mot_de_passe = mysql_real_escape_string($_POST['mot_de_passe']);
$pseudo = mysql_real_escape_string($_POST['pseudo']);


 


$en_ligne = online;
$name = $_SESSION['pseudo'];


mysql_query("UPDATE infoclients SET statut='".$en_ligne."', timestamp='".time()."' WHERE pseudo='".$_SESSION['pseudo']."'")or die (mysql_error());


$timestamp_5min time() - (60 * 5); // 60 * 5 nombre de secondes écoulées en 5 minutes
mysql_query('DELETE FROM connectes WHERE timestamp < ' . $timestamp_5min);


 




    $sql = "select mot_de_passe from infoclients where pseudo='".$pseudo."'";// cette requette veut dire selectionne le mot de passe dans la table infoclients de pseudo


  $req = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error());


  $data = mysql_fetch_assoc($req);




   if(mysql_num_rows($req) != 0) {
    if($mot_de_passe == $data['mot_de_passe'])
{
    //mot de passe correct
    $_SESSION['pseudo'] = $pseudo;
          $_SESSION['logged'] = true;


echo ''.$_SESSION['pseudo'].' Vous êtes connecté';
include('index.php');




     }else{  //Le mot de passe n'est pas bon
          echo 'mot de passe incorrect';
     }
  }
  else
  { // le pseudo n'existe pas
    echo 'pseudo incorrect ,';


    echo 'vous devez être inscrit pour pouvoir vous connecté , vous allez être redigé vers la page d inscription.';
 include('index.php');
         redirection('inscription.php');


 }


 }
 
//On ne vient pas du formulaire


  if(isset($_SESSION['pseudo']))
  { //on s'est déjà connecté avec succès


  // on compte le nombre de messages non lus et dont le destinataire est le membre actuellement connecté
        $nbr_non_vus = mysql_query("SELECT COUNT(*) AS nbre FROM mp WHERE destinataire='".$_SESSION['pseudo']."' AND vu='0' AND (efface='0' OR efface='2')")or die(mysql_error());
// on en fait un array
        $nbre_non_vus = mysql_fetch_assoc($nbr_non_vus);
?>


 


 


              <!-- Rappel : debut de la page -->


   <head><!-- Rappel : debut information d'en tète  -->


       <title>uncupidon.com</title>
<!-- Rappel : titre de la page   -->
       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
           <link rel="stylesheet" media="screen" type="text/css" title="Design1" href="design1.css" />


 


   </head><!-- Rappel : fin information d'en tète  -->
  
 <?php


$reponse = mysql_query("SELECT id FROM infoclients WHERE pseudo='".$_SESSION['pseudo']."'");




while($resultat = mysql_fetch_assoc($reponse))
{
?>


 




       
        Salut <?php echo $_SESSION['pseudo']; ?> !


       




               
                        <li>[photo1.php Mes photos]</li>
                        <li>[mp.php (<?php echo $nbre_non_vus['nbre'];?>)Message]</li>
                        <li>[index.php Accueil]</li>
                        <li>[deconexion.php Deconexion]</li>
      <li>[chat.php .]</li>
      <li>[reception.php .]</li>
             <?php echo'<li>Modifier</li>';?>
    <?php
    }
    ?>
               


               

                        <?php


 




$reponse = mysql_query("SELECT pseudo, prenom, photo1 FROM infoclients WHERE pseudo='".$_SESSION['pseudo']."'");
while ($donnees = mysql_fetch_array($reponse) )
{
?>


Votre descriptif: <?php echo $donnees['pseudo']; ?>



 " alt="image" />


<?php
}


mysql_close();
?>


               

<?php
}else { //on ne s'est pas encore connecté


    echo 'vous devez être inscrit pour pouvoir vous connecté , vous allez être redigé vers la page d inscription.';
 include('index.php');
  redirection('inscription.php');


 }




?>

   </html><!-- Rappel : fin de la page -->
Messages postés
20
Date d'inscription
vendredi 4 avril 2008
Statut
Membre
Dernière intervention
29 avril 2008

et voici pour les connectés

<?php

session_start();
$_SESSION['pseudo'];
// Connexion à MySQL
// D'abord, on se connecte à MySQL
        mysql_connect("********", "************", "***********");
        mysql_select_db("**********");
  
  
               
$en_ligne = online;    
mysql_query("UPDATE infoclients SET statut='".$en_ligne."', timestamp='".time()."' WHERE pseudo='".$_SESSION['pseudo']."'")or die (mysql_error());
// -------
// ETAPE 1 : on vérifie si l'IP se trouve déjà dans la table
// Pour faire ça, on n'a qu'à compter le nombre d'entrées dont le champ "ip" est l'adresse ip du visiteur
$retour = mysql_query('SELECT COUNT(*) AS nbre_entrees FROM connexion WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'');
$donnees = mysql_fetch_array($retour);

if ($donnees['nbre_entrees'] == 0) // L'ip ne se trouve pas dans la table, on va l'ajouter
{
    mysql_query('INSERT INTO connectes VALUES(\'' . $_SERVER['REMOTE_ADDR'] . '\', ' . time() . ')');
}
else // L'ip se trouve déjà dans la table, on met juste à jour le timestamp
{
    mysql_query('UPDATE connectes SET timestamp=' . time() . ' WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'');
}
$off_ligne = offline;
$stopchat ="";
// -------
// ETAPE 2 : on supprime toutes les entrées dont le timestamp est plus vieux que 5 minutes

// On stocke dans une variable le timestamp qu'il était il y a 5 minutes :$timestamp_5min time() - (60 * 5); // 60 * 5 nombre de secondes écoulées en 5 minutes
mysql_query('DELETE FROM connexion WHERE timestamp < ' . $timestamp_5min);
mysql_query("UPDATE infoclients SET statut='".$off_ligne."' WHERE timestamp<'".$timestamp_5min."'")or die (mysql_error());
mysql_query("UPDATE infoclients SET statut='".$stopchat ."' WHERE timestamp<'".$timestamp_3min."'")or die (mysql_error());

 

// -------
// ETAPE 3 : on compte le nombre d'ip stockées dans la table. C'est le nombre de visiteurs connectés
$retour = mysql_query('SELECT COUNT(*) AS nbre_entrees FROM connectes');
$donnees = mysql_fetch_array($retour);

// Ouf ! On n'a plus qu'à afficher le nombre de connectés !

?>
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
17
C'est pas exactement ça que je t'ai demandé.
Là, tu me donnes ton script pour compter les membres connectés. Or, ce que je souhaite voir, c'est comment tu vérifies qu'un visiteur est identifié ou non sur ton site.
En tout logique, c'est un script qui doit être présent sur chaque page. Si tu ne vérifies pas et que tu te bases uniquement sur la valeur de la variable $_SESSION['pseudo'], ça peut poser des problèmes.

D'une manière générale, j'ai du mal à m'y retrouver dans ton code. Ce n'est pas très logique.
Supprimer les sessions trop anciennes, tu devrais le faire sur chaque page, avec éventuellement (c'est un peu lourd, mais bon, pour commencer, on va faire comme ça).

Je te recommande VIVEMENT d'avoir un script (moi je l'appelle common.php, ou start.php, bref, peu importe) que tu inclues sur chacune de tes pages nécessitant sessions, bdd, etc.
Ca t'économises franchement un max de lignes, ça t'évite des erreurs, etc.
Dans ce script tu peux mettre :
error_reporting(E_ALL);

Parce que je ne crois pas que toutes les erreurs soient affichées, alors que quand on développe, c'est indispensable (tu en verras : notamment une dûe à $en_ligne = online)

Tu peux aussi y mettre les lignes de connexion à la base de données (puisqu'elles sont récurrentes sur chaque page).
Mets y aussi la gestion des sessions.
Il faut vérifier sur chaque page, systématiquement, si le visiteur est connecté ou non.
Pour cela, vérifier si $_SESSION['pseudo'] est présent, et si le membre en question se trouve bien dans la base de données comme un membre identifié. Si ce n'est pas le cas, il faut supprimer $_SESSION['pseudo']. C'est le moment aussi de faire des tests de sécurité éventuels (durée de la connexion, navigateur utilisé et adresse IP identiques aux valeurs stockées dans la base de données, dans la table qui gère les sessions).
C'est aussi là que tu vas supprimer les sessions trop anciennes : tu n'auras plus à t'en soucier ensuite. Tu exécutes une fois ta requête DELETE, et hop.
Tout ça, il faut le faire avant tout le reste.

A partir de là, si le visiteur est connecté et qu'il se trouve sur la page d'inscription, tu le renvoies sur la page d'accueil.
S'il n'est pas connecté et qu'il se trouve sur une page nécessitant d'être connecté, tu le renvoies sur la page de connexion (avec un lien vers la page d'inscription).

Je pense sincèrement qu'il te manque un peu de méthodologie pour faire un code propre et facilement compréhensible. Là, franchement, ça me demanderait la nuit pour tout comprendre (et je n'ai pas tout ce temps, malheureusement).

Parce que logiquement, utiliser session_start() suffit à conserver une session. Mais je crois que c'est au niveau de ta base de données que ça pêche : tu ne gères pas correctement les sessions de tes visiteurs enregistrés, et je suppose que tu les supprimes de la base un peu trop vite...

Bref, je pense que tu devrais reprendre ton code à tête reposée (la nuit porte conseil) et mettre à plat (sur papier par exemple) toutes les étapes que tu dois suivre dans ton script pour vérifier qu'un membre est connecté ou pas, pour l'enregistrer, le déconnecter, tout ça.

<hr size="2" width="100%" />Neige

N'hésitez pas à lire la doc de PHP avant de poser des questions triviales...
Messages postés
20
Date d'inscription
vendredi 4 avril 2008
Statut
Membre
Dernière intervention
29 avril 2008

ok, je vais faire tout ca demain !

je te tien au courant sur ta mesagerie prive!

merci des conseils

bonne nuit