Bonjour,
Je veux vérifier "en permanence" si dans ma table users un utilisateur à la valeur '1' pour kick.
Si c'est le cas je déconnecte l'utilisateur et actualise la page ou simplement je le redirige vers la page "logout.php" peu importe.
Premier test:
Coté js:
function kick(){
$.post(tchat.php,{fonction:"kick"},function(data){
if(data.erreur=="ok"){
location.reload();
}
else{
}
},"json");
return false;}
Coté php:
if($_POST"fonction"]=="kick"){
$sql17 = "SELECT pseudo FROM users WHERE kick = 1";
$req17 = mysql_query($sql17) or die(mysql_error());
$data17=mysql_fetch_assoc($req17);
$pseudo17=$data17'pseudo'];
if($_SESSION'Auth']'pseudo'] == $pseudo17){
$_SESSION=array();
session_destroy();
$d"erreur"] ="ok";
}
}
Deuxième test:
Coté js:
function kick(){
$.post(tchat.php,{fonction:"kick"},function(data){
if(data.erreur=="ok"){
}
else{
}
},"json");
return false;}
Coté php:
if($_POST"fonction"]=="kick"){
$sql17 = "SELECT pseudo FROM users WHERE kick = 1";
$req17 = mysql_query($sql17) or die(mysql_error());
$data17=mysql_fetch_assoc($req17);
$pseudo17=$data17'pseudo'];
if($_SESSION'Auth']'pseudo'] == $pseudo17){
header('Location:../membre/logout.php');
$d"erreur"] ="ok";
}
}
Dans les 2 cas l'utilisateur est bien déconnecter mais la page n'est pas actualisé, et l'utilisateur n'est pas rediriger.
Es qu'il y a une erreur quelque part ?
Ou es ce qu'il y a une autre solution ?
Merci de votre aide.
ET bah si avec cette config tu es capable de logger "kicked: 0" et "kicked: 1" en console lorsque tu test un pseudo non-blacklisté et un pseudo blacklisté respectivement, ca veut dire que tout fonctionne bien.
A toi d'utiliser la variable data.kicked pour faire la redirection, comme tu le fais entre les lignes 26 et 29 (décomment tout, vire la fonction qui est entre les lignes 34 et 36, et tout devrait rouler.
Je dirai que vu que tu fais ça en Ajax, et donc que c'est asynchrone, c'est directement sur le client qu'il faut gérer le refresh / redirect, donc en javascript.
Avec jQuery, tu as la fonction reload() pour le refresh (à appeler sur location. il me semble, ou bien sur window. ou document.), et pour le redirect tu as tout simplement window.location = http://...
Merci de de m'aider.
J'ai essayer tous se que tu mas dit.
if(data.erreur=="ok"){
window.location = 'http://monsite/index.php';
}
if(data.erreur=="ok"){
location.reload();}
et aussi avec
window.reload et document.reload
Sa ne marche pas :/
Hum. Rajoute un console.log('test'); là dedans, pou voir si tu as bien un "test" qui s'affiche dans ta console Javascript dans le cas où data.erreur == 'ok'.
Je vois pas bien ou est la difficulté. Tes scripts ont l'air plus compliqués que nécessaire:
En php, il te suffit de tester le nombre de lignes ou pseudo = pseudo, et kick = 1. Si aucune ligne: le pseudo n'est pas kické, si une ligne: le pseudo est kické.
// kick.php
<?php
$db = new PDO('mysql:host=localhost;dbname=test', 'root', ''); // A changer en fonction de ton truc
$stmt = $db -> prepare("SELECT * FROM test WHERE kick = 1 AND pseudo = ?");
$stmt -> execute( array($_SESSION'Auth']'pseudo']) );
echo $stmt -> rowCount();
En JS, il suffit de vérifier si kick.php retourne 1 ou 0, s'il retourne 1, faire une relocation vers logout.php:
// Dans ton fichier JS
$.getJSON( "kick.php", function( data ) {
if(data == 1){
window.location.href = "logout.php";
}
});
Je devrais sans doute rajouter que, puisque cette vérification périodique est faite en ajax (donc en JS), il n'est pas compliqué de la déactiver ...
Bonjour,
je tiens à préciser que mysql est devenu obsolète/deprecated depuis PHP 5.3 (je crois).
Il faut éviter de l'utiliser, si ton serveur met à jour la librairie PHP, un jour tu vas te retrouver à devoir tous recoder.
Pour le sujet, est-ce que ta fonction JS kick() est bien éxécutée ?
Vallyan je suis d'accord avec toi, dans ce cas il reste les tâches Cron mais je n'est aucune idée de comment sa fonctionne. Alors je fais avec se que je connais un peu mieux pour le moment. exothermique, oui on m'avais déjà conseiller d'utiliser mysqli ou pdo plutôt que mysql. Mais je trouve mysql plus simple donc je l'utilise encore en attendant que j’apprenne pdo. En effet ma fonction kick s’exécute pas. [code]if(data.erreur=="ok"){ window.reload(); } else{ alert(data.erreur); }[/code] J'ai mis ceci, sa devrais m'afficher un message d'erreur toute les 2secondes normalement. Et aucun message d'erreur. Voici mon js "tchat.js" [code] var url="tchatAjax.php"; var lastid=0; var timer=setInterval(getMessages,2000); var timerk=setInterval(kick,2000); $(function(){ $("#tchatForm form").submit(function(){ clearInterval(timer) showLoader("#tchatForm"); var message = $("#tchatForm form input.message").val(); $.post(url,{action:"addMessage",message:message},function(data){ if(data.erreur=="ok"){ getMessages(); kick(); $("#tchatForm form input.message").val(""); } else{ alert(data.erreur); } timer=setInterval(getMessages,2000); hideLoader(); },"json"); return false; }) }); function kick(){ $.post(tchat.php,{fonction:"kick"},function(data){ if(data.erreur=="ok"){ location.reload(); } else{ alert(data.erreur); } },"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); } $('#tchat').manageScrollbar({timer: 2000, acceptDiff: 93});},"json"); return false; } function showLoader(div){ $(div).append('
'); $(".loader").fadeTo(500,0.6); } function hideLoader(){ $(".loader").fadeOut(500,function(){ $(".loader").remove(); }); } (function( $ ){ var settings = new Object(); var methods = { init : function( options ) { settings = $.extend( { timer: 2000, acceptDiff: 80 }, options); elements = new Array(); this.each(function(){ var element = this; elements.push(element); }); var interval = methods.initInterval.call( this, elements ); }, initInterval : function ( elements ) { return setInterval(function (){ for(var i in elements) { if ( methods.needToScrollDown.apply( elements* ) ) { methods.scrollDown.apply( elements* ); } } }, settings.timer); }, scrollDown : function () { $(this).scrollTop($(this)[0].scrollHeight); }, needToScrollDown : function () { return ($(this).height() + $(this).scrollTop() >= $(this)[0].scrollHeight * settings.acceptDiff / 100); } }; $.fn.manageScrollbar = function( method ) { if ( methods[method] ) { return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 )); } else if ( typeof method === 'object' || ! method ) { return methods.init.apply( this, arguments ); } else { $.error( 'Method ' + method + ' does not exist on jQuery.manageScrollbar' ); } }; })( jQuery ); [/code] Merci de votre aide.
Pakito j'ai mis
console.log('test');
sa affiche rien.
Vallyan j'ai essayer se que tu as dis sa fonctionne pas non plus et sa n'envoie plus les messages.
Pour expliquer le truc c'est le tchat php/ajax du tuto de se site que j'ai modifier.
Quand un utilisateur qui à les permissions requise écris "/kick membre" cela donne la valeur "1" à kick pour l'utilisateur membre. Une fois cela fais, il faut détecté quel utilisateur à la valeur 1 à kick pour le déconnecté.
Le script que je t'ai indiqué fonctionne (j'ai testé avant de te le mettre).
Il n'y a pas de message, ca fait juste ce que tu voulais (vérifie le kick, et redirige si il y a kick).
Je ne dis pas qu'il ne faut pas adapter en fonction de ton code (peut-etre que tu ne veux pas d'un fichier kick.php, peut-etre que ta table ne s'appelle pas test, la requete ajax doit etre placée dans un setInterval, ajouter un message [encore que si tu redirige, le message se verra pas ...] ...) mais en tous cas le code que je te donne fonctionne.
J'ai adapté le code. (J'avais oublier de modifier le nom de la table.)
J'ai mi le php dans ma page tchat.php
J'ai modifier les infos de connexion à la BDD et le nom de la table.
Dans le js j'ai remplacer kick.php par tchat.php
Pour l'utilisateur kické je vois bien le petit 1 en haut à gauche mais il est pas rediriger.
Et je dois le mettre dans une fonction pour le mettre dans un setInterval ? je suis nul en js :x
Merci de ton aide.
Le setInterval(), c'est pour lancer ta fonction toutes les X secondes, uniquement (tu avais l'air de vouloir faire la vérif régulièrement). Pour le moment on s'en fout, on va juste faire marcher le code.
Bizarre que tu ne sois pas redirigé. Déja on va regarder si tu récupères correctement les info que te renvoie le serveur: Pour ta fonction ajax, utilises le code suivant (a adapter a nouveau):
$.getJSON( "kick.php", function( data ) {
console.log(data);
});
Je précise aussi que pour voir ce que t'affiche la console javascript, il faut que tu passes par l'inspecteur (F12 sous chrome, par exemple, puis selectionne l'onglet "console").
Cela devrait t'afficher un 1 si l'utilisateur est kické, un 0 sinon.
Dans la console de chrome rien s’affiche, a part le curseur pour entré du texte.
Par contre dans network je regarde la requête qui viens de tchat.php puis dans preview la il y a écrit 0 ou 1 si kick.
Sur firefox, quand j'actualise la page firebug me montre cette ligne
return JSON.parse( data + "" );
du jquery.js
et voici se qui dit
JSON.parse: unexpected non-whitespace character after JSON data
Line 7428
OK. Peux-tu me monter ta fonction qui fait l'appel ajax stp ? Je suppose qu'lle ressemble a l'une de celle que tu montres au dbut du thread mais je voudrais voir la version que tu utilises maintenant ...
komodo souligne en vert cette ligne $.fn.manageScrollbar = function( method ){ [code]var url="tchatAjax.php"; var lastid=0; var timer=setInterval(getMessages,2000); $(function(){ $("#tchatForm form").submit(function(){ clearInterval(timer) showLoader("#tchatForm"); var message = $("#tchatForm form input.message").val(); $.post(url,{action:"addMessage",message:message},function(data){ if(data.erreur=="ok"){ getMessages(); $("#tchatForm form input.message").val(""); } else{ alert(data.erreur); } timer=setInterval(getMessages,2000); hideLoader(); },"json"); return false; }) }); $.getJSON( "tchat.php", function( data ) { console.log(data); }); 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); } $('#tchat').manageScrollbar({timer: 2000, acceptDiff: 93});},"json"); return false; } function showLoader(div){ $(div).append('
'); $(".loader").fadeTo(500,0.6); } function hideLoader(){ $(".loader").fadeOut(500,function(){ $(".loader").remove(); }); } (function( $ ){ var settings = new Object(); var methods = { init : function( options ) { settings = $.extend( { timer: 2000, acceptDiff: 80 }, options); elements = new Array(); this.each(function(){ var element = this; elements.push(element); }); var interval = methods.initInterval.call( this, elements ); }, initInterval : function ( elements ) { return setInterval(function (){ for(var i in elements) { if ( methods.needToScrollDown.apply( elements* ) ) { methods.scrollDown.apply( elements* ); } } }, settings.timer); }, scrollDown : function () { $(this).scrollTop($(this)[0].scrollHeight); }, needToScrollDown : function () { return ($(this).height() + $(this).scrollTop() >= $(this)[0].scrollHeight * settings.acceptDiff / 100); } }; $.fn.manageScrollbar = function( method ){ if ( methods[method] ) { return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 )); } else if ( typeof method === 'object' || ! method ) { return methods.init.apply( this, arguments ); } else { $.error( 'Method ' + method + ' does not exist on jQuery.manageScrollbar' ); } }; })( jQuery );[/code]
Dans mon script kick.php, la seule chose qu'il y avait était le script de verif du kick, et la seule chose que retournait ce script était 1 ou 0. Toi tu envoies ta requete ajax vers tchat.php, or ce script n'execute pas seulement la verif du kick mais aussi tout un tas d'autres trucs, et c'est pour cela que getJSON ne reconnait pas du json.
Tu as la choix de
J'ai créer un fichier kick.php
Firebug me montre toujours la même ligne mais par contre dans la console de chrome je vois le 0 ou le 1
Alors, firebug est pas content parce que c'est pas vraiment du json que le php retourne. Si tu veux faire du vrai json, va dans ton kick.php et remplace la ligne suivante:
echo $stmt -> rowCount();
par:
echo "{\"kicked\":" . $stmt -> rowCount() . "}";
Une fois que c'est fait, va dans ton JS et modifie ta fonction comme suit:
$.getJSON( "kick.php", function( data ) {
if(data.kicked == 1){
//window.location.href = "logout.php"
console.log("kicked");
}
});
Normalement au chargement de ta page, tu devrais avoir le message "Kicked" dans ta console si le pseudo est blacklisté. Si ca marche, tu peux dé-commenter la ligne précédente qui fait la redirection vers le logout.
Firebug toujours pas content mais c'est pas grave si sa empêche pas le fonctionnement
Il y avais rien dans la console alors j'ai rajouté
if(data.kicked == 0){
console.log("nokicked");
}
Et sa affiche "nokicked" dans les 2 cas
Edit: j'ai refais la verif qu'on a fait juste avant et elle affiche 0 dans les 2 cas pourtant j'ai rien toucher d'autre
Bizarre, ca marchait avant ...
Ca va etre a toi de débugger pour voir un peu ou est le problème. Pour ce faire, tu peux tester plusieurs trucs, par exemple:
Dans ton fichier kick.php, vire (commente) tout, et écrit en dur
echo "{\"kicked\":0};
ou
echo "{\"kicked\":1};
Cela te dira si le problème vennait du script php ou de script js
console: Object {kicked: 1}
J'ai repris tous le sujet depuis le début et sa remarche pas :/ je comprend pas. On avait quasiment fini :'(
Pas de panique, on va y arriver ^^
[code]<?php require('../auth.php');
$db = new PDO('mysql:host=mysql.hostinger.fr;dbname=xxx', 'xx', 'xxx');
$stmt = $db -> prepare("SELECT * FROM users WHERE kick = 1 AND pseudo = ?"); $stmt -> execute( array($_SESSION['Auth']['pseudo']) ); echo "{\"kicked\":" . $stmt -> rowCount() . "}"; /* echo "{\"kicked\":0}"; */ ?>[/code] [code]var url="tchatAjax.php"; var lastid=0; var timer=setInterval(getMessages,2000); $(function(){ $("#tchatForm form").submit(function(){ clearInterval(timer) showLoader("#tchatForm"); var message = $("#tchatForm form input.message").val(); $.post(url,{action:"addMessage",message:message},function(data){ if(data.erreur=="ok"){ getMessages(); $("#tchatForm form input.message").val(""); } else{ alert(data.erreur); } timer=setInterval(getMessages,2000); hideLoader(); },"json"); return false; }) }); /* $.getJSON( "kick.php", function( data ) { if(data.kicked == 1){ //window.location.href = "../membre/logout.php" console.log("kicked"); } }); */ $.getJSON( "kick.php", function( data ) { console.log(data); }); 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); } $('#tchat').manageScrollbar({timer: 2000, acceptDiff: 93});},"json"); return false; } function showLoader(div){ $(div).append('
'); $(".loader").fadeTo(500,0.6); } function hideLoader(){ $(".loader").fadeOut(500,function(){ $(".loader").remove(); }); } (function( $ ){ var settings = new Object(); var methods = { init : function( options ) { settings = $.extend( { timer: 2000, acceptDiff: 80 }, options); elements = new Array(); this.each(function(){ var element = this; elements.push(element); }); var interval = methods.initInterval.call( this, elements ); }, initInterval : function ( elements ) { return setInterval(function (){ for(var i in elements) { if ( methods.needToScrollDown.apply( elements* ) ) { methods.scrollDown.apply( elements* ); } } }, settings.timer); }, scrollDown : function () { $(this).scrollTop($(this)[0].scrollHeight); }, needToScrollDown : function () { return ($(this).height() + $(this).scrollTop() >= $(this)[0].scrollHeight * settings.acceptDiff / 100); } }; $.fn.manageScrollbar = function( method ) { if ( methods[method] ) { return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 )); } else if ( typeof method === 'object' || ! method ) { return methods.init.apply( this, arguments ); } else { $.error( 'Method ' + method + ' does not exist on jQuery.manageScrollbar' ); } }; })( jQuery );[/code]