8792 sujets

Développement web côté serveur, CMS

Bonjour,
Dans le concour "j'obtiens les erreurs les plus étranges", je pense que je serai très bien placé Smiley lol
Une fois de plus, une erreur apparait à mon écran, pour le plus grand malheur de mes nerfs, regardez plutôt :

Si je crée une page ( .php) avec uniquement ceci (le but étant de se souvenir de l'option sélectionné lors de la validation (je simplifie)) :


			<select name="jour" id="naissance">
				<option value="01"<?php if($_POST['jour'] == 01) { echo " selected"; } ?>>1</option>
				<option value="02"<?php if($_POST['jour'] == 02) { echo " selected"; } ?>>2</option>
				<option value="03"<?php if($_POST['jour'] == 03) { echo " selected"; } ?>>3</option>
				<option value="04"<?php if($_POST['jour'] == 04) { echo " selected"; } ?>>4</option>
				<option value="05"<?php if($_POST['jour'] == 05) { echo " selected"; } ?>>5</option>
				<option value="06"<?php if($_POST['jour'] == 06) { echo " selected"; } ?>>6</option>
				<option value="07"<?php if($_POST['jour'] == 07) { echo " selected"; } ?>>7</option>
				<option value="08"<?php if($_POST['jour'] == 08) { echo " selected"; } ?>>8</option>
				<option value="09"<?php if($_POST['jour'] == 09) { echo " selected"; } ?>>9</option>
				<option value="10"<?php if($_POST['jour'] == 10) { echo " selected"; } ?>>10</option>
				<option value="11"<?php if($_POST['jour'] == 11) { echo " selected"; } ?>>11</option>
				<option value="12"<?php if($_POST['jour'] == 12) { echo " selected"; } ?>>12</option>
				<option value="13"<?php if($_POST['jour'] == 13) { echo " selected"; } ?>>13</option>
				<option value="14"<?php if($_POST['jour'] == 14) { echo " selected"; } ?>>14</option>
				<option value="15"<?php if($_POST['jour'] == 15) { echo " selected"; } ?>>15</option>
				<option value="16"<?php if($_POST['jour'] == 16) { echo " selected"; } ?>>16</option>
				<option value="17"<?php if($_POST['jour'] == 17) { echo " selected"; } ?>>17</option>
				<option value="18"<?php if($_POST['jour'] == 18) { echo " selected"; } ?>>18</option>
				<option value="19"<?php if($_POST['jour'] == 19) { echo " selected"; } ?>>19</option>
				<option value="20"<?php if($_POST['jour'] == 20) { echo " selected"; } ?>>20</option>
				<option value="21"<?php if($_POST['jour'] == 21) { echo " selected"; } ?>>21</option>
				<option value="22"<?php if($_POST['jour'] == 22) { echo " selected"; } ?>>22</option>
				<option value="23"<?php if($_POST['jour'] == 23) { echo " selected"; } ?>>23</option>
				<option value="24"<?php if($_POST['jour'] == 24) { echo " selected"; } ?>>24</option>
				<option value="25"<?php if($_POST['jour'] == 25) { echo " selected"; } ?>>25</option>
				<option value="26"<?php if($_POST['jour'] == 26) { echo " selected"; } ?>>26</option>
				<option value="27"<?php if($_POST['jour'] == 27) { echo " selected"; } ?>>27</option>
				<option value="28"<?php if($_POST['jour'] == 28) { echo " selected"; } ?>>28</option>
				<option value="29"<?php if($_POST['jour'] == 29) { echo " selected"; } ?>>29</option>
				<option value="30"<?php if($_POST['jour'] == 30) { echo " selected"; } ?>>30</option>
				<option value="31"<?php if($_POST['jour'] == 31) { echo " selected"; } ?>>31</option>
			</select>


Théoriquement, aucune option ne devrait-être sélectionnée et pourtant, lorsqu'on regarde la source, les options 8 et 9 sont sélectionnées Smiley eek
Voyez vous la même erreur (je vous laisse testez vous même au cas ou cela viendrait de mon serveur, ce dont je doute) ? Smiley ohwell


Merci d'avance et bonne soirée Smiley smile
Modifié par Gaylord.P (17 Aug 2005 - 20:36)
Bonjour.

Un nombre précédé d'un 0 comme 01 02 03 est considéré comme étant un nombre octal.
Lorsqu'aucune option n'est sélectionnée, on admettra que $_POST['jour'] contient null (c'est plus compliqué que ça mais ça suffit comme explication ici).
Maintenant que tu sais qu'un nombre précédé d'un 0 désigne un nombre octal, tu comprends facilement que 08 et 09 posent un problème. En effet, les chiffres 8 et 9 n'existent pas en octal puisqu'on compte 1 2 3 4 5 6 7 10 11 12...

Comme ces valeurs de 08 et 09 sont impossibles, php admettra que ça vaut null.

Donc la comparaison
if($_POST['jour'] == 09)
et de même pour 08 sont true puisqu'on compare en réalité null et null. De ce fait, les options sont sélectionnées.

Maintenant pour régler ce problème, tu as deux solutions :
- Soit tu supprimes les 0 qui ne servent à rien dans 01 02 03 ... 09
- Soit tu décides de comparer des chaînes de caractères au lieu de nombres. php se charge de la conversion automatiquement.

Donc au lieu de :
if($_POST['jour'] == 09)
tu aurais
if($_POST['jour'] == "09")

mais perso je te conseille la première parce que suivant l'utilisation que tu as décidé de faire du choix ainsi fait, tu préfeèreras par la suite plutôt travailler avec des nombres plutôt que des chaînes. Si tu décides de convertir tes chaînes avec des 0 en nombres par la suite, tu auras de nouveau le problème du 0 octal et tes calculs seront de temps en temps faussés par les fameux 08 et 09.
De plus, rien ne t'empêche de faire ceci si tu tiens à garder le 0 à l'affichage :

<option value="9">09</option>

Voilà, j'espère que mes explications sont claires.