Bonjour bonjour !

Etant nouvelle ici, j'ai voulu poster dans "Développement Web", mais je ne pouvais pas car il y avait une histoire de points. Tant pis ! J'espère que j'ai trouvé la bonne section Je suis souvent passée par ici pour trouver des réponses pour développer mon site en PHP, et il me semble que ça soit plus sérieux que les autres forums de développeurs sur lesquels j'ai pu aller pour essayer (et qui du coup m'ont tellement déçue de par leur irrespect total que j'ai longtemps hésité avant de retenter l'expérience ici de peur de revivre la même chose (trollage alors que je sais de quoi je parle un minimum, condescendance genre "science infuse, tout le monde sait ça parce qu'on a oublié qu'il y a une première fois à tout", ignorance totale...)...j'attends donc de voir ^^)

Bref, bref, bref !

D'abord, expliquons la situation parce qu'elle est un peu compliquée. Si jamais vous avez besoin de plus de détail ou que j'ai mal expliqué un truc, n'hésitez pas à me demander plus de précision ^_^

Alors :

De base, j'ai un site RPG composé de plusieurs pages.
Sur certaines pages, 3 onglets : "Lieux, Forum, Tchat" (c'est un détail important ^^)
Pour mes tchats, j'ai ajouté un petit script javascript qui actualise chaque tchat tout seul toutes les 5 secondes. Cela fonctionne nickel.
Côté BDD, j'ai donc une table [Tchats] dans laquelle sont enregistrés chaque message posté, avec un champ "id_page" parce que j'ai plusieurs tchats.
J'ai aussi, pour les besoin du script PHP qui va suivre, une petite table "tchat_actu" dans laquelle j'ai trois champs : id, id_page, total_messages.

Mon but : quand un jour est connecté, il faudrait qu'une sorte de pastille visuelle s'affiche chaque fois qu'un autre joueur a posté un message. Mes conditions sont donc : "Affiche l'élément visuel de notification seulement s'il y a un nouveau message ET que le dernier posteur n'est pas le joueur connecté"

Mon algorithme PHP :

- A chaque chargement de page, ce n'est donc pas encore actualisé, le script va chercher combien de messages ont été enregistrés dans "table_actu".
- Il va également compter combien de messages sont actuellement présents dans "tchats" pour le tchat concerné (grâce à id_page, donc).
- Si les deux résultats sont égaux, il n'y a pas eu de nouveau message posté. Si au contraire, les messages dans le tchat sont en nombre supérieur à celui qui a été enregistré, c'est qu'un nouveau a été posté. Dans ce cas, on vérifie si son posteur n'est pas le joueur connecté, et si ce n'est pas le cas, on affiche un élément visuel (normalement, je l'aurai fait via une classe CSS, mais étrangement, ça ne fonctionnait pas, d'où l'utilisation de l'attribut "style". Ce n'est donc pas super, mais voilà l'explication de ça).
- Enfin, on met à jour le champ "total_messages" de la table "tchat_actu".

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
 
########################
###NOTIFICATION TCHAT###
########################
 
//Affiche l'onglet "Tchat" en rouge lorsqu'au moins un nouveau message a été envoyé sur le tchat correspondant à la page.
 
$url_tchat = basename($_SERVER['REQUEST_URI']);
 
if(isset($_GET['id_page']))
{
	$id_ref = $_GET['id_page'];
	$id_membre = $_GET['id_membre'];
}
else
{
	//Pas encore actualisé.
	$id_ref = $id_page;
	$id_membre = $_SESSION['num_membre'];
}
 
if($url_tchat == "notification_tchat.php?id_page=".$id_ref."&id_membre=".$id_membre."")
{
	//Plus de session.
	include ("../connexion_bdd.php");
}
 
echo "<div id='notif_tchat' class='anti_depassement' style='width:80%;position:absolute;z-index:1;text-align:right;'>";
 
//Ce script est actualisé toutes les 5 secondes avec scripts/actu_tchat.
//A chaque actualisation, on cherche d'abord le nombre de message total enregistré précédemment.
$req_total_tchat = $bdd->prepare("SELECT total_messages FROM tchat_actu WHERE id_page=:id");
$req_total_tchat->bindParam(":id",$id_ref,PDO::PARAM_STR);
$req_total_tchat->execute();
$resultat_total_tchat = $req_total_tchat->fetch();
$total_tchat = $resultat_total_tchat['total_messages'];
 
//Compter le nombre de messages actuellement sur ce tchat.
$req_total_messages_actuels = $bdd->prepare("SELECT COUNT(*) AS total FROM tchats WHERE id_page=:id");
$req_total_messages_actuels->bindParam(":id",$id_ref,PDO::PARAM_STR);
$req_total_messages_actuels->execute();
$resultat_total_messages_actuels = $req_total_messages_actuels->fetch();
$total_messages_actuels = $resultat_total_messages_actuels['total'];
 
//Attention au nettoyage BDD tous les mois qui vide la table.
if($total_tchat == NULL)
{
	//Pas de donnée, insérer. Le champ total_messages est sur 0 par défaut.
	$new_total = $bdd->prepare("INSERT INTO tchat_actu(id_page)VALUES(:id)");
	$new_total->bindParam(":id",$id_ref,PDO::PARAM_STR);
	$new_total->execute();
 
	$total_enregistre = 0;
}
else
{
	//On prend le total trouvé sur la première requête.
	$total_enregistre = $total_tchat;
}
 
if($total_messages_actuels > $total_enregistre)
{
	//Si le nombre de messages actuellement enregistré est supérieur à celui enregistré précédemment en BDD, ça signifie 
	//qu'il y a eu de nouveaux messages.
 
	//Mais ! On évite de mettre cette notification si l'auteur du dernier message est le joueur connecté !
	$req_proprio_message = $bdd->query("SELECT num_membre FROM tchats ORDER BY id DESC LIMIT 0, 1");
	$req_proprio_message->execute();
	$resultat_proprio_message = $req_proprio_message->fetch();
	$proprio_message = $resultat_proprio_message['num_membre'];
 
	if($proprio_message != $id_membre)
	{
		//Le dernier posteur n'est pas la personne connectée.
 
		//On met à jour la table correspondant à ce tchat.
		$maj_tchat_actu = $bdd->prepare("UPDATE tchat_actu SET total_messages=:total WHERE id_page=:id");
		$maj_tchat_actu->bindParam(":total",$total_messages_actuels,PDO::PARAM_STR);
		$maj_tchat_actu->bindParam(":id",$id_ref,PDO::PARAM_STR);
		$maj_tchat_actu->execute();
 
		//On affiche la notification. Bizarrement, ça ne fonctionne pas avec une class en CSS.
		echo "<div style='width:45px;height:35px;border-radius:50%;border:2px solid #594520;background-image:linear-gradient(to bottom,#bf95c0,#a8bee0);padding-top:15px;padding-left:5px;'><b><font color='red'>New !</font></b></div>";
	}
}
echo "</div>";
Code Javascript : (qui se trouve bel et bien entre les balises <head></head>
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script>
<script type="text/javascript">
var auto_refresh = setInterval(
	  function ()
	  {
		$('#notif_tchat').load('scripts/notification_tchat.php?id_page=<?php echo $id_page; ?>&id_membre=<?php echo $_SESSION['num_membre']; ?>').fadeIn("slow");
	  }, 5000); // Toutes les 5 secondes
</script>
Conclusion : tout simplement, ma div qui représente mon élément visuel n'apparaît pas.

Autre détail important : avant l'actualisation JS, url_tchat vaut le nom de mon fichier PHP où est inclus ce script, ensuite, lorsqu'il active le script, url_tchat vaut "script/notification_tchat...".
Si je n'ai pas mis le nom de la page directement (sachant qu'il y en a plusieurs, donc ça sera forcément une variable) dans le "load" de Javascript, c'est simplement parce que sinon, cet abruti de code me charge la page entière dans le bloc concerné. D'où le fait que je ne charge QUE le script concerné.

Il faut aussi savoir que pour accéder à ces pages, il faut s'être identifié(e), donc il y a forcément une session à ce niveau-là, que je perd quand ça s'actualise, d'où le début de mon code PHP qui peut sembler un peu étrange.

Voilà, en espérant que toutes ces explications vous aideront à comprendre mon soucis. Je pratique le PHP depuis deux-trois ans maintenant, de même que le SQL (même si j'en avais des bases depuis longtemps), mais le JS, je n'ai jamais eu l'occasion d'apprendre réellement, ce qui me donne des difficultés ^^

Donc si une âme gentille voulait bien m'aider, ça serait cool Cela fait un moment que je cogite, mais je ne trouve pas. Alors je tente de trouver l'inspi auprès de vous !

Merci d'avance pour les personnes qui voudront bien prendre le temps de se pencher sur mon cas ^^ Je suis à 90% de la chose, c'est frustrant ! J'ai tout à apprendre =)