[PHP-SQL-Javascipt] Pb Maj BDD

Fermé
Yull Master Messages postés 46 Date d'inscription vendredi 28 septembre 2007 Statut Membre Dernière intervention 17 janvier 2008 - 10 janv. 2008 à 11:32
Yull Master Messages postés 46 Date d'inscription vendredi 28 septembre 2007 Statut Membre Dernière intervention 17 janvier 2008 - 17 janv. 2008 à 15:02
Salut,

Je suis debutant en programation, et je me trouve fasse a un p'tit soucis...

Deja je vais commencer par expliquer ce que je souhaite obtenir.

En gros losqu'un utilisateur loggé quitte mon site sans faire deconnexion je veux que cela met a jour un valeur dans ma BDD.

J'ai donc pensé a utiliser avec OnBeforeUnload un javascript qui m'ouvre un pop up lorsque l'utilisateur clic sur la croix pour fermer son navigateur. Ce pop up test si la fenetre mere est bien fermer et dans ce cas enclenche un requete SQL modifiant la valeur voulue dans ma BDD.

J'ai bien mon pop up qui s'ouvre a la fermeture du navigateur mais cela ne met pas a jour la valeur de ma BDD.

J'espere donc que quelqu'un pourra m'aider et je l'en remercis d'avance.

voici mon code :

indexadm.php :

<LINK REL="SHORTCUT ICON" HREF="http://VJC/favicon.ico">

<script language="javascript">

<!--création d'une fonction ferm() qui va ouvrir le script/-->

function ferm(){
<!--ouverture de la fenêtre contenant le script/-->

window.open('Shoot.php','','toolbar=no,location=no, status=no, scrollbars=no, resizable=no, width=1, height=1, left=0, right=0');

}
</script>


</head>

<body style="font-family: Arial; font-size: 8 pt" OnBeforeUnload="javascript:ferm();">



Shoot.php (popup) :

<?php
session_start();
?>

<head><?echo'<meta http-equiv="refresh" content="0;URL=javascript:window.close();">';?></head>


<script language='javascript'>
<!--//on teste si la fenêtre mère a été fermée//-->
if (window.opener.close){

<?php

include("Conect.php");

$numd = $_SESSION['Login'];

mysql_query("UPDATE individu SET conect='0'WHERE Num_ind='$numd'");

?>
}

else{

<?
include("Conect.php");

$numd = $_SESSION['Login'];

mysql_query("UPDATE individu SET conect='1'WHERE Num_ind='$numd'");

?>
}


</script>
A voir également:

24 réponses

kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
10 janv. 2008 à 11:59
J'ai juste une petite remarque, l'erreur vient peut etre de là, quand tu fais :
if (window.opener.close){


A priori ca devrait de marquer une erreur javascript non ? Parce que ca n'existe pas.
Soit tu fais :
window.opener.close();

Pour fermer la fenetre, soit tu fais :
if (window.opener.closed){

Pour tester l'état de la fenetre.
Remplace par closed au lieu de close pour voir si ca change quelque chose. Si ce n'est pas le cas, peut tu mettre des traces (des alert par exemple) pour etre sur qu'il passe bien dans tes tests.
0
Attention il y a un gros mélange. PHP est un langage serveur et Javascript un langage client. Ce qui se traduit par le fait que php va générer les instruction html de la page puis une fois sur le navigateur javascript prendra la main.
Pour résumer et bien comprendre la différence regarde le source de la page shoot.php une fois quelle est affiché et tu compredras quelles instructions va traiter le "if (window.opener.close)".

Dans ton cas il faudrait que tu envois un formulaire lorsque la fenetre se ferme pour traiter les instruction PHP. Ou tu t'interesse a AJAX.
0
Yull Master Messages postés 46 Date d'inscription vendredi 28 septembre 2007 Statut Membre Dernière intervention 17 janvier 2008 1
10 janv. 2008 à 12:19
Merci a tout deux de vous interesser a mon probleme ^^

Je viens de tester avec

if (window.opener.closed){

pareil ca change rien ^^ et je n'ai aucune alerte qui apparais.



Sinon voici comme me la demandé Hotrod la source de ma page Shoot.php.

<head><meta http-equiv="refresh" content="30;URL=javascript:window.close();"></head>

<script language='javascript'>
<!--//on teste si la fenêtre mère a été fermée//-->
if (window.opener.closed){

}

else{

}
</script>


donc en gros si je comprend bien le if (window.opener.closed) dans mon cas n'execute rien lol

Je comprend un peu mieu le focntionnement.

Il faudrai donc soit que j'utilise un formulaire avec des case genre :

"Voulez -vous quitetr ?" Oui/Non

Ou alors que je me met a l'AJAX...connais pas du tout, est-ce compliqué a apprendre, connaissez vous un site qui propose des bon tutos sur le sujet ?

Merci encore pour votre aide et le temps que vous consacrez a me repondre^^

cdt
Yull
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
10 janv. 2008 à 13:02
Non non pas la peine, si tu souhaite mettre à jour de facon transparente, définit cette fonction javascript dans ta page (entre tes balises script donc):
function callScript ( scriptName, data ){
	
	var xhr_object = null; 
	     
	if(window.XMLHttpRequest) // Firefox 
	   xhr_object = new XMLHttpRequest(); 
	else if(window.ActiveXObject) // Internet Explorer 
	   xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
	else { // XMLHttpRequest non supporté par le navigateur 
	   alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
     return; 
	} 
	 
	xhr_object.open("POST", scriptName, true);
	     
	xhr_object.onreadystatechange = function() {
	   if(xhr_object.readyState == 4) {
			//alert(xhr_object.responseText); // DEBUG MODE
			//document.write(xhr_object.responseText);
			eval(xhr_object.responseText);
		 }
	} 
	 
	xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	xhr_object.send(data);
}

Elle te permet d'éxécuter un script PHP de facon transparente, avec possibilité de passer les arguments aux script en method POST ou GET (à modifier selon le choix). En gras la ligne qui te permet d'éxécuter le code afficher dans ton script PHP comme du javascript (en gros tu fais des echo "alert('coucou');" dans ton script PHP, et lorsque ce dernier est fini , la fonction traduit et exécute en javascript ce qui est écrit sur la sortie. Ca te permet donc de faire appel à ta base de données pour raffraichier dynamiquement ta page sans pour autant la recharher (notement via : document.getElementById("ma_div").innerHTML = "mon_contenu"; )

Puis dans ton test, fait appel à cette fonction comme suit :
<!--//on teste si la fenêtre mère a été fermée//-->
if (window.opener.closed){
     callScript("mon_script.php",null);
}

else{
     // --- Ne rien faire
}


Puis tu créé ton script de mise à jour PHP, nommé "mon_script.php" (changé le nom éventuellement) :
<?php
@session_start();

include("Conect.php");

$numd = $_SESSION['Login'];

mysql_query("UPDATE individu SET conect='0'WHERE Num_ind='$numd'");

?>


Et le tour devrait etre joué
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Yull Master Messages postés 46 Date d'inscription vendredi 28 septembre 2007 Statut Membre Dernière intervention 17 janvier 2008 1
10 janv. 2008 à 15:32
Merci pour tout ton aide ^^

Je viens de tester ce que tu m'a conseillé et pareil ca modifie pas ma valeur.

Je met le code car comme je suis debutant, j'ai surement fait des erreurs.

dans indexadm.php :


<script language="javascript">




function callScript ( scriptName, data ){

var xhr_object = null;

if(window.XMLHttpRequest) // Firefox
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // Internet Explorer
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else { // XMLHttpRequest non supporté par le navigateur
alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
return;
}

xhr_object.open("POST", scriptName, true);

xhr_object.onreadystatechange = function() {
if(xhr_object.readyState == 4) {
//alert(xhr_object.responseText); // DEBUG MODE
//document.write(xhr_object.responseText);
eval(xhr_object.responseText);
}
}

xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr_object.send(data);
}




<!--création d'une fonction ferm() qui va ouvrir le script de destruction de session/-->

function ferm(){
<!--ouverture de la fenêtre contenant le script/-->

window.open('Shoot.php','','toolbar=yes,location=yes, status=yes, scrollbars=yes, resizable=yes, width=250, height=250, left=0, right=0');

}
</script>


</head>

<body style="font-family: Arial; font-size: 8 pt" OnBeforeUnload="javascript:ferm();">




Shoot.php :

<?php
session_start();
?>

<head><?echo'<meta http-equiv="refresh" content="30;URL=javascript:window.close();">';?></head>


<script language='javascript'>

<!--//on teste si la fenêtre mère a été fermée//-->
if (window.opener.closed){
callScript("mon_script.php",null);
}

else{
// --- Ne rien faire
}

</script>


mon_script.php :

<?php
session_start();

include("Conect.php");

$numd = $_SESSION['Login'];

mysql_query("UPDATE individu SET conect='0'WHERE Num_ind='$numd'");

?>
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
10 janv. 2008 à 15:37
La fonction javascript est utilisée dans Shoot.php, il faut donc la définir dans ce fichier et non dans ton index
0
Yull Master Messages postés 46 Date d'inscription vendredi 28 septembre 2007 Statut Membre Dernière intervention 17 janvier 2008 1
10 janv. 2008 à 16:47
Re, ^^

bon bah j'ai toujours le meme soucis cela ne modifie pas la valeur dans la BDD

voici mon code

indexadm.php :

<script language="javascript">

<!--création d'une fonction ferm() qui va ouvrir le script de destruction de session/-->

function ferm(){
<!--ouverture de la fenêtre contenant le script/-->

window.open('Shoot.php','','toolbar=yes,location=yes, status=yes, scrollbars=yes, resizable=yes, width=250, height=250, left=0, right=0');

}
</script>


</head>

<body style="font-family: Arial; font-size: 8 pt" OnBeforeUnload="javascript:ferm();">



Shoot.php :

<?php
session_start();
?>

<head><?echo'<meta http-equiv="refresh" content="10;URL=javascript:window.close();">';?></head>


<script language='javascript'>


function callScript ( scriptName, data ){

var xhr_object = null;

if(window.XMLHttpRequest) // Firefox
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // Internet Explorer
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else { // XMLHttpRequest non supporté par le navigateur
alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
return;
}

xhr_object.open("POST", scriptName, true);

xhr_object.onreadystatechange = function() {
if(xhr_object.readyState == 4) {
//alert(xhr_object.responseText); // DEBUG MODE
//document.write(xhr_object.responseText);
eval(xhr_object.responseText);
}
}

xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr_object.send(data);
}




<!--//on teste si la fenêtre mère a été fermée//-->
if (window.opener.closed){
callScript("mon_script.php",null);
}

else{
// --- Ne rien faire
}

</script>



mon_script.php :

<?php
session_start();

include("Conect.php");

$numd = $_SESSION['Login'];

mysql_query("UPDATE individu SET conect='0'WHERE Num_ind='$numd'");

?>


Merci encore pour ton aide...
0
Yull Master Messages postés 46 Date d'inscription vendredi 28 septembre 2007 Statut Membre Dernière intervention 17 janvier 2008 1
11 janv. 2008 à 10:03
Re Salut,

arf en faite je tenais a preciser que cel afonctionne en faite sous ie mais pas sous FF.

Donc c'est deja un grand pas merci kij_82 pour ton aide et le temps que tu as passé a me repondre, et si au passage t'as lla solution pour qu eca marche aussi sous FF ce serais parfais ^^

cdt
Yull
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
11 janv. 2008 à 11:52
Re,

A priori c'est développé pour FF et non IE, donc si tu m'annonce que ca tourne pas sous FF je vais vite me pendre :D
Plus sérieusement, ca devrait fonctionner, je te laisse donc débugger pour savoir d'ou vient l'erreur sous FF.

As-tu une erreur dans la console d'erreur de FF ? (tu peux l'afficher via Outils->console d'erreurs) Si oui laquelle ?

Si tu met des alert(''); un peu partout pour tracer là ou passe ton programme, qu'obtiens-tu ? (c'est généralement la meilleure solution pour comprendre pourquoi ca ne fonctionne pas correctement.
0
Yull Master Messages postés 46 Date d'inscription vendredi 28 septembre 2007 Statut Membre Dernière intervention 17 janvier 2008 1
11 janv. 2008 à 12:03
Dans la console d'erreur FF il me dit :

windows.opener has no properties ligne : 39

donc en gros y'a un soucis su rla ligne

if (window.opener.closed){

il as pas l'air de comprendre, peu etre une erreur de synthax ?

Je tente apres manger en metatnt des alerrt mais le soucis a l'air de venir de la ^^
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
11 janv. 2008 à 13:03
Oui forcément, si la fenetre est déjà fermée tu ne peux pas récupérer son état (puisque l'objet parent (sur la fenetre fille) n'est plus disponible)

Conclusion, pour que ca ne mette pas d'erreur sous FF, fais ceci :
if (window.opener != null && window.opener.closed){
 ...
}

0
Yull Master Messages postés 46 Date d'inscription vendredi 28 septembre 2007 Statut Membre Dernière intervention 17 janvier 2008 1
11 janv. 2008 à 14:25
Je viens d'essayer avec ce que tu m'as donné, et pareil...bon je n'ai plus le message d'erreur dans la console d'erreur FF, mais tjrs pas de modif de ma BDD.

Encore un enorme merci deja pour l'avancé que tu m'a permit d'avoir...
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
11 janv. 2008 à 14:39
Arf, désolé je suis allé trop vite, fais plutot ce test :

 if ( window.opener == null || window.opener.closed ) {
    // --- SQL mise à jour
 }


Ce qui équivaut à dire : si la fenetre est déjà fermée ou que son status est à fermé (ce qui normalement ne devrait jamais être le cas puisque la fenetre ne serait plus et donc le parent de la popup serait null), alors je fais la requete de mise à jour sur la base de données.
Dans le cas contraire (fenetre parent toujours et non closed), je ne fais rien (tu peux faire autre chose si tu veux)
0
Yull Master Messages postés 46 Date d'inscription vendredi 28 septembre 2007 Statut Membre Dernière intervention 17 janvier 2008 1
11 janv. 2008 à 14:57
Toujours pas de MAJ de la BDD, et j'ai cette erreur qui s'ffiche dans la console :

Erreur : syntax error
Fichier source : Shoot.php
Ligne : 27
Code source :
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">


lol, je sais je suis un boulet ^^

Merci vraiment pour tout
0
Yull Master Messages postés 46 Date d'inscription vendredi 28 septembre 2007 Statut Membre Dernière intervention 17 janvier 2008 1
11 janv. 2008 à 15:02
Je remet le code de mes pages :

indexadm.php :

<?php
session_start();
include("VLog.php");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
<head>

<title>Yull World</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<link rel="stylesheet" media="screen" type="text/css" title="Yull" href="styles/Yull.css" />
<!--<link rel="alternate stylesheet" media="screen" type="text/css" title="OtherDesign" href="otherdesign.css" />-->

<LINK REL="SHORTCUT ICON" HREF="http://VJC/favicon.ico">

<script language="javascript">

<!--création d'une fonction ferm() qui va ouvrir le script de destruction de session/-->

function ferm(){
<!--ouverture de la fenêtre contenant le script/-->

window.open('Shoot.php','','toolbar=no,location=no, status=no, scrollbars=no, resizable=no, width=1, height=1, left=0, right=0');

}
</script>


</head>

<body style="font-family: Arial; font-size: 8 pt" OnBeforeUnload="javascript:ferm();">



Shoot.php :

<?php
session_start();
?>

<head><?echo'<meta http-equiv="refresh" content="1;URL=javascript:window.close();">';?></head>


<script language='javascript'>


function callScript ( scriptName, data ){

var xhr_object = null;

if(window.XMLHttpRequest) // Firefox
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // Internet Explorer
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else { // XMLHttpRequest non supporté par le navigateur
alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
return;
}

xhr_object.open("POST", scriptName, true);

xhr_object.onreadystatechange = function() {
if(xhr_object.readyState == 4) {
//alert(xhr_object.responseText); // DEBUG MODE
//document.write(xhr_object.responseText);
eval(xhr_object.responseText);
}
}

xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr_object.send(data);
}




<!--//on teste si la fenêtre mère a été fermée//-->
if ( window.opener == null || window.opener.closed ) {
callScript("scrpt.php",null);
// --- SQL mise à jour

}

else{
// --- Ne rien faire
}

</script>



scrpt.php :

<?php
session_start();

include("Conect.php");

$numd = $_SESSION['Login'];

mysql_query("UPDATE individu SET conect='0'WHERE Num_ind='$numd'");

?>
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
11 janv. 2008 à 16:01
Décommente cette ligne :
//alert(xhr_object.responseText); // DEBUG MODE

Dans la fonction javascript et dis moi ce que ca affiche

Autre chose, test en mettant un '@' devant ton mysql_query dans ton script pour voir s'il te met toujours la même erreur de syntaxe.
0
Yull Master Messages postés 46 Date d'inscription vendredi 28 septembre 2007 Statut Membre Dernière intervention 17 janvier 2008 1
14 janv. 2008 à 14:46
J'ai fait un imprime ecran et donc voici ce qu'il me dit quand je decommante la ligne que tu m'a demandé :

http://img134.imageshack.us/img134/8743/sanstitrewi0.jpg

et en ajoutant le @ dans mon scipt j'ai toujours l'erreur dans ma console :

Erreur : syntax error
Fichier source : http://www.villajuifacrew.com/YW/Shoot.php
Ligne : 27
Code source :
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
14 janv. 2008 à 17:30
Je suis surfcontrolé je ne peux pas voir ton screen désolé.
Tu peux me mettre le libellé de l'erreur, juste pour avoir une idée ?
0
Yull Master Messages postés 46 Date d'inscription vendredi 28 septembre 2007 Statut Membre Dernière intervention 17 janvier 2008 1
15 janv. 2008 à 15:06
Il me sort tout un bloque c'ets pour cela que j'ai fait un screen.

mais je pense que ce que tu veux c'est ca :

ERROR: The requested URL could not be retrieved


désolé pou rle temps de reponse mais je suis un peu charger en ce miment et est donc moin de temps pour passer sur CCM.


Mais vraiment merci bcp de ton investissement ^^
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
15 janv. 2008 à 16:36
Corrige l'url du script PHP appellé dans ce cas là, ici :

callScript("scrpt.php",null);


Il faut passer le chemin relatif par rapport ou est situé ton fichier shoot.php.
0