IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Rafraichissement nécessaire pour actualiser un cookie AJAX?


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Rafraichissement nécessaire pour actualiser un cookie AJAX?
    Bonjour, je suis nouveau sur le forum et débutant en développement web.
    Je crée mon site (http://www.aromasie.com) sous joomla et je souhaite adapter le template en fonction de la résolution. Pour cela, j'utilise une méthode AJAX mise au point par un certain Cr@zy:

    extrait de index.php :
    Code php : 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
     
     
    <script type="text/javascript" src="resscreen.js"></script>
     
     
    <?php
     
    switch (ereg("MSIE", $_SERVER["HTTP_USER_AGENT"])) {
    case True:
    	/* navigateur = IE */
        /*echo "IE";*/
    	if ($_COOKIE['res_width'] > 1200) {
    		/*Résolution grande*/
    		$Chemin_css = "...template_grand_IE.css";
    		echo ($_COOKIE['res_width']);
    		}
    	else {
    		/*Résolution petite*/
    		$Chemin_css = "...template_petit_IE.css";
    		echo ($_COOKIE['res_width']);
    		}
        break;
    case False:
    	/* Navigateur != IE*/
        /*echo "Autre";*/
    	if ($_COOKIE['res_width'] > 1200) {
    		/*Résolution grande*/
    		$Chemin_css = "...template_grand.css";
    		echo ($_COOKIE['res_width']);
    		}
    	else {
    		/*Résolution petite*/
    		$Chemin_css = "...template_petit.css";
    		echo ($_COOKIE['res_width']);
    		}
        break;
    }
    ?>
    <link rel="stylesheet" href=<?php echo $Chemin_css?> type="text/css" />

    Voici le code javascript (resscreen.js) :

    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
     
    function Xhr_ResScreen(file){
    	if( window.XMLHttpRequest ){
    	  xhr = new XMLHttpRequest();
    	  if ( xhr.overrideMimeType ) xhr.overrideMimeType('text/html; charset=ISO-8859-1');
    	} else {
    	   if ( window.ActiveXObject ){
    		try {
    		  xhr = new ActiveXObject("Msxml2.XMLHTTP");
    		} catch (e) {
    		  try {
    			xhr = new ActiveXObject("Microsoft.XMLHTTP");
    		  } catch (e) {
    			window.alert("Votre navigateur ne prend pas en charge l'objet XMLHTTPRequest.");
    		  }
    		}
    	  }
    	}
     
     
    	if( (new RegExp("[?]", "gi")).test(file) ){
    		xhr.open("GET", file + '&rand=' + Math.random(), true);
    	} else {
    		xhr.open("GET", file + '?rand=' + Math.random(), true);
    	}
     
    	xhr.setRequestHeader("Content-type", "charset=ISO-8859-1");
    	xhr.send(null);
    	return xhr;//rajouté
    }
     
    var Requete_Ajax = Xhr_ResScreen('resscreen.php?width='+screen.width+'&height='+screen.height);
    et enfin resscreen.php :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $cookietime = 3600;
     
    // Récupération de la résolution de l'utilisateur
    $width = ( isset($_GET['width']) && is_numeric($_GET['width']) ) ? intval($_GET['width']) : '';
    $height = ( isset($_GET['height']) && is_numeric($_GET['height']) ) ? intval($_GET['height']) : '';
     
     
     
    if( !empty($width) && !empty($height) ){
    	$HTTP_COOKIE_VARS['res_width'] = $width;
    	$HTTP_COOKIE_VARS['res_height'] = $height;
    	setcookie("res_width", $HTTP_COOKIE_VARS['res_width'], time() + $cookietime, '/');
    	setcookie("res_height", $HTTP_COOKIE_VARS['res_height'], time() + $cookietime, '/');
    }
    En local, la page affiche ceci lors du premier chargement :

    La page affiche ceci :

    Notice: Undefined index: res_width in C:....index.php on line 11

    Notice: Undefined index: res_height in C....index.php on line 11

    Notice: Undefined index: res_width in C:....index.php on line 12

    Pourtant, la console (Firebug) affiche bien:
    GET http:...resscreen.php?width=1680&height=1050 rand=0.717867140902937[/url]
    GET http:...resscreen.php?width=1680&height=1050&rand=0.717867140902937[/url]

    200 OK 65ms

    et en entête:
    Set-Cookieres_width=1680; expires=Fri, 16-Jul-2010 07:00:30 GMT; path =/
    res_height=1050; expires=Fri, 16-Jul-2010 07:00:30 GMT; path =/

    D'où ma question: Pourquoi mon script ne fonctionne-t-il qu'une fois la page rafraîchie? (Et cela autant sous IE que sur Firefox)
    Y a-t-il un moyen de corriger cela? (sinon, je ne vois pas l'intérêt d'AJAX!)

    Merci d'avance!

  2. #2
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Points : 36 571
    Points
    36 571
    Par défaut
    Bonjour,
    ce messages sont visiblement des erreurs serveur dûes au PHP.
    Elles n'ont pas forcément de lien avec Ajax ...

    Visiblement il faut que tu vérifies l'existence de tes identifiants (res_width etc.)

    Par contre, ce n'est pas le bon forum pour débugger du PHP

    A+
    Pour tout savoir sur l'utilisation du forum

    En postant votre message, n'oubliez pas les Règles du Club.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Toujours pas de réponse???
    Mes identifiants semblent être clairement définis. D'autant que le cookie fonctionne après un rafraîchissement...
    Un petit 'up svp?
    Je tourne en rond depuis un moment pour trouver une réponse satisfaisante.

  4. #4
    Membre actif Avatar de polkduran
    Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2009
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2009
    Messages : 155
    Points : 275
    Points
    275
    Par défaut
    Citation Envoyé par Li wei Voir le message
    D'où ma question: Pourquoi mon script ne fonctionne-t-il qu'une fois la page rafraîchie? (Et cela autant sous IE que sur Firefox)
    Y a-t-il un moyen de corriger cela? (sinon, je ne vois pas l'intérêt d'AJAX!)
    !
    C'est parce-que la première fois que tu arrives à ta page le cookie n'est pas encore défini, ce que tu peux faire c'est de donner des valeurs par défaut si $_COOKIE['res_width'] n'existe pas (càd la première fois)

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Merci pour ta réponse. J'espérai que l'intérêt d'AJAX était justement de ne pas avoir à rafraîchir la page... Tant pis. Merci pour ta réponse.
    A plus!

  6. #6
    Membre actif Avatar de polkduran
    Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2009
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2009
    Messages : 155
    Points : 275
    Points
    275
    Par défaut
    Ce n'est pas un problème d'Ajax, mais de l'existence du cookie,
    lors de la première requête (Ajax ou pas) le cookie associé à l'utilisateur n'existe pas donc

    $_COOKIE['res_width'] donne
    Notice: Undefined index: res_width in C:....index.php on line 11

    comme je disais tu peux faire un test d'existence et donner une valeur par défaut aux valeurs que tu va stocker dans le cookie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $res_width = 'un valeur par default';
    if(isset($_COOKIE['res_width']))
        $res_width = $_COOKIE['res_width'];
    //.... pareil si tu as d'autres valeurs à récupérer de $_COOKIE
    et tu utilises $res_width au lieu de $_COOKIE['res_width'] dans ton code

    et ça doit marcher

  7. #7
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    Salut,

    À mon avis, il faudrait créer le cookie (avant la requête AJAX) avec Javascript dans resscreen.js s'il n'existe pas. (voir la FAQ : Comment gérer des cookies en JavaScript).

    Dans resscreen.php, pourquoi ne pas faire directemment ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    setcookie('res_width', $width, time() + $cookietime, '/');
    setcookie('res_height', $height, time() + $cookietime, '/');
    Sinon, une petite optimisation de code pour index.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
    $Chemin_css='...template_';
     
    $width=((isset($_COOKIE['res_width']))and(is_numeric($_COOKIE['res_width'])))?(int)$_COOKIE['res_width']:1024;
    if($width>1200)
    	$Chemin_css.='grand';
    else
    	$Chemin_css.='petit';
     
    if(@preg_match('/MSIE/',$_SERVER['HTTP_USER_AGENT']))$Chemin_css.='_IE';
     
    $Chemin_css.='.css';
    ?>
    <link rel="stylesheet" href="<?php echo $Chemin_css; ?>" type="text/css" />
    Note : 1024 est la valeur par défaut.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Merci pour votre aide!

    Effectivement, le texte php optimisé fonctionne correctement et est bien moins lourd que ce que j'avais écrit...

    J'ai, essayé de faire comme vous me l'avez conseillé, mais le résultat est identique. Peut-être que je ne m'y prend pas comme il faut pour créer et initialiser le cookie avant l'appel de la fonction "Xhr_ResScreen" dans resscreen.js
    Je remet ci-joint les fichiers concernés...
    Resscreeen.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // Durée de vie du cookie (secondes)
    $cookietime = 3600;
     
    // Récupération de la résolution de l'utilisateur
    $width = ( isset($_GET['width']) && is_numeric($_GET['width']) ) ? intval($_GET['width']) : '';
    $height = ( isset($_GET['height']) && is_numeric($_GET['height']) ) ? intval($_GET['height']) : '';
     
     
    $HTTP_COOKIE_VARS['res_width'] = $width;
    $HTTP_COOKIE_VARS['res_height'] = $height;
    setcookie('res_width', $width, time() + $cookietime, '/');
    setcookie('res_height', $height, time() + $cookietime, '/');
    Resscreen.js
    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
     
    function createCookie(name,value,days) {
    	if (days) {
    		var date = new Date();
    		date.setTime(date.getTime()+(days*24*60*60*1000));
    		var expires = "; expires="+date.toGMTString();
    	}
    	else var expires = "";
    	document.cookie = name+"="+value+expires+"; path=/";
    }
    function Xhr_ResScreen(file){
    	if( window.XMLHttpRequest ){
    	  xhr = new XMLHttpRequest();
    	  if ( xhr.overrideMimeType ) xhr.overrideMimeType('text/html; charset=ISO-8859-1');
    	} else {
    	   if ( window.ActiveXObject ){
    		try {
    		  xhr = new ActiveXObject("Msxml2.XMLHTTP");
    		} catch (e) {
    		  try {
    			xhr = new ActiveXObject("Microsoft.XMLHTTP");
    		  } catch (e) {
    			window.alert("Votre navigateur ne prend pas en charge l'objet XMLHTTPRequest.");
    		  }
    		}
    	  }
    	}
     
     
    	if( (new RegExp("[?]", "gi")).test(file) ){
    		xhr.open("GET", file + '&rand=' + Math.random(), true);
    	} else {
    		xhr.open("GET", file + '?rand=' + Math.random(), true);
    	}
     
    	xhr.setRequestHeader("Content-type", "charset=ISO-8859-1");
    	xhr.send(null);
    	return xhr;//rajouté
    }
     
    createCookie('res_height','1600');
    createCookie('res_width','800');
    var Requete_Ajax = Xhr_ResScreen('resscreen.php?width='+screen.width+'&height='+screen.height);
    index.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <script type="text/javascript" src="resscreen.js"></script>
    <?php
    $Chemin_css='/css/template_';
    $width=((isset($_COOKIE['res_width']))and(is_numeric($_COOKIE['res_width'])))?(int)$_COOKIE['res_width']:1024;
    if($width>1200)
    	$Chemin_css.='grand';
    else
    	$Chemin_css.='petit';
     
    if(@preg_match('/MSIE/',$_SERVER['HTTP_USER_AGENT']))$Chemin_css.='_IE';
    $Chemin_css.='.css';
    ?>
    Merci encore pour votre aide.

    J'espère réussir à résoudre ce petit problème...

  9. #9
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    Essaie comme ceci pour voir...
    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
    function createCookie(name,value,days) {
    	if (days) {
    		var date = new Date();
    		date.setTime(date.getTime()+(days*24*60*60*1000));
    		var expires = "; expires="+date.toGMTString();
    	}
    	else var expires = "";
    	document.cookie = name+"="+value+expires+"; path=/";
    }
     
    function readCookie(name) {
    	var nameEQ = name + "=";
    	var ca = document.cookie.split(';');
    	for(var i=0;i < ca.length;i++) {
    		var c = ca[i];
    		while (c.charAt(0)==' ') c = c.substring(1,c.length);
    		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    	}
    	return null;
    }
     
    function Xhr_ResScreen(file){
    	if( window.XMLHttpRequest ){
    	  xhr = new XMLHttpRequest();
    	  if ( xhr.overrideMimeType ) xhr.overrideMimeType('text/html; charset=ISO-8859-1');
    	} else {
    	   if ( window.ActiveXObject ){
    		try {
    		  xhr = new ActiveXObject("Msxml2.XMLHTTP");
    		} catch (e) {
    		  try {
    			xhr = new ActiveXObject("Microsoft.XMLHTTP");
    		  } catch (e) {
    			window.alert("Votre navigateur ne prend pas en charge l'objet XMLHTTPRequest.");
    		  }
    		}
    	  }
    	}
     
     
    	if( (new RegExp("[?]", "gi")).test(file) ){
    		xhr.open("GET", file + '&rand=' + Math.random(), true);
    	} else {
    		xhr.open("GET", file + '?rand=' + Math.random(), true);
    	}
     
    	xhr.setRequestHeader("Content-type", "charset=ISO-8859-1");
    	xhr.send(null);
    	return xhr;//rajouté
    }
     
    var res_width=readCookie('res_width');
    if(!res_width){
    	res_width=screen.width;
    	createCookie('res_width',res_width);
    }
    var res_height=readCookie('res_height');
    if (!res_height){
    	res_height=screen.height;
    	createCookie('res_height',res_height);
    }
    var Requete_Ajax = Xhr_ResScreen('resscreen.php?width='+res_width+'&height='+res_height);
    Je te conseil d'enlever ces lignes dans le fichier resscreen.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $HTTP_COOKIE_VARS['res_width'] = $width;
    $HTTP_COOKIE_VARS['res_height'] = $height;
    Elles sont inutiles.

  10. #10
    Membre actif Avatar de polkduran
    Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2009
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2009
    Messages : 155
    Points : 275
    Points
    275
    Par défaut
    le problème me semble plutôt de conception parce que dans ton Resscreen.js tu crées un cookie, ensuite tu envoies ta requête ajax avec des paramètres que normalement tu as déjà positionnés dans cookie fait en js, et ensuite dans Resscreen.php tu récupères tes paramètres et tu crée à nouveau ton cookie.

    en plus dans ton ajax une fois que tu as envoyé ta requête tu ne fais rien

    ce que tu peux faire c'est quelque chose du style

    - si je n'ai pas de cookie,
    -- je vérifie si j'ai reçu des params en GET
    --- si oui je les récupère et les mets dans des cookies
    --- si non, j'envoie un code js que me redirige ver index.php mais avec des params GET avec width et height


    si j'ai eu des params GET ou si j'ai le cookie je peux envoyer mon css

    index.php
    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
     
    <?php
    // si on n'a pas un cookie
    if(!isset($_COOKIE['res_width']) or !isset($_COOKIE['res_height'])){
    	//si on a les params GET
    	if(isset($_GET['width']) and isset($_GET['height'])){
    		$width = $_GET['width'];
    		$heigth = $_GET['height'];
    		//------------------------------
    		// tu mets les cookies ici
    		//------------------------------
    	}else{
    		//pas de cookie ni de params GET  
    ?>
    		<html><body>
    		<script type="text/javascript">
    		var width //on récupère ici le width
    		var height //on récupère ici le height
    		window.location = "index.php?width="+width+"&height"+height;
    		</script>    
    		</body></html>
    <?php //on finit le script php
    		exit; 
    	}
    }else{
    	//on a les cookies
    	$width = $_COOKIE['res_width'];
    	$height = $_COOKIE['res_height'];
    }
    //------------------------------
    //et ici tu peux envoyer ton css par rapport à $width et $height
    //------------------------------

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Un grand Merci!!!
    Merci, ça fonctionne!
    Je suis débutant et votre aide m'a vraiment été précieuse.

    A plus!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AJAX] Configuration nécessaire pour ajax?
    Par sgferre dans le forum AJAX
    Réponses: 5
    Dernier message: 13/02/2012, 13h46
  2. problème pour supprimer un cookie
    Par vbcasimir dans le forum Web
    Réponses: 4
    Dernier message: 29/11/2005, 12h01
  3. BULK INSERT : Droits nécessaires pour l'utilisation
    Par JYves dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 22/11/2005, 10h35
  4. Réponses: 10
    Dernier message: 15/03/2005, 10h31
  5. [CR] Version nécessaire pour créer des fichiers DSR ?
    Par aysse dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 17/11/2003, 09h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo