Formulaire de personnalisation de la page

Formulaire de personnalisation de la page - PHP - Programmation

Marsh Posté le 15-12-2006 à 16:27:40    

Bonjour;
Je suis débutant en programmation.
J'ai fait une tentative de petit système de personnalisation du design d'une page web.
J'ai des doutes au niveau de send_design.php (voir le code ci-joint) au niveau du cookie (je ne suis pas sûr qu'on puisse faire plusieurs posts au sein d'un même cookie) et j'ai des doutes an niveau du html (voir la fin: <p> et </p> sont-ils bien placés?).  
J'envoie le code et pour correction ou de l'amélioration si certains veulent bien. Merci.
 
La page design.php permet de tester la valeur du cookie afin d'utiliser le bon design, et s'il n'est pas présent, d'utiliser le design par défaut.  
 
On aura alors le code suivant (pour la page design.php):  
<?php  
// on teste si le cookie est declare (si il n'est pas déclaré, on applique la couleur verte ; image1.jpg et titre1 par défaut)  
if (!isset($_COOKIE['DESIGN']))  
{  
$background = "#badbb7";  
$image = "image1.jpg";  
$titre = ""titre1"";  
}  
else  
    {  
 
// cas où le site sera bleu avec image 1 et titre 1  
if ($_COOKIE['DESIGN'] == "bleu" && $_COOKIE['DESIGN'] == "image1" && $_COOKIE['DESIGN'] == "titre1" )  
{  
$background = "#aac5f4";  
$image = "image1.jpg" ;  
$titre = ""titre1"";  
}  
 
// cas où le site sera bleu avec image 2 et titre 1  
elseif ($_COOKIE['DESIGN'] == "bleu" && $_COOKIE['DESIGN'] == "image2" && $_COOKIE['DESIGN'] == "titre1" )  
{  
$background = "#aac5f4";  
$image = "image2.jpg" ;  
$titre = ""titre1"";  
}  
 
// cas où le site sera bleu avec image 3 et titre 1  
elseif ($_COOKIE['DESIGN'] == "bleu" && $_COOKIE['DESIGN'] == "image3" && $_COOKIE['DESIGN'] == "titre1" )  
{  
$background = "#aac5f4";  
$image = "image3.jpg" ;  
$titre = ""titre1"";  
}  
 
// cas où le site sera bleu avec image 1 et titre 2  
elseif ($_COOKIE['DESIGN'] == "bleu" && $_COOKIE['DESIGN'] == "image1" && $_COOKIE['DESIGN'] == "titre2" )  
{  
$background = "#aac5f4";  
$image = "image1.jpg" ;  
$titre = ""titre2"";  
}  
 
// cas où le site sera bleu avec image 1 et titre 3  
elseif ($_COOKIE['DESIGN'] == "bleu" && $_COOKIE['DESIGN'] == "image1" && $_COOKIE['DESIGN'] == "titre3" )  
{  
$background = "#aac5f4";  
$image = "image1.jpg" ;  
$titre = ""titre3"";  
}  
 
// cas où le site sera bleu avec image 2 et titre 2  
elseif ($_COOKIE['DESIGN'] == "bleu" && $_COOKIE['DESIGN'] == "image2" && $_COOKIE['DESIGN'] == "titre2" )  
{  
$background = "#aac5f4";  
$image = "image2.jpg" ;  
$titre = ""titre2"";  
}  
 
// cas où le site sera bleu avec image 2 et titre 3  
elseif ($_COOKIE['DESIGN'] == "bleu" && $_COOKIE['DESIGN'] == "image2" && $_COOKIE['DESIGN'] == "titre3" )  
{  
$background = "#aac5f4";  
$image = "image2.jpg" ;  
$titre = ""titre3"";  
}  
 
// cas où le site sera bleu avec image 3 et titre 2  
elseif ($_COOKIE['DESIGN'] == "bleu" && $_COOKIE['DESIGN'] == "image3" && $_COOKIE['DESIGN'] == "titre2" )  
{  
$background = "#aac5f4";  
$image = "image3.jpg" ;  
$titre = ""titre2"";  
}  
 
// cas où le site sera bleu avec image 3 et titre 3  
elseif ($_COOKIE['DESIGN'] == "bleu" && $_COOKIE['DESIGN'] == "image3" && $_COOKIE['DESIGN'] == "titre3" )  
{  
$background = "#aac5f4";  
$image = "image3.jpg" ;  
$titre = ""titre3"";  
}  
 
// cas où le site sera rouge avec image 1 et titre 1  
elseif ($_COOKIE['DESIGN'] == "rouge" && $_COOKIE['DESIGN'] == "image1" && $_COOKIE['DESIGN'] == "titre1" )  
{  
$background = "#fbbda8";  
$image = "image1.jpg" ;  
$titre = ""titre1"";  
}  
 
// cas où le site sera rouge avec image 2 et titre 1  
elseif ($_COOKIE['DESIGN'] == "rouge" && $_COOKIE['DESIGN'] == "image2" && $_COOKIE['DESIGN'] == "titre1" )  
{  
$background = "#fbbda8";  
$image = "image2.jpg" ;  
$titre = ""titre1"";  
}  
 
// cas où le site sera rouge avec image 3 et titre 1  
elseif ($_COOKIE['DESIGN'] == "rouge" && $_COOKIE['DESIGN'] == "image3" && $_COOKIE['DESIGN'] == "titre1" )  
{  
$background = "#fbbda8";  
$image = "image3.jpg" ;  
$titre = ""titre1"";  
}  
 
// cas où le site sera rouge avec image 1 et titre 2  
elseif ($_COOKIE['DESIGN'] == "rouge" && $_COOKIE['DESIGN'] == "image1" && $_COOKIE['DESIGN'] == "titre2" )  
{  
$background = "#fbbda8";  
$image = "image1.jpg" ;  
$titre = ""titre2"";  
}  
 
// cas où le site sera rouge avec image 1 et titre 3  
elseif ($_COOKIE['DESIGN'] == "rouge" && $_COOKIE['DESIGN'] == "image1" && $_COOKIE['DESIGN'] == "titre3" )  
{  
$background = "#fbbda8";  
$image = "image1.jpg" ;  
$titre = ""titre3"";  
}  
 
// cas où le site sera rouge avec image 2 et titre 2  
elseif ($_COOKIE['DESIGN'] == "rouge" && $_COOKIE['DESIGN'] == "image2" && $_COOKIE['DESIGN'] == "titre2" )  
{  
$background = "#fbbda8";  
$image = "image2.jpg" ;  
$titre = ""titre2"";  
}  
 
// cas où le site sera rouge avec image 2 et titre 3  
elseif ($_COOKIE['DESIGN'] == "rouge" && $_COOKIE['DESIGN'] == "image2" && $_COOKIE['DESIGN'] == "titre3" )  
{  
$background = "#fbbda8";  
$image = "image2.jpg" ;  
$titre = ""titre3"";  
}  
 
// cas où le site sera rouge avec image 3 et titre 2  
elseif ($_COOKIE['DESIGN'] == "rouge" && $_COOKIE['DESIGN'] == "image3" && $_COOKIE['DESIGN'] == "titre2" )  
{  
$background = "#fbbda8";  
$image = "image3.jpg" ;  
$titre = ""titre2"";  
}  
 
// cas où le site sera rouge avec image 3 et titre 3  
elseif ($_COOKIE['DESIGN'] == "rouge" && $_COOKIE['DESIGN'] == "image3" && $_COOKIE['DESIGN'] == "titre3" )  
{  
$background = "#fbbda8";  
$image = "image3.jpg" ;  
$titre = ""titre3"";  
}  
 
 
// cas où le site sera vert avec image 1 et titre 1  
elseif ($_COOKIE['DESIGN'] == "vert" && $_COOKIE['DESIGN'] == "image1" && $_COOKIE['DESIGN'] == "titre1" )  
{  
$background = "#badbb7";  
$image = "image1.jpg" ;  
$titre = ""titre1"";  
}  
 
// cas où le site sera vert avec image 2 et titre 1  
elseif ($_COOKIE['DESIGN'] == "vert" && $_COOKIE['DESIGN'] == "image2" && $_COOKIE['DESIGN'] == "titre1" )  
{  
$background = "#badbb7";  
$image = "image2.jpg" ;  
$titre = ""titre1"";  
}  
 
// cas où le site sera vert avec image 3 et titre 1  
elseif ($_COOKIE['DESIGN'] == "vert" && $_COOKIE['DESIGN'] == "image3" && $_COOKIE['DESIGN'] == "titre1" )  
{  
$background = "#badbb7";  
$image = "image3.jpg" ;  
$titre = ""titre1"";  
}  
 
// cas où le site sera vert avec image 1 et titre 2  
elseif ($_COOKIE['DESIGN'] == "vert" && $_COOKIE['DESIGN'] == "image1" && $_COOKIE['DESIGN'] == "titre2" )  
{  
$background = "#badbb7";  
$image = "image1.jpg" ;  
$titre = ""titre3"";  
}  
 
// cas où le site sera vert avec image 1 et titre 3  
elseif ($_COOKIE['DESIGN'] == "vert" && $_COOKIE['DESIGN'] == "image1" && $_COOKIE['DESIGN'] == "titre3" )  
{  
$background = "#badbb7";  
$image = "image1.jpg" ;  
$titre = ""titre3"";  
}  
 
// cas où le site sera vert avec image 2 et titre 2  
elseif ($_COOKIE['DESIGN'] == "vert" && $_COOKIE['DESIGN'] == "image2" && $_COOKIE['DESIGN'] == "titre2" )  
{  
$background = "#badbb7";  
$image = "image2.jpg" ;  
$titre = ""titre2"";  
}  
 
// cas où le site sera vert avec image 2 et titre 3  
elseif ($_COOKIE['DESIGN'] == "vert" && $_COOKIE['DESIGN'] == "image2" && $_COOKIE['DESIGN'] == "titre3" )  
{  
$background = "#badbb7";  
$image = "image2.jpg" ;  
$titre = ""titre3"";  
}  
 
// cas où le site sera vert avec image 3 et titre 2  
elseif ($_COOKIE['DESIGN'] == "vert" && $_COOKIE['DESIGN'] == "image3" && $_COOKIE['DESIGN'] == "titre2" )  
{  
$background = "#badbb7";  
$image = "image3.jpg" ;  
$titre = ""titre2"";  
}  
 
// cas où le site sera vert avec image 3 et titre 3  
elseif ($_COOKIE['DESIGN'] == "vert" && $_COOKIE['DESIGN'] == "image3" && $_COOKIE['DESIGN'] == "titre3" )  
{  
$background = "#badbb7";  
$image = "image3.jpg" ;  
$titre = ""titre3"";  
}  
 
// cas où le visite n'a pas choisi de couleur/image/titre (on affiche alors une par    défaut : le vert ; image1.jpg ; titre 1)  
else  
{  
$background = "#badbb7";  
$image = "image1.jpg";  
$titre = ""titre1"";  
}  
    }  
?>  
 
 
 
Un petit formulaire permettant de personnaliser le design du site, nous le ferons dans la page index.php  
 
Voici alors le code de la page index.php contenant ce formulaire:  
<?php  
// on inclut notre fichier de design  
include ('design.php');  
?>  
<html>  
<head>  
<title>Index du site</title>  
</head>  
 
<?php  
// on utilise les variables du fichier design.php pour pouvoir afficher le bon design suivant le cookie  
echo '<body bgcolor = "',$background,'">';  
echo '<img src = "',$image,'">';  
echo '$titre';  
 
?>  
<br /><br />  
Voici un formulaire permettant de personnaliser le design du site :<br />  
<!-- on affiche notre formulaire permettant de choisir le design du site -->  
<form action = "send_design.php" method = "post">  
<p><select name = "couleur">  
<option>bleu</option>  
<option>rouge</option>  
<option>vert</option></p>  
</select>  
<input type = "submit" value = "Modifier">  
<p><select name = "image">  
<option>image1</option>  
<option>image2</option>  
<option>image3</option></p>  
</select>  
<input type = "submit" value = "Modifier">  
<p><select name = "titre">  
<option>titre1</option>  
<option>titre2</option>  
<option>titre3</option></p>  
</select>  
<input type = "submit" value = "Modifier">  
</form>  
 
</body>  
</html>  
 
 
 
send_design.php enverra le cookie chez le client :  
<?php  
// on inclut toujours notre fichier de design  
include ('design.php');  
 
$expire=365*24*3600;  
// on envoie notre cookie de nom DESGIN (donc il sera utilisable via la variable $DESIGN) contenant la couleur, image et titres et  choisis (c'est-à-dire le contenu de la variable $couleur)  
setcookie ("DESIGN", $_POST['couleur'], $_POST['image'], $_POST['titre'] time() + $expire);  
?>  
<html>  
<head>  
<title>Changement de design</title>  
</head>  
 
<?  
// on utilise les variables du fichier design.php pour pouvoir afficher les bonnes couleurs suivant la couleur du cookie (ou bien la couleur par défaut si le cookie n'existe pas)  
echo '<body bgcolor = "',$background,'">';  
echo '<img src = "',$image,'">';  
echo '$titre';  
?>  
<br /><br />  
Vous avez choisi un site de couleur, image et titre :  
<?  
echo $_POST['couleur'];  
echo $_POST['image'];  
echo $_POST['titre'];  
?>  
<br /><br />  
<!-- on affiche notre formulaire permettant de revenir à l'accueil du site -->  
<form action = "index.php" method = "post">  
<input type = "submit" value = "Retour accueil">  
</form>  
 
</body>  
</html>


Message édité par teycir le 15-12-2006 à 16:45:07
Reply

Marsh Posté le 15-12-2006 à 16:27:40   

Reply

Marsh Posté le 15-12-2006 à 16:28:38    

ouch.[:pingouino]
je refuse de lire ça.[:roane]


Message édité par skeye le 15-12-2006 à 16:28:45

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 15-12-2006 à 16:46:55    

Donc là je corrige comme cela?
Est-ce qu'on peut faire plusieurs posts au sein d'un cookie?
 
<?php  
// on inclut toujours notre fichier de design  
include ('design.php');  
$expire=365*24*3600;  
// on envoie notre cookie de nom DESGIN (donc il sera utilisable via la variable $DESIGN) contenant la couleur, image et titres et  choisis (c'est-à-dire le contenu de la variable $couleur)  
setcookie ("DESIGN1", $_POST['couleur'], time() + $expire);  
setcookie ("DESIGN2", $_POST['image'], time() + $expire);  
setcookie ("DESIGN3", $_POST['titre'], time() + $expire);  
?>


Message édité par teycir le 15-12-2006 à 17:05:27
Reply

Marsh Posté le 15-12-2006 à 16:47:55    

http://fr3.php.net/manual/fr/function.setcookie.php


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 15-12-2006 à 16:52:57    

(non parce-que c'est absolument n'importe-quoi, ce que tu fais là, hein...[:pingouino])


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 15-12-2006 à 17:00:50    

skeye a écrit :

(non parce-que c'est absolument n'importe-quoi, ce que tu fais là, hein...[:pingouino])


 
Comment faire donc pour transporter plusieurs posts au sein d'un cookie?
Faut-t-il faire un cookie par post (je veux obtenir couleur titre et image)?


Message édité par teycir le 15-12-2006 à 17:02:39
Reply

Marsh Posté le 15-12-2006 à 17:02:32    

Plusieurs setcookie.
Et tu ne "transportes pas plusieurs posts", tu stockes des valeurs dans un cookie.


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 15-12-2006 à 17:05:50    

skeye a écrit :

Plusieurs setcookie.
Et tu ne "transportes pas plusieurs posts", tu stockes des valeurs dans un cookie.


 
Donc là je corrige comme cela?  
 
 
<?php    
// on inclut toujours notre fichier de design    
include ('design.php');    
$expire=365*24*3600;    
// on envoie notre cookie de nom DESGIN (donc il sera utilisable via la variable $DESIGN) contenant la couleur, image et titres et  choisis (c'est-à-dire le contenu de la variable $couleur)    
setcookie ("DESIGN1", $_POST['couleur'], time() + $expire);    
setcookie ("DESIGN2", $_POST['image'], time() + $expire);  
setcookie ("DESIGN3", $_POST['titre'], time() + $expire);  
?>


Message édité par teycir le 15-12-2006 à 17:06:01
Reply

Marsh Posté le 15-12-2006 à 17:10:11    

...et pourquoi pas  

Code :
  1. setcookie ("couleur", $_POST['couleur'], time() + $expire);    
  2. setcookie ("image", $_POST['image'], time() + $expire);  
  3. setcookie ("titre", $_POST['titre'], time() + $expire);


 
tant qu'à faire? au moins ce serait un poil plus compréhensible...:o


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 15-12-2006 à 17:10:53    

pourquoi ne pas serialiser ?
 

Code :
  1. $expire = 365 * 86400;
  2. $titre = isset($_POST['titre']) ? $_POST['titre'] : '';
  3. $couleur = isset($_POST['couleur']) ? $_POST['couleur'] : '';
  4. $image = isset($_POST['image']) ? $_POST['image'] : '';
  5. $designs = serialize(array('couleur' => $couleur, 'image' =>$image, 'titre' => $titre));
  6. setcookie('designs',$designs,time() + $expire);


 
Et pour récupérer le contenu du cookie :

Code :
  1. $designs = isset($_COOKIE['designs']) ? unserialize($_COOKIE['designs']) : array();
  2. // Affichage du titre par exemple
  3. echo $designs['titre'];


Message édité par vanadium le 15-12-2006 à 17:12:27
Reply

Marsh Posté le 15-12-2006 à 17:10:53   

Reply

Marsh Posté le 15-12-2006 à 17:13:46    

Pourquoi pas...mais il a pas intérêt à vouloir rajouter un truc dans son $designs un jour, sinon les gens qui ont un cookie valide vont avoir des surprises...[:dawa]
Je vois pas vraiment l'intérêt de sérialiser, là, autant faire un cookie pour chaque, mais si c'est plus verbeux...


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 15-12-2006 à 17:26:12    

skeye a écrit :

Pourquoi pas...mais il a pas intérêt à vouloir rajouter un truc dans son $designs un jour, sinon les gens qui ont un cookie valide vont avoir des surprises...[:dawa]
Je vois pas vraiment l'intérêt de sérialiser, là, autant faire un cookie pour chaque, mais si c'est plus verbeux...


 
Donc si fais 3 setcookie, la partie du code suivante n'est plus valable :
// cas où le site sera vert avec image 2 et titre 1  
elseif ($_COOKIE['DESIGN'] == "vert" && $_COOKIE['DESIGN'] == "image2" && $_COOKIE['DESIGN'] == "titre1" )    
{  
$background = "#badbb7";  
$image = "image2.jpg" ;  
$titre = ""titre1"";  
}  
 
Et il faudra la remplacer par? :
elseif ($_COOKIE['COULEUR'] == "vert" && $_COOKIE['IMAGE'] == "image2" && $_COOKIE['TITRE'] == "titre1" )
{  
$background = "#badbb7";  
$image = "image2.jpg" ;  
$titre = ""titre1"";  
}  
Je ne sais pas si la logique et la syntaxe est bonne?

Reply

Marsh Posté le 15-12-2006 à 17:27:17    

L'interêt de serialiser est que si jamais tu as envie de rajouter des choses dans le cookie et que tu ne serialises pas, tu vas devoir rajouter un nouveau setcookie.
 
Alors que si tu serialises, meme si ton array que tu serialises n'est pas forcément initialisé ici, il te suffit de rajouter clef => valeur dans l'array pour que la valeur soit automatiquement placée dans le cookie puisque l'array est serialisé.
 

Reply

Marsh Posté le 15-12-2006 à 17:31:16    

Le reste de ton code est très laid...:(
Vraiment.[:pingouino]
 
On ne fera JAMAIS une suite de if/else de ce genre. Je ne comprends pas pourquoi tu ne mets pas directement tes valeurs dans tes cookies pour les relire ensuite...bref, tu aurais manifestement besoin pour commencer d'apprendre un peu à programmer...[:pingouino]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 15-12-2006 à 17:32:55    

vanadium a écrit :

L'interêt de serialiser est que si jamais tu as envie de rajouter des choses dans le cookie et que tu ne serialises pas, tu vas devoir rajouter un nouveau setcookie.
 
Alors que si tu serialises, meme si ton array que tu serialises n'est pas forcément initialisé ici, il te suffit de rajouter clef => valeur dans l'array pour que la valeur soit automatiquement placée dans le cookie puisque l'array est serialisé.


 
oui, mais à la désérialisation il se passe quoi si dans le cookie sérialisé auparavant il te manque une valeur?[:pingouino]
Tu vas vouloir utiliser un indice de tableau qui n'existe pas, derrière...il faut rajouter des contrôles un peu partout, dans ce cas, c'est le bordel...:o


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 15-12-2006 à 17:36:52    

Je te retourne la question :  
il se passe quoi si le cookie que tu es censé avoir mis n'existe pas ?
 
Il se passe exactement la meme chose que si ton cookie specifique à la valeur n'a pas été crée sur le cookie sur la machine du visiteur. Ta remarque n'est donc pas pertinente puisque le probleme se retrouve aussi bien dans ton modele que dans le mien.

Reply

Marsh Posté le 15-12-2006 à 17:37:55    

vanadium a écrit :

Je te retourne la question :  
il se passe quoi si le cookie que tu es censé avoir mis n'existe pas ?
 
Il se passe exactement la meme chose que si ton cookie specifique à la valeur n'a pas été crée sur le cookie sur la machine du visiteur. Ta remarque n'est donc pas pertinente puisque le probleme se retrouve aussi bien dans ton modele que dans le mien.


non.
Quand tu lis un cookie tu testes forcément son existance. Dans ton cas le cookie existe, c'est son contenu qui est mauvais.


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 15-12-2006 à 17:45:52    

vanadium a écrit :

Je te retourne la question :  
il se passe quoi si le cookie que tu es censé avoir mis n'existe pas ?
 
Il se passe exactement la meme chose que si ton cookie specifique à la valeur n'a pas été crée sur le cookie sur la machine du visiteur. Ta remarque n'est donc pas pertinente puisque le probleme se retrouve aussi bien dans ton modele que dans le mien.


 

skeye a écrit :

non.
Quand tu lis un cookie tu testes forcément son existance. Dans ton cas le cookie existe, c'est son contenu qui est mauvais.


 
 
Si tu n'ecris pas le test explicitement comme ceci, php ne le fera pas pour toi : :sarcastic:

Code :
  1. $couleur = isset($_COOKIE['couleur']) ? $_COOKIE['couleur'] : 'bleu';


 
De plus, dans mon cas le cookie n'existera pas puisque php va lever un notic "Undefined index" et retourner null. il est bien évident que dans ton cas comme dans le mien, il sera plus prudent de tester l'existence de l'index ( que ce soit de mon tableau déserialisé ou du tableau $_COOKIE).
 
Autre chose, il s'agissait d'une question ouverte qui demandait autre chose comme réponse que "non".


Message édité par vanadium le 15-12-2006 à 17:46:41
Reply

Marsh Posté le 15-12-2006 à 18:59:40    

non, tu ne vois pas ce que je veux dire.
Effectivement dans mon cas il faudra une ligne comme celle que tu donnes.
Dans ton cas c'est plus vicieux : mettons qu'il y ait un cookie 'design' dans lequel sont sérialisés la couleur et le titre.
Au bout de quelques semaines d'utilisation, tu veux ajouter l'image.
 
Problème :
 
Si tu le fais 'simplement', à la lecture ton $_COOKIE['design'] va exister, mais à la désérialisation il va manquer $design['image'].
Résultat, à l'utilisation il truc va te péter à la gueule à l'endroit où tu vas vouloir utiliser ton $design['image']. Et il n'y a pas vraiment de moyen simple de contourner ça.
 
Tandis qu'avec plusieurs cookies il te suffit de relire ton cookie comme tu le fais avec les autres (tu peux même t'amuser à stocker les valeurs attendues dans un tableau et à faire une boucle si tu tiens tant que ça à gagner quelques lignes de code).
 
Bref, comme je l'ai déjà dit ailleurs à un autre, l'idée est bonne, mais dans la pratique n'est pas souhaitable à mon avis.:o


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 15-12-2006 à 19:38:43    

skeye a écrit :

non, tu ne vois pas ce que je veux dire.
Effectivement dans mon cas il faudra une ligne comme celle que tu donnes.
Dans ton cas c'est plus vicieux : mettons qu'il y ait un cookie 'design' dans lequel sont sérialisés la couleur et le titre.
Au bout de quelques semaines d'utilisation, tu veux ajouter l'image.
 
Problème :
 
Si tu le fais 'simplement', à la lecture ton $_COOKIE['design'] va exister, mais à la désérialisation il va manquer $design['image'].
Résultat, à l'utilisation il truc va te péter à la gueule à l'endroit où tu vas vouloir utiliser ton $design['image']. Et il n'y a pas vraiment de moyen simple de contourner ça.
 
Tandis qu'avec plusieurs cookies il te suffit de relire ton cookie comme tu le fais avec les autres (tu peux même t'amuser à stocker les valeurs attendues dans un tableau et à faire une boucle si tu tiens tant que ça à gagner quelques lignes de code).
 
Bref, comme je l'ai déjà dit ailleurs à un autre, l'idée est bonne, mais dans la pratique n'est pas souhaitable à mon avis.:o


 
D'une part, si ton cookie a une validité de plusieurs semaines juste pour des informations sur le design du site, alors c'est incorrect puisqu'il n'y a aucun interet à conserver ces informations autant de temps.
Ensuite, que ce soit $_COOKIE['image'] ou $design['image'] qui ne soit pas initialisé, l'erreur levée par PHP est exactement la même. Je tinvite à tester le code ci-dessous pour t'en convaincre :
 

Code :
  1. <?php
  2. $design = array('fleur' => 'lilas');
  3. echo $_COOKIE['image'];
  4. echo $design['image'];
  5. ?>


 
Et il n'y a pas de "tu le fais simplement" qui tienne. En effet, $_COOKIE a beau être une variable superglobale (réfère toi au manuel php pour de plus ample informations sur la définition de ce terme), $_COOKIE n'en demeure pas moins un tableau (array()) comme un autre.
Voici ce qui apparait à l'écran si tu executes le code ci-dessus :
 

Citation :


Notice: Undefined index: design in ... on line 4
 
Notice: Undefined index: image in ... on line 5


 
Cela confirme donc bien que ce que tu dis est faux : $_COOKIE['tonindex'] n'existe pas s'il n'est pas initialisé. Et le code ci-dessus te le démontre très clairement. :D
Maintenant que je t'ais démontré que tu avais tort, laisse moi préciser que pour toute variable récupérée de $_COOKIE, $_GET, $_POST, $_SESSION il est indispensable de faire ceci :
 

Code :
  1. // Un exemple
  2. $couleur = isset($_COOKIE['couleur']) ? $_COOKIE['couleur'] : 'bleu';


 
De manière générale, si l'on n'est pas sur de la valeur d'une variable récupérée ou que celle-ci provient d'un index d'une variable superglobale, il vaut mieux toujours se prémunir en prévoyant une assignation par défaut.
 
EDIT : j'oubliais le principal. Si tu as modifié ton programme comme tu le dis, que tu as conscience que des utilisateurs vont avoir des problèmes avec leur cookie mal initialisé et que tu n'as rien fait pour prévenir ce problème alors permet moi de te féliciter. :D

Message cité 1 fois
Message édité par vanadium le 15-12-2006 à 19:46:46
Reply

Marsh Posté le 15-12-2006 à 19:59:04    

Tu n'as rien démontré du tout à part ton incapacité à comprendre ce que j'essaie de te faire rentrer dans le crane.[:pingouino]
Et arrête d'essayer de me donner des cours sur un langage que je pratique pour le boulot depuis plusieurs années, c'est agaçant.[:marc]

 

1) Ses cookies sont valides un an, si je lis bien son code. Ca se défend.
2) Oui, comme je l'ai déjà confirmé, il faut tester le contenu de $_COOKIE avant de s'en servir, et mettre une valeur par défaut si l'indice n'est pas là.
3) Ta solution risque d'engendrer des choses comme celle-ci, si c'est plus clair:

 

A un instant t, l'utilisateur change ses préférences, on enregistre :

Code :
  1. setcookie('design', serialize(array('couleur'=>'bleu', 'titre'=>'truc')));
 

à t+1, l'auteur du site veut ajouter l'image dans le design.

 

à t+2 l'utilisateur revient, on veut récupérer le contenu du cookie :

 
Code :
  1. $design = isset($_COOKIE['design']) ? unserialize($_COOKIE['design']) : array('bleu', 'truc', 'monimage');
  2.  
  3. $montemplate->assign('image', $design['image']); //PLOUF, undefined index.
 

Avec une solution à plusieurs cookies, pas de soucis.
Avec cette solution, il faut tester l'existence de chaque indice de $design, même si $_COOKIE a bien un indice 'design'.

 

Tu comprends où je veux en venir maintenant ou bien t'es juste con pour le plaisir?[:opus dei]

Message cité 1 fois
Message édité par skeye le 15-12-2006 à 20:01:47

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 15-12-2006 à 20:22:47    

skeye a écrit :

Tu n'as rien démontré du tout à part ton incapacité à comprendre ce que j'essaie de te faire rentrer dans le crane.
 

Code :
  1. $design = isset($_COOKIE['design']) ? unserialize($_COOKIE['design']) : array('bleu', 'truc', 'monimage');
  2.  
  3. $montemplate->assign('image', $design['image']); //PLOUF, undefined index.


 
Tu comprends où je veux en venir maintenant ou bien t'es juste con pour le plaisir?[:opus dei]


 
[mode skeye ON]non.[/mode skeye OFF]  :whistle: (en référence à ta réponse à ma question précédente)
 
Dans ton code il parait effectivement evident que tu as du mal à pondre du code php propre:
$design = array('bleu','truc','monimage') aura pour effet dans le cas par defaut d'initialiser $design[0] à 'bleu', $design[1] à 'truc' et je te laisse deviner la fin. :D
 
Je complète et corrige donc ton code :

Code :
  1. $designs = isset($_COOKIE['design']) ? unserialize($_COOKIE['design']) : array('couleur' => 'bleu', 'truc' => 'truc', 'image' => 'monimage');
  2.  
  3. // on a juste besoin d'un seul index, mieux vaut simplifier
  4. $image = isset($designs['image']) ? $designs['image'] : 'bleu';
  5.  
  6. // Cette mesure est par mesure de sécurité si l'on vient modifier le code plus tard
  7. // et que l'on ait pas fait attention à l'initialisation de $image
  8. if(!empty($image))
  9. {
  10.      $montemplate->assign('image', $image); // pas "PLOUF" !
  11. }
  12. else
  13. {
  14.   trigger_error('Error : assigning empty image');
  15. }


 
Par ailleurs, je te demanderais d'éviter de m'insulter. :jap:


Message édité par vanadium le 15-12-2006 à 20:24:54
Reply

Marsh Posté le 16-12-2006 à 10:57:55    

C'est du code pondu en 30 secondes pour l'exemple...[:moule_bite]
Et ta 'correction' met en évidence ce que je voulais te faire dire depuis le début : tu as besoin de vérifier chaque champs ajouté à $design pour éviter les soucis, au final t'as des vérifications pas homogènes sur tous les champs...bref, c'est beaucoup d'emmerdes pour rien.:o


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 18-12-2006 à 15:28:35    

vanadium a écrit :

.. si ton cookie a une validité de plusieurs semaines juste pour des informations sur le design du site, alors c'est incorrect puisqu'il n'y a aucun interet à conserver ces informations autant de temps.
..


En même temps le seul cas dans lequel j'utiliserais un cookie avec une validité aussi longue serais pour une question de design...

Reply

Marsh Posté le 18-12-2006 à 15:33:06    

chani_t a écrit :

En même temps le seul cas dans lequel j'utiliserais un cookie avec une validité aussi longue serais pour une question de design...


T'as pas beaucoup d'imagination.[:petrus75]
Regarde ce forum : ton login et le md5 de ton mot de passe sont dans un cookie, pour t'éviter de te ré identifier à chaque visite, par exemple.[:dawa]

Message cité 1 fois
Message édité par skeye le 18-12-2006 à 15:33:16

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 18-12-2006 à 15:46:02    

skeye a écrit :

T'as pas beaucoup d'imagination.[:petrus75]
Regarde ce forum : ton login et le md5 de ton mot de passe sont dans un cookie, pour t'éviter de te ré identifier à chaque visite, par exemple.[:dawa]


 
vi ils sont dans un cookie, mais il expire pas dans un an :D ;)...

Reply

Marsh Posté le 18-12-2006 à 15:56:37    

chani_t a écrit :

vi ils sont dans un cookie, mais il expire pas dans un an :D ;)...


Il expirait pas tout court, il y a de ça quelque temps...[:joce]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 18-12-2006 à 16:12:11    

skeye a écrit :

Il expirait pas tout court, il y a de ça quelque temps...[:joce]


A ben ok... ba j'aurais tendance à ne pas claquer un cookies de login avec un temps trés long... chais pas ... ça ne me parait pas super.

Reply

Marsh Posté le 18-12-2006 à 16:14:41    

chani_t a écrit :

A ben ok... ba j'aurais tendance à ne pas claquer un cookies de login avec un temps trés long... chais pas ... ça ne me parait pas super.


C'est une façon de faire les choses...décider que l'utilisateur doit faire l'action de se déconnecter lui-même.[:spamafote]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 20-12-2006 à 13:40:53    

Beh, moi, je vois la chose autrement
Pour les cookies, on stock un nom ; ex: 'design 1'
Et puis, on a a coté quelque part la représentation de design 1 (un fichier ini par exemple)
On a une fonction PHP du style  
getDesign($nom) qui mets des valeurs dans un tableau (il lit le ini)
Apres, on peut faire :
template->assign("DESIGN", getDesign("design 1" ));
 
Et dans son template par exemple
<body bgcolor="{$DESIGN.bodyBgcolor}">
 
etc..

Reply

Marsh Posté le 20-12-2006 à 13:43:38    

sauf que t'as pas forcément envie de prédéfinir un nombre fixe de designs.:o
Si tu veux laisser une vraie possibilité de personnaliser à l'utilisateur ta solution ne tient pas debout...:o


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 20-12-2006 à 13:45:41    

Et en quoi on peut pas définir plusieurs design dans ma solution ?
Ma solution repose sur un identifiant, pas sur des valeurs enregistrés dans un cookie, je trouve au contraire que ma méthode repose sur un infinité de design

Reply

Marsh Posté le 20-12-2006 à 13:47:11    

Non.
Ta solution oblige le développeur à prévoir un nombre fini de designs à l'avance.:o
Si tu veux permettre à ton utilisateur de mettre n'importe quelle valeur RGB comme couleur de fond, il se passe quoi? [:dawao]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 20-12-2006 à 13:52:30    

skeye a écrit :

Non.
Ta solution oblige le développeur à prévoir un nombre fini de designs à l'avance.:o
Si tu veux permettre à ton utilisateur de mettre n'importe quelle valeur RGB comme couleur de fond, il se passe quoi? [:dawao]


 
beh, il se passe qu'il aurait la couleur de fond voulu  :pt1cable:  

Reply

Marsh Posté le 20-12-2006 à 13:53:57    

nORKy a écrit :

beh, il se passe qu'il aurait la couleur de fond voulu  :pt1cable:


euh, non.
Tu irais remplir autant de fichiers ini qu'il y a de combinaisons RGB possibles?[:rofl]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 20-12-2006 à 13:56:13    

skeye a écrit :

euh, non.
Tu irais remplir autant de fichiers ini qu'il y a de combinaisons RGB possibles?[:rofl]


 
Quelle idée de vouloir designer son site !! [:rofl]

Reply

Marsh Posté le 20-12-2006 à 13:58:34    

nORKy a écrit :

Quelle idée de vouloir designer son site !! [:rofl]


Va falloir arrêter de boire entre midi et deux, hein...[:moule_bite]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 20-12-2006 à 14:04:07    

nORKy a écrit :

Beh, moi, je vois la chose autrement
Pour les cookies, on stock un nom ; ex: 'design 1'
Et puis, on a a coté quelque part la représentation de design 1 (un fichier ini par exemple)
On a une fonction PHP du style  
getDesign($nom) qui mets des valeurs dans un tableau (il lit le ini)
Apres, on peut faire :
template->assign("DESIGN", getDesign("design 1" ));
 
Et dans son template par exemple
<body bgcolor="{$DESIGN.bodyBgcolor}">
 
etc..


Marrant, le fichier ini ressemble à un fichier CSS. Pourquoi vouloi utiliser genre un bgcolor qui date de la préhistoire ? [:johneh]  [:johneh]  Autant faire directement un CSS côté serveur correspondant à ce que veut le gars. Je pige pas pourquoi tu t'embêtes à tout refaire, pour finalement pondre de l'HTML-caca

Reply

Marsh Posté le 20-12-2006 à 14:43:00    

FlorentG a écrit :

Marrant, le fichier ini ressemble à un fichier CSS. Pourquoi vouloi utiliser genre un bgcolor qui date de la préhistoire ? [:johneh]  [:johneh]  Autant faire directement un CSS côté serveur correspondant à ce que veut le gars. Je pige pas pourquoi tu t'embêtes à tout refaire, pour finalement pondre de l'HTML-caca


 
c'est pas à moi qu'il faut le dire alors ;-) Mais à l'auteur du sujet
Ca fait bien longtemps que je ne fais plus de 'HTML-caca'...
 

Reply

Marsh Posté le 20-12-2006 à 14:46:08    

clair que suffit de créer un css avec les choix de l'utilisateurs...

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed