Tchat en php js ajax

Résolu/Fermé
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 - Modifié le 31 août 2017 à 01:38
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 - 8 sept. 2017 à 15:31
Bonjour, je suis débutant et j'ai un problème pour faire un update dans mon instance quand j'envoie un message et je sais pas comment vérifier que mon $_GET['statut'] est bien reçu mon code.

Voici la page principal :

chat.php
<?php
session_start();

?>
<html>
<head>
<link rel="stylesheet" href="chat.css"/>
</head>
<body>
<table id="body">

<tr>
<td id="titre">Chat en Ajax avec PHP et JQuery</td>
</tr>

<tr >

<td style="height:500px">

<div id="chat_aff"></div>

</td>

</tr>

<tr >

<td id="form" valign="top">
<?php 
if(isset($_SESSION['id'])) {
    
?>
<table id="form2">
<input id="statut" type="hidden" value="<?= $_SESSION['statut'] ?>" />
<input id="name" type="hidden" value="<?= $_SESSION['pseudo'] ?>" />
<tr>
 <td style="width:100%">
 <label for="message" style="font-family:Comic Sans MS;">Message</label>
 </td>
 <td></td>

</tr>
<tr><?php /*
 <td>
  <label for="name" style="font-family:Comic Sans MS;"><?= $_SESSION['pseudo'] ?></label>< 
 </td>
*/ ?>
 <td colspan="2" >
 <input id="message" type="text" maxlength="250"  />
 </td>
 
 <td>
 
 </td>
</tr>

</table>
<?php 
}else{
?>
<center>Vous devez être connecter pour poster un message !</center><br/>
<center><a href="connexion.php" rel="nofollow noopener noreferrer" target="_blank">Vous connecter !</a></center>
<?php    
    
}
?>

</td>

</tr>

</table>
<script src="http://code.jquery.com/jquery.min.js"></script>
<script>

 setInterval(function()
 {
 $("#chat_aff").load("chat_control.php",function(){}); 
 },1000);
 

 $("#message").keydown(function(event)
 {
        if ( event.which == 13 ) {
 var name =  $("#name").val();
 
 var message = $("#message").val();
            
    var statut = $("#statut").val();        
            
 $("#message").val("");
 
 $.ajax({
  async: false ,
  type: 'GET',
  url: 'chat_control.php?name='+name+'&message='+message+'&statut='+statut
  
 });
        }
 });


</script>
<?php if(isset($_SESSION['id'])) {
    if($_SESSION['statut'] == 3){
        echo 'Admin statut !';
    }else{
        echo 'User staut !';
    }
} ?>
<?php if(isset($_SESSION['id'])) { echo "<a href='deco.php' rel="nofollow noopener noreferrer" target="_blank">Se déconnecter !</a>"; } ?>
</body>
    </html>




Le chat_control.php :



<?php
require_once("chat_modele.php");
$bdd = bdd();


if(isset($_GET['name']) AND isset($_GET['message']) AND isset($_GET['statut']))
{
 if(!empty($_GET['message'])){
       if($_GET['statut'] == 3){
            ajout_message_admin($bdd,$_GET['name'],$_GET['message'],$_GET['statut']);
        }else{
           ajout_message($bdd,$_GET['name'],$_GET['message']); 
        }
    }else{
        echo  "Votre messsage est vide !";
    }
 
 
}
else
{
 expire_message($bdd);
 $message = message($bdd);
 require_once("chat_vue.php");
}

?>



Le chat_modele.php :


<?php
function bdd()
{
return $db = new PDO('mysql:host=localhost;dbname=site; charset=utf8', 'root', 'root');
}
function ajout_message($bdd,$pseudo,$message)
{
 $req = $bdd->prepare("INSERT INTO JS(Pseudo,Message,Date) VALUES(:Pseudo,:Message,NOW())");
 $req->execute(array("Pseudo"=>$pseudo,"Message"=>$message));
}
function ajout_message_admin($bdd,$pseudo,$message,$statut)
{
    $req = $bdd->prepare("INSERT INTO JS(Pseudo,Message,Date) VALUES(:Pseudo,:Message,NOW())");
 $req->execute(array("Pseudo"=>$pseudo,"Message"=>$message));
    $req_admin = $bdd->prepare("UPDATE JS SET WHERE Statut = ?");
    $req_admin->execute(array($statut));
}
function message($bdd)
{
 $req = $bdd->query("SELECT * FROM JS WHERE Etat = 1 ORDER BY Date DESC");
 
 return $req;
}

function expire_message($bdd)
{
 
 $req = $bdd->query("UPDATE JS SET Etat = 0 WHERE Date < DATE_SUB(NOW(), INTERVAL 10 MINUTE)");
 
}

function pair($nombre)
{
    if ($nombre%2 == 0) return true;
    else return false;
}

function getRelativeTime($date) {
    // Déduction de la date donnée à la date actuelle
    $time = time() - strtotime($date); 

    // Calcule si le temps est passé ou à venir
    if ($time > 0) {
        $when = "il y a";
    } else if ($time < 0) {
        $when = "dans environ";
    } else {
        return "il y a 1 seconde";
    }
    $time = abs($time); 

    // Tableau des unités et de leurs valeurs en secondes
    $times = array( 31104000 =>  'an{s}',       // 12 * 30 * 24 * 60 * 60 secondes
                    2592000  =>  'mois',        // 30 * 24 * 60 * 60 secondes
                    86400    =>  'jour{s}',     // 24 * 60 * 60 secondes
                    3600     =>  'heure{s}',    // 60 * 60 secondes
                    60       =>  'minute{s}',   // 60 secondes
                    1        =>  'seconde{s}'); // 1 seconde         

    foreach ($times as $seconds => $unit) {
        // Calcule le delta entre le temps et l'unité donnée
        $delta = round($time / $seconds); 

        // Si le delta est supérieur à 1
        if ($delta >= 1) {
            // L'unité est au singulier ou au pluriel ?
            if ($delta == 1) {
                $unit = str_replace('{s}', '', $unit);
            } else {
                $unit = str_replace('{s}', 's', $unit);
            }
            // Retourne la chaine adéquate
            return $when." ".$delta." ".$unit;
        }
    }
}
?>



Le chat_vue.php :


<?php
session_start();
?>
<table id="table_message">
<?php
while($don = $message->fetch())
{
 if(pair($don['id']))
 {
  $color = "";
 }
 else
 {
  $color = "#EDEDED";
 }



?>
<tr style="background-color:<?php echo $color; ?>">
 <td class="info_message" valign="top">
 <span style="font-size:small;"><?php echo $don['Pseudo']; ?></span><br/>
 <?php echo getRelativeTime($don['Date']);?> 
 </td>
 <td class="message" >
 <div class="message2" >
 <?php echo $don['Message'];?>
 </div> 
 </td>

</tr>


<?php

}
?>
</table>



Merci d'avance je galère depuis des jours.....

2 réponses

jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
31 août 2017 à 13:57
Bonjour,

Oula... y'aurait plein de choses à revoir dans ton code ...
mais bon.

Concernant ton appel ajax.
Pour commencer.. je serai toi.. je le ferai en POST et non en GET
Puis.. ajoute le success et le error pour afficher, dans la console, le résultat par exemple.

var datas ={name:name
                 ,message:message
                 ,statut:statut};
 $.ajax({
  async: false ,
  type: 'POST',
  url: 'chat_control.php',
  data : datas,
  success: function(reponse){
    console.log(reponse);
  },
  error: function(jqXHR, textStatus){
     console.log(jqXHR);
     alert(jqXHR.status + ":" +jqXHR.responseText );
   }  
 });



côté Le chat_control.php
 <?php 
 
require_once("chat_modele.php");
$bdd = bdd();

//récupération PROPRE DES VARIABLES AVANT de les utiliser
$name = !empty($_POST['name']) ? $_POST['name'] : NULL;
$message = !empty($_POST['message']) ? $_POST['message'] : NULL;
$statut = !empty($_POST['statut']) ? $_POST['statut'] : NULL;

if($name &&  $statut) {
  if($message){
    if($statut$ == 3){
      ajout_message_admin($bdd,$_GET['name'],$_GET['message'],$_GET['statut']);
    }else{
      ajout_message($bdd,$_GET['name'],$_GET['message']); 
    }
  }else{
      echo  "Votre messsage est vide !";
  }
  
}else{
 expire_message($bdd);
 $message = message($bdd);
 require_once("chat_vue.php");
}




Et pour finir .. tu dois activer la gestion des erreurs PHP :
https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs
0
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 21
Modifié le 31 août 2017 à 16:00
Bonjour a toi, encore merci pour cette aide voila pour les erreurs php :

De chat_modele.php
function bdd()
{
    try{
            return $db = new PDO('mysql:host=localhost;dbname=site; charset=utf8', 'root', 'root');
            // Activation des erreurs PDO
            $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
            $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
        } catch(PDOException $e) {
            die('Erreur : ' . $e->getMessage());

        }

}


Puis après avoir modifier cela de chat_control.php :

require_once("chat_modele.php");
$bdd = bdd();

//récupération PROPRE DES VARIABLES AVANT de les utiliser
$name = !empty($_POST['name']) ? $_POST['name'] : NULL;
$message = !empty($_POST['message']) ? $_POST['message'] : NULL;
$statut = !empty($_POST['statut']) ? $_POST['statut'] : NULL;

if($name &&  $statut) {
  if($message){
    if($statut == 3){
      ajout_message_admin($bdd,$_POST['name'],$_POST['message'],$_POST['statut']);
    }else{
      ajout_message($bdd,$_POST['name'],$_POST['message']); 
    }
  }else{
      echo  "Votre messsage est vide !";
  }
  
}else{
 expire_message($bdd);
 $message = message($bdd);
 require_once("chat_vue.php");
}


Et la page chat.php

$("#message").keydown(function(event)
 {
        if ( event.which == 13 ) {
        var datas ={name:name
                 ,message:message
                 ,statut:statut};
            
 $.ajax({
  async: false ,
  type: 'POST',
  url: 'chat_control.php',
  data : datas,
  success: function(reponse){
    console.log(reponse);
  }
  error: function(jqXHR, textStatus){
     console.log(jqXHR);
     alert(jqXHR.status + ":" +jqXHR.responseText );
   }  
 }); 


Par exemple ici je comprend pas comment récupéré mon
#id
juste avec
var datas ={name:name
,message:message
,statut:statut};


Donc actuellement avec ces modifications quand je met du texte j'appui sur la touche entrée le text disparait mais est inscrit nul part. Et aucun message d'erreur....

Merci d'avance de votre aide.
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650 > flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021
31 août 2017 à 16:27
la variables datas contient les données que tu ENVOIES à ton script php ajax.

tu parles de récupérer ton #id ... le récupérer de où ? Celui généré par ta BDD lorsque tu ajoutes un message ??
Si oui... il faut modifier plusieurs choses....
Déjà
function ajout_message($bdd,$pseudo,$message)
{
 $sql = "INSERT INTO JS(Pseudo,Message,Date) VALUES(:Pseudo,:Message,NOW())";
  $datas = array(":Pseudo"=>$pseudo,":Message"=>$message);
 try{
   $req = $bdd->prepare($sql);
   $req->execute($datas);
   $result = $bdd>lastInsertId(); //retourne l'id autoincrementé créé par la bdd
  } catch(Exception $e){
   echo "Erreur ! " . $e->getMessage();
  }
return $result;

}

Tu remarqueras que j'ai placé le code dans un bloc try/catch !
Il faudra faire de même dans TOUTES tes autres fonctions !


Ensuite dans ton fichier ajax php :
require_once("chat_modele.php");
$bdd = bdd();

//récupération PROPRE DES VARIABLES AVANT de les utiliser
$name = !empty($_POST['name']) ? $_POST['name'] : NULL;
$message = !empty($_POST['message']) ? $_POST['message'] : NULL;
$statut = !empty($_POST['statut']) ? $_POST['statut'] : NULL;

$result = ""; //initialisation de la variable de retour

if($name &&  $statut) {
  if($message){
    if($statut == 3){
      $result = ajout_message_admin($bdd,$_POST['name'],$_POST['message'],$_POST['statut']);
    }else{
        $result = ajout_message($bdd,$_POST['name'],$_POST['message']); 
    }
  }else{
         $result =  "Votre messsage est vide !";
  }
  
}else{
 expire_message($bdd);
 $message = message($bdd);
 
}

//retourne la variable au format json
echo json_encode($result);



Ensuite... pour afficher le message... dis toi que tu dois le gérer via le javascript directement....
Tu ne dois pas faire appel à ton fichier chat_vue.php ......
ou alors tu l'inclus DIRECTEMENT dans ta page principale puis tu rempli ton tableau depuis ton js (dans le success de l'ajax par exemple ).


Au passage....
tu peux remplacer ce code :
 if(pair($don['id']))
 {
  $color = "";
 }
 else
 {
  $color = "#EDEDED";
 }

par :
$color = $don['id']%2 ? "" : "#EDEDED";
0
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 21
Modifié le 1 sept. 2017 à 09:53
Bonjour,

J'ai modifier les fonctions :

<?php
function bdd()
{
    try{
            return $db = new PDO('mysql:host=localhost;dbname=site; charset=utf8', 'root', 'root');
            // Activation des erreurs PDO
            $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
            $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
        } catch(PDOException $e) {
            die('Erreur : ' . $e->getMessage());

        }

}
function ajout_message($bdd,$pseudo,$message)
{
        $sql = "INSERT INTO JS(Pseudo,Message,Date) VALUES(:Pseudo,:Message,NOW())";
        $datas = array(":Pseudo"=>$pseudo,":Message"=>$message);
 try{
   $req = $bdd->prepare($sql);
   $req->execute($datas);
   $result = $bdd>lastInsertId(); //retourne l'id autoincrementé créé par la bdd
    } catch(Exception $e){
        echo "Erreur ! " . $e->getMessage();
    }
    return $result;
}
function ajout_message_admin($bdd,$pseudo,$message,$statut)
{
    $sql = "INSERT INTO JS(Pseudo,Message,Date) VALUES(:Pseudo,:Message,NOW())";
    $datas = array("Pseudo"=>$pseudo,"Message"=>$message);
    $sql1 = "UPDATE JS SET WHERE Statut = ?";
    $datas1 = array($statut);
try{
    $req = $bdd->prepare($sql);
    $req->execute($datas);
    } catch(Exception $e) {
        echo "Erreur ! " . $e->getMessage();
    }
try{
    req1 = $bdd->prepare($sql1);
    $req1->execute($datas1);
    } catch(Exception $e) {
        echo "Erreur ! " . $e->getMessage();
    }
    
}
function message($bdd)
{
    $sql = "SELECT * FROM JS WHERE Etat = 1 ORDER BY Date DESC";
    try{
        $req = $bdd->query($sql);
        } catch(Exception $e) {
        echo "Erreur ! " . $e->getMessage();
    }
    return $req;
}
function expire_message($bdd)
{
    $sql = "UPDATE JS SET Etat = 0 WHERE Date < DATE_SUB(NOW(), INTERVAL 10 MINUTE)";
 try{
        $req = $bdd->query($sql);
        } catch(Exception $e) {
        echo "Erreur ! " . $e->getMessage();
    }
 
}

function pair($nombre)
{
    if ($nombre%2 == 0) return true;
    else return false;
    
}

function getRelativeTime($date) {
    // Déduction de la date donnée à la date actuelle
    $time = time() - strtotime($date); 

    // Calcule si le temps est passé ou à venir
    if ($time > 0) {
        $when = "il y a";
    } else if ($time < 0) {
        $when = "dans environ";
    } else {
        return "il y a 1 seconde";
    }
    $time = abs($time); 

    // Tableau des unités et de leurs valeurs en secondes
    $times = array( 31104000 =>  'an{s}',       // 12 * 30 * 24 * 60 * 60 secondes
                    2592000  =>  'mois',        // 30 * 24 * 60 * 60 secondes
                    86400    =>  'jour{s}',     // 24 * 60 * 60 secondes
                    3600     =>  'heure{s}',    // 60 * 60 secondes
                    60       =>  'minute{s}',   // 60 secondes
                    1        =>  'seconde{s}'); // 1 seconde         

    foreach ($times as $seconds => $unit) {
        // Calcule le delta entre le temps et l'unité donnée
        $delta = round($time / $seconds); 

        // Si le delta est supérieur à 1
        if ($delta >= 1) {
            // L'unité est au singulier ou au pluriel ?
            if ($delta == 1) {
                $unit = str_replace('{s}', '', $unit);
            } else {
                $unit = str_replace('{s}', 's', $unit);
            }
            // Retourne la chaine adéquate
            return $when." ".$delta." ".$unit;
        }
    }
}
?>


chat_vu.php

<table id="table_message">
<?php
while($don = $message->fetch())
{
 
    $color = $don['id']%2 ? "" : "#EDEDED";



?>
<tr style="background-color:<?php echo $color; ?>">
 <td class="info_message" valign="top">
 <span style="font-size:small;"><?php echo $don['Pseudo']; ?></span><br/>
 <?php echo getRelativeTime($don['Date']);?> 
 </td>
 <td class="message" >
 <div class="message2" >
 <?php echo $don['Message'];?>
 </div> 
 </td>

</tr>


<?php

}
?>
</table>


chat_controle.php :

<?php
require_once("chat_modele.php");
$bdd = bdd();

//récupération PROPRE DES VARIABLES AVANT de les utiliser
$name = !empty($_POST['name']) ? $_POST['name'] : NULL;
$message = !empty($_POST['message']) ? $_POST['message'] : NULL;
$statut = !empty($_POST['statut']) ? $_POST['statut'] : NULL;

$result = ""; //initialisation de la variable de retour

if($name &&  $statut) {
  if($message){
    if($statut == 3){
      $result = ajout_message_admin($bdd,$_POST['name'],$_POST['message'],$_POST['statut']);
    }else{
        $result = ajout_message($bdd,$_POST['name'],$_POST['message']); 
    }
  }else{
         $result =  "Votre messsage est vide !";
  }
  
}else{
 expire_message($bdd);
 $message = message($bdd);
 
}

//retourne la variable au format json
echo json_encode($result);
?>


chat.php :

<?php
session_start();
?>
<html>
<head>
<link rel="stylesheet" href="chat.css"/>
</head>
<body>

<table id="body">
<tr>
<td id="titre">Chat en Ajax avec PHP et JQuery</td>
</tr>

<tr >

<td style="height:300px">

<div id="chat_aff"></div>

</td>

</tr>

<tr >

<td id="form" valign="top">
<?php 
if(isset($_SESSION['id'])) {
    
?>
<table id="form2">
<input id="statut" type="hidden" value="<?= $_SESSION['statut'] ?>" />
<input id="name" type="hidden" value="<?= $_SESSION['pseudo'] ?>" />
<tr>
 <td style="width:100%">
 <label for="message" style="font-family:Comic Sans MS;">Message</label>
 </td>
 <td></td>

</tr>
<tr>
 <td colspan="2" >
 <input id="message" type="text" maxlength="250"  />
 </td>
 
 <td>
 
 </td>
</tr>

</table>
    
<?php 
}else{
?>
<center>Vous devez être connecter pour poster un message !</center><br/>
<?php    
    
}
?>

</td>

</tr>

</table>
   
<script src="http://code.jquery.com/jquery.min.js"></script>
<script>

 setInterval(function()
 {
 $("#chat_aff").load("chat_control.php",function(){}); 
 },1000);
 

 $("#message").keydown(function(event)
 {
        if ( event.which == 13 ) {
        var datas ={name:name
                 ,message:message
                 ,statut:statut};
            
 $.ajax({
  async: false ,
  type: 'POST',
  url: 'chat_control.php',
  data : datas,
  success: function(reponse){
    console.log(reponse);
    <?php include("chat_vue.php"); ?>
  }
  error: function(jqXHR, textStatus){
     console.log(jqXHR);
     alert(jqXHR.status + ":" +jqXHR.responseText );
   }  
 });


    </script>
</body>
    </html>


Mais j'ai toujours le même problème pas de message d'erreur et pas de message inscrit dans la base de donnée.....
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650 > flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021
1 sept. 2017 à 16:19
Il n'y a rien dans la console ? Tu y a activé le xhr au moins ??
0
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 21
1 sept. 2017 à 23:15
Bonsoir, non rien dans la console.
Le XMLHttpRequest je sais pas, car au début tous fonctionner sauf que j'arriver pas a update l'Etat de l'utilisateur connecter dans la DB.

Maintenant même le menu pour naviguer ne marche pu, et aucune erreur pourtant j'ai activer les erreurs dans Mamp et dans le fichier de connexion.

Je comprend pas pourquoi ça ne marche pas... comme si Ajax n'arriver pas a transmettre les données au serveur php.

Je vais bosser dessus toutes la nuit je vais bien voir.

Merci d'avance de votre réponse.
0
flo39400 Messages postés 596 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 9 septembre 2021 21
8 sept. 2017 à 15:31
Donc après des jours de recherche, j'ai changer le mode de ma base de donnée au lieu de faire un UPDATE pour le Statut régler sur 1 par défaut.
Je l'est laisser vide ce champs puis j'ai simplement fait un INSERT pour ajouter le Pseudo,Message,Statut,Date.

Cela simplifie le problème vu que faire deux fonctions avec un UPDATE en traitement n'a pas marcher.

Merci a vous de votre aide.
0