Bonsoir,
J'ai utiliser le tuto Tchat Ajax/PHP pour faire un tchat privée ente deux utilisateurs tout fonctionne parfaitement sauf l'affichage automatique des messages. je vous met le code de mes trois pages :
tchat.php :
<?php
include('includes/header.php');
?>
<div class="row">
<div id="contentTchat" class="large-12 columns" role="content">
<div id="conteneur">
<p><i>Vous êtes connecté en tant que <?php echo $_SESSION"login"]; ?></i></p>
<!-- <div id="connected">
</div> -->
<div id="tchat">
<?php
if(isset($_POST'idUser']))
$_SESSION'idUser2'] = $_POST'idUser'];
$sql = "SELECT * FROM messages";
$sql .= " WHERE (idUser1 = ".$_SESSION'id']." AND idUser2 = ".$_SESSION'idUser2'].")";
$sql .= " OR (idUser1 = ".$_SESSION'idUser2']." AND idUser2 = ".$_SESSION'id'].")";
$sql .= " ORDER BY date DESC LIMIT 15";
$req = $dbh->query($sql) or die(print_r($dbh->errorInfo()));
$d = array();
while($data = $req->fetch(PDO::FETCH_ASSOC)){
$d] = $data;
}
for ($i=count($d)-1; $i >= 0 ; $i--)
{
$date_fr = date('d/m à H:i:s', $d$i]"date"]);
?>
<p><strong class="NomUserTchat"><?php echo NomTchatUser($d$i]"idUser1"], $dbh); ?></strong> le <em><?php echo $date_fr; ?></em> : <?php echo htmlentities($d$i]"content"]); ?></p>
<?php
}
?>
</div>
</div>
<div id="tchatForm" class="large-12 columns">
<form method="POST" action="#" name="testForm">
<div class="large-12 columns">
<textarea name="message" rows="5" cols="70"></textarea>
</div>
<div class="large-12 columns">
<input class="button postfix" type="submit" value="Envoyer">
</div>
</form>
</div>
</div>
</div>
<?php
include('includes/footer.php');
?>
tchat.js :
var url = "tchatAjax.php";
var lastid = 0;
var timer = setInterval(getMessages,5000);
// var ctimer = setInterval(getConnected,10000);
$(function(){
$("#tchatForm form").submit(function(){
clearInterval(timer);
var message = $("#tchatForm form textarea").val();
$.post(url,{action:"addMessage", message:message},function(data){
if (data.erreur == "ok") {
getMessages();
$("#tchatForm form textarea").val("");
}
else{
alert(data.erreur);
}
timer = setInterval(getMessages,5000);
},"json");
return false;
})
});
function getMessages(){
$.post(url,{action:"getMessages", lastid:lastid},function(data){
if (data.erreur == "ok") {
$("#tchat").append(data.result);
lastid = data.lastid;
}
else{
alert(data.erreur);
}
},"json");
return false;
}
tchatAjax.php :
<?php
include('includes/header.php');
?>
<?php
$d = array();
if (!isset($_SESSION"login"]) || empty($_SESSION"login"]) || !isset($_POST"action"])) {
$d"erreur"] = "Vous devez être connecté pour utiliser le tchat";
}
else{
extract($_POST);
$pseudo = $_SESSION"login"];
/**
* Action : addMessage
* Permet l'ajout d'un message
*/
if ($_POST"action"] == "addMessage") {
$req = $dbh->prepare('INSERT INTO messages(id, content, idUser1, idUser2, date) VALUES (:id, :content, :idUser1, :idUser2, :date)');
$req->bindParam(':id', $id);
$req->bindParam(':content', $content);
$req->bindParam(':idUser1', $idUser1);
$req->bindParam(':idUser2', $idUser2);
$req->bindParam(':date', $date);
$id = '';
$content = $_POST'message'];
$idUser1 = $_SESSION'id'];
$idUser2 = $_SESSION'idUser2'];
$date = time();
//Execution
$req->execute();
$d"erreur"] = "ok";
}
/**
* Action : getMessages
* Permet l'affichage des derniers messages
*/
if ($_POST"action"] == "getMessages") {
$lastid = floor($lastid);
$sql = "SELECT * FROM messages WHERE id>$lastid ORDER BY date ASC";
$req = $dbh->query($sql) or die(print_r($dbh->errorInfo()));
$d"result"] = "";
$d"lastid"] = $lastid;
while ($data = $req->fetch(PDO::FETCH_ASSOC))
{
date_en_fr($date_fr, $data"date"]);
$d"result"] .= '<p><strong>'.NomTchatUser($data"idUser2"], $dbh).'</strong> ('.$date_fr.') : '.htmlentities(utf8_decode($data"content"])).'</p>';
$d"lastid"] = $data"id"];
}
$d"erreur"] = "ok";
}
}
echo json_encode($d);
?>
<?php
include('includes/footer.php');
?>
C'est assez fouillis et compliqué à comprendre, car tu mélanges plusieurs choses et c'est sûrement pour ça que tu as du mal à voir ton erreur.
Dans ton code, tu dois avoir une page qui récupère les résultats et les affiche, ici ton tchat.php. Ensuite tu as tes webservices qui font CHACUN une fonctionnalité. C'est plus propre, plus simple à débugguer et ça te permettra, si tu désires enlever des fonctionnalités une souplesse beaucoup plus importante dans ton architecture.
Et pour finir, tu as un javascript qui va faire des requêtes AJAX. Je te conseille aussi vu que tu débutes de passer par les fonctions $.ajax de jQuery directement, plutôt que par $.post etc, ça permet de s'entraîner avec la syntaxe et de prendre de bonnes habitudes.
Aussi, tu verras que de séparer tes webservices te permettra de renvoyer en json exactement l'info que tu veux et ça te paraîtra cent fois plus simple. Idem pour ton tchat.php, qui n'est pas censé comporter des requêtes SQL. Fais plutôt une page functions.inc.php, dans laquelle tu auras une fonction getMessages(), qui renverra un tableau à 2 dimensions avec un tableau par message dedans. Tu n'auras qu'à boucler dedans et ta page sera encore une fois beaucoup plus simple et plus structurée.
Au moins si tout fonctionne, ça signifie que ton soucis vient d'une petite chose qui te bloque, mais tu ne risques pas de la voir dans tout ce fouillis, autant chercher une aiguille dans une botte de foin !
salut, tu pourrais utiliser les balises codes en haut à droite afin de nous faciliter la rechercher merci
ce que je comprends pas c'est que ça fait deux jours que j'essaye de débuguer le code ! en fait le js ne va pas plus loin que la ligne : $.post(url,{action:"addMessage", message:message},function(data){
Donc si quelqu'un est capable de trouver d'où vient le problème ça me soulagerai tellement
Déjà a la ligne 3 il te manque les parenthèses ( c'est bizarre j'ai fait la même erreur)
var timer = setInterval(getMessages(),5000);
Tu veux dire qu'il n'enregistre même pas le message dans la bdd ?
Le truc c'est que les parenthèses sont pas obligatoires je crois enfin que je les mette ou pas ça change rien.
si le message s'enregistre dans la BDD mais dès que je mets une alert sur la ligne d'après elle ne s'affiche pas ...