Menu

Tchat en php js ajax [Résolu]

flo39400 589 Messages postés mardi 8 avril 2008Date d'inscription 8 février 2018 Dernière intervention - 31 août 2017 à 01:37 - Dernière réponse : flo39400 589 Messages postés mardi 8 avril 2008Date d'inscription 8 février 2018 Dernière intervention
- 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.....
Afficher la suite 

8 réponses

Répondre au sujet
jordane45 20066 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 22 février 2018 Dernière intervention - 31 août 2017 à 13:57
0
Utile
6
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 :
http://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs
jordane45 20066 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 22 février 2018 Dernière intervention > flo39400 589 Messages postés mardi 8 avril 2008Date d'inscription 8 février 2018 Dernière intervention - 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";
flo39400 589 Messages postés mardi 8 avril 2008Date d'inscription 8 février 2018 Dernière intervention - 1 sept. 2017 à 09:51
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.....
jordane45 20066 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 22 février 2018 Dernière intervention > flo39400 589 Messages postés mardi 8 avril 2008Date d'inscription 8 février 2018 Dernière intervention - 1 sept. 2017 à 16:19
Il n'y a rien dans la console ? Tu y a activé le xhr au moins ??
flo39400 589 Messages postés mardi 8 avril 2008Date d'inscription 8 février 2018 Dernière intervention - 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.
flo39400 589 Messages postés mardi 8 avril 2008Date d'inscription 8 février 2018 Dernière intervention - 1 sept. 2017 à 23:23
Re bon je sais ça viens de quoi mon
<?php include("chat_vue.php"); ?>
Dans le script fait tous planté le code.

Mais ou je peu le mètre vu que dans le script cela ne passe pas ?
Commenter la réponse de jordane45
flo39400 589 Messages postés mardi 8 avril 2008Date d'inscription 8 février 2018 Dernière intervention - 8 sept. 2017 à 15:31
0
Utile
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.
Commenter la réponse de flo39400