PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 28-04-2014 17:11:09

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Je me fais vieux

Saluton,

Ce matin j'ai remis les mains dans le cambouis du petit formulaire du livre d'or de mon site de chansons hébergé chez Manicow (WDMédia en PHP 5, j'imagine)

Et là j'ai eu une surprise avec ce code :

<?php
session_start();
$chiffres = array(1=>"un",2=>"deux",3=>"trois",4=>"quatre",5=>"cinq",6=>"six",7=>"sept",8=>"huit",9=>"neuf");
$premier = rand(1,9);
$second  = rand(1,9);
$_SESSION['premier']=$chiffres[$premier];
$_SESSION['second']=$chiffres[$second];
?>

*****
                            <p>Piège à robots, merci de répondre en chiffres. Combien font <b><?php echo $premier. '</b> et <b>'.$second.'</b>';?></p>
                            <p>
                                <label for="captcha" title="Veuillez saisir le résultat en chiffres" class="oblig">* réponse :</label>
                                <input type="text" name="captcha" size="3" tabindex="3" >
                            </p>

En effet, alors qu'il s'agissait selon moi d'une étourderie de ma part, ce code affiche bien les littéraux correspondant aux chiffres tirés au hasard, alors que selon moi, il devrait afficher les chiffres.

J'ai donc modifié mon code comme ceci

<?php
session_start();
$chiffres = array(1=>"un",2=>"deux",3=>"trois",4=>"quatre",5=>"cinq",6=>"six",7=>"sept",8=>"huit",9=>"neuf");
$un = rand(1,9);
$deux  = rand(1,9);
$_SESSION['premier']=$chiffres[$un];
$_SESSION['second']=$chiffres[$deux];
?>

****
                            <p>Piège à robots, merci de répondre en chiffres. Combien font <b><?php echo $chiffres[$un]. '</b> et <b>'.$chiffres[$deux].'</b>';?></p>
                            <p>
                                <label for="captcha" title="Veuillez saisir le résultat en chiffres" class="oblig">* réponse :</label>
                                <input type="text" name="captcha" size="3" tabindex="3" >
                            </p>

Ce qui fonctionne tout à fait normalement mais je m'interroge, par quelle magie, dans le premier code, les index se transformaient-ils en leurs littéraux ?


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#2 28-04-2014 21:41:27

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Je me fais vieux

Salut Mk,

Désolé mais tes deux codes sont strictement identiques.
Dans un tableau associatif il y a une clé et une valeur $array=array(key=>value) et lorsque tu écris $array[$a], $a corresponds à l'index de la clé (key) et la valeur est retournée (value).
Donc si tu souhaites connaître la valeur de la clé à la position $a, il te faut écrire
$key=array_keys($array,$array[$a]);
print $key[0];

en espérant avoir été utile wink


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#3 29-04-2014 06:48:33

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Je me fais vieux

Merci mon bon Jc, de porter assistance au troisième âge.

D'où mon incompréhension.

Comment se fait-il que, dans le premier code

Combien font <b><?php echo $premier. '</b> et <b>'.$second.'</b>';?></p>

affichait bel et bien les valeurs du tableau associatif sans même se référer à celui-ci ?

Je finissais par me demander si, dans la config PHP du serveur, il n'y avait pas une directive du genre de la vieille directive register_global sur ON et qui transformait tout index de $_SESSION en variable éponyme; $_SESSION['premier'] et $premier, $_SESSION['second'] et $second.

Car dès que j'utilisais $un et $deux, et non plus $premier et $second, le phénomène disparaissait.

Je réalise que cela peut provenir d'un temps de latence entre la mise à jour par FTP du code sur le serveur et sa prise en compte par le serveur. (Persistance de cache, probablement). Cette explication, moins ésotérique, me semble plus probable, même si je reste assez perplexe.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#4 29-04-2014 07:05:32

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Je me fais vieux

Salut Mk.

C'est normal :
Si tu fais $un=1; et que la clé du premier index de ton tableau associatif est 1, il va y avoir correspondance, mais ce n'est pas une obligation dans un cas général.


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#5 29-04-2014 07:13:29

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Je me fais vieux

Quand tu dis que c'est normal, es-tu en train de me dire que si j'ai $un = 1 et $chiffres[1]='un' alors echo $un; va afficher 'un' comme si je faisais echo $chiffres[$un]; ?

Si c'est ça, je sens que je vais avoir un gros mal de tête.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#6 29-04-2014 11:40:33

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Je me fais vieux

Non j'ai pas dit ça ^^
Voilà ce que j'ai dit, exprimé différemment:

1) Tu as choisi comme valeurs de clé dans ton tableau associatif les nombres 1,2,3,4,5,6,7,8,9
2) Si tu définis une variable $un=1, alors la valeur de ta variable est identique à la valeur de la première clé de ton tableau
3) c'est donc normal mais dans un cas général c'est rarement le cas. Disons que c'est ton choix qui a crée un contexte particulier ou cette "coïncidence".

Dernière modification par Jc (29-04-2014 11:41:29)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#7 29-04-2014 13:07:06

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Je me fais vieux

Mouais, je ne comprends rien du tout à ton propos.

Le symptôme auquel j'ai été confronté s'est manifesté de la sorte :
J'ai défini un tableau associatif $chiffres

$chiffres = array(1=>"un",2=>"deux",3=>"trois",4=>"quatre",5=>"cinq",6=>"six",7=>"sept",8=>"huit",9=>"neuf");

Tout simplement pour éviter la position 0 ce qui est assez stupide puisque j'aurais aussi bien pu définir 0=>'zéro'.

J'ai ensuite tiré au sort deux nombres $premier et $second dans l'intervalle 1-9.

$premier = rand(1,9);
$second  = rand(1,9);

J'ai copié ces valeurs dans des items associatifs de $_SESSION

$_SESSION['premier']=$chiffres[$premier];
$_SESSION['second']=$chiffres[$second];

J'ai alors observé que $premier et $second ne contenaient pas des valeurs numériques  comprises entre 1 et 9 mais leurs équivalents littéraux.

Et ce phénomène n'a disparu que lorsque j'ai cessé de donner comme noms à mes variables les index que je leur attribuais dans $_SESSION et je ne trouve pas cela normal du tout.

D'où ma version avec $un et $deux et $_SESSION['premier'] et $_SESSION['second'].

Et rien de ce que tu écris n'explique ce curieux phénomène à mes neurones séniles.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#8 30-04-2014 05:43:50

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Je me fais vieux

Il n'y a pas plus simple

1) $premier et $second n'ont rien à voir avec ton tableau associatif
2) ils ont tous les deux pour type int et pour valeur rand(1,9) soit un chiffre numérique compris entre un et 9 inclus.
3) A partir de là c'est normal que lorsque que tu fais print $premier tu obtiennes un chiffre compris entre un et 9 inclus.

Maintenant concernant ton tableau associatif,
1) tu as choisis - à juste titre - de nommer tes clés avec des chiffres de 1 à 9 inclus, de manière à les faire coïncider avec les valeurs que peuvent prendre tes variables $premier et $second. A partir de là, il est donc parfaitement normal qu'il y ait parfaitement correspondance entre leur valeur respectives
2) Il y a correspondance exacte entre la valeur d'index de la clé et la valeur de la clé elle-même (je ne parle que des valeurs numériques) ainsi pour obtenir la valeur de $premier en chiffres, tu te sers de $premier comme index dans ton tableau associatif pour en obtenir la valeur en chiffres :
$premier=3; print $chiffres[$premier]; // retourne 'trois';

as-tu compris maintenant?


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#9 30-04-2014 06:19:38

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Je me fais vieux

Saluton, mon Jc,

C'est vraiment un dialogue de sourds.

Jc a écrit :

2) Il y a correspondance exacte entre la valeur d'index de la clé et la valeur de la clé elle-même (je ne parle que des valeurs numériques) ainsi pour obtenir la valeur de $premier en chiffres, tu te sers de $premier comme index dans ton tableau associatif pour en obtenir la valeur en chiffres :

Là je suppose qu'il faut remplacer tes "en chiffres" par "en lettres".

Que de confusion !

Tout cela j'en étais vraiment persuadé jusqu'à ce que je découvre que dans mon premier script

echo $premier.'  et  '.$second;

me retournait

un et trois

au lieu de

1 et 3

par exemple.

D'où mon étonnement et mon post.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#10 30-04-2014 06:56:22

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Je me fais vieux

salut,

Là je suppose qu'il faut remplacer tes "en chiffres" par "en lettres".

Non car dans un tableau associatif, l'index du tableau et la clé sont confondus, ainsi quand tu dis qu'il n'y a pas d'index 0 dans un tableau associatif l'exemple suivant peut prêter à confusion:

$tableau=array(0=>'abc','B'=>'bcd');
print $tableau[0]; // retourne 'abc'

Dernière modification par Jc (30-04-2014 06:58:12)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#11 30-04-2014 07:02:53

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Je me fais vieux

Jc a écrit :

l'exemple suivant peut prêter à confusion

Pourquoi ?

Tout cela n'éclaircit rien du phénomène auquel j'ai été confronté hier.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#12 30-04-2014 07:52:39

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Je me fais vieux

Moi je ne vois rien d'anormal. Ton premier exemple (initial) affiche les nombres en chiffres et dans le second cela s'affiche en lettres car tu interroges le tableau contrairement à ce que tu fais dans ton premier exemple. Qu'est ce qui te choques la dedans?

Dernière modification par Jc (30-04-2014 07:52:51)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#13 30-04-2014 10:16:51

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Je me fais vieux

Ce qui me choque c'est que dans le premier exemple, inexplicablement pour moi, $premier et $second affichaient les littéraux et non les chiffres.

Décidément, on est dans l'impasse tous les deux.

Je ne sais pas lequel des deux s'explique mal, mais on ne s'en sort pas.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#14 30-04-2014 12:51:17

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Je me fais vieux

Tu peux réessayer ton premier code tel quel et me dire si tu as toujours le même problème?


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#15 30-04-2014 13:42:10

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Je me fais vieux

Voilà, c'est fait et

<?php echo $premier. '</b> et <b>'.$second.'</b>';?></p>

affiche les littéraux.

C'est un truc de dingue.

vérifie toi-même :http://www.avcxjo-moko-kantas.fr/oralibro.php


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#16 30-04-2014 14:08:07

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Je me fais vieux

Je viens de faire afficher phpinfo() à partir du serveur et, ô surprise, register_globals est sur 'on'.

Il n'est donc pas impossible que le serveur établisse des passerelles entre $_SESSION['premier'] ou $_SESSION['second'] et $premier et $second comme je le subodorais.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

Pied de page des forums