sizeof et les tableaux

Petit nouveau ! | 8 Messages

13 août 2008, 16:35

Bonjour,

Voilà, une question toute bête mais je n'arrive pas à m'en sortir...

Je peuple un tableau de toutes les valeurs POST envoyées par le navigateur (je sais, c'est pas bien, mais c'est un autre problème). Ensuite, j'extrais la taille de ce tableau avec la fonction sizeof() :
$y = 0;
$vals = array();
foreach ($_POST as $var => $value) {
$vals[] = $value;
} 
$x = sizeof($vals) - 1;

}
while ($y <= $x){

...

}
Le problème, c'est que PHP ne reconnaît pas $x comme un chiffre. En testant "echo $x", il me retourne la bonne valeur. J'ai essayé de convertir en nombre avec intval($x), mais rien à faire. C'est comme si $x n'était pas spécifié, il l'ignore totalement. C'est la même chose avec la valeur du tableau $vals. Je peux sans problème les sortir (echo $vals[0], etc.), mais PHP n'arrive pas non plus à lire ces valeurs.

En testant (donc en connaissant d'avance la valeur de $x, par exemple 1), PHP interprète différemment ces deux codes:
$x = sizeof($vals) - 1; [sortie: 1, mais c'est comme si $x restait unset]
$x = 1; [sortie: 1, php "reconnaît" cette valeur]
:shock: Où se trouve l'erreur?

S.

Eléphant du PHP | 169 Messages

13 août 2008, 16:50

Que veux tu dire par "reconnait" ? PHP peut faire des opérations dessus c'et ça ?


Tu as essayé avec count() à la place de sizeof() ?

ViPHP
ViPHP | 1996 Messages

13 août 2008, 19:18

Essaye cela si tu veux allez plus vite :
$longueur_tableau_post = count($_POST);
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

13 août 2008, 20:45

C'est pas clair ton histoire... et ton code fonctionne très bien.

Quand tu dis que php ne reconnait pas ton $x comme un chiffre tu peux expliquer ce qui te fait penser ça ? Un gettype() de $x devrait te montrer qu'il s'agit bien d'un integer. La question est surtout, qu'est ce que tu en fais ensuite et qu'est ce qui te bloque ? :)


A noter que sizeof() est un alias de count() ... il ne sert à rien d'essayer l'un ou l'autre pour voir s'il y a une différence puisque c'est scrupuleusement la même chose :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 8 Messages

14 août 2008, 08:44

Que veux tu dire par "reconnait" ? PHP peut faire des opérations dessus c'et ça ?


Tu as essayé avec count() à la place de sizeof() ?
Hello-

Merci pour ta réponse.

Exemple concret, je sais qu'il y a deux éléments dans mon tableau, donc $x retourne 1.

la boucle while ($y <= $x){ ... considère que $x est égal à zéro, ou qu'il n'est pas spécifié.

J'ai essayé avec count() et c'est la même chose.

Le problème doit venir de mon tableau qui est créé ainsi, pour rappel :
foreach ($_POST as $var => $value) {
$vals[] = $value;
} 
Si par contre je crée ce tableau manuellement (il s'agit dID's de commande), ça marche:
$vals = array(6900, 6899); ou 
$vals = array('6900', '6899');
Ma méthode de population de $vals semble être la source du problème. Pourtant, quand je sors les valeurs de $vals (echo $vals[0] et [1]), il me sort 6900 et 6899...

EDIT: tests avec gettype(), il me renvoie "string". Mais si je change foreach ainsi:
foreach ($_POST as $var => $value) {
$vals[] = intval($value);
} 
Il me renvoie "integer", mais ma boucle ne fonctionne toujours pas.... $x est lui aussi considéré comme integer....c'est à n'y rien comprendre :roll:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

14 août 2008, 09:29

la boucle while ($y <= $x){ ... considère que $x est égal à zéro, ou qu'il n'est pas spécifié.
Est-ce qu'il t'est possible de nous préciser ce qui t'ammène à penser ça ?
Il me renvoie "integer", mais ma boucle ne fonctionne toujours pas.... $x est lui aussi considéré comme integer....c'est à n'y rien comprendre :roll:
Je mettrais donc plus la faute sur la boucle que sur $x ;)

NB : PHP étant un langage faiblement typé, il est possible de récupérer une chaine contenant un integer, de lancer des opérations de calcul sur cette chaine et cette chaine sera automatiquement considérée comme un entier.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Petit nouveau ! | 8 Messages

14 août 2008, 11:09

la boucle while ($y <= $x){ ... considère que $x est égal à zéro, ou qu'il n'est pas spécifié.
Est-ce qu'il t'est possible de nous préciser ce qui t'ammène à penser ça ?
Quand je définis $x = 1 dans le code, ça marche.

Quand je définis $x = sizeof($vals) (echo me retourne 1), ça ne marche pas.

J'ai trouvé une solution temporaire, créer une table temporaire et ensuite faire une boucle sur les ID's :
foreach ($_POST as $var => $value) {
$tt = mysql_query("insert into t_temp_fac (id_fac) VALUES ('$value')") or die(mysql_error());
} 

$ff = mysql_query("select * from t_temp_fac order by id_fac") or die (mysql_error());

while ($rrr = mysql_fetch_array($ff)){....}
Mais je reste intrigué...

Merci quand même à tous pour votre aide

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

14 août 2008, 11:52

En fait, ce que je voulais, c'est que tu sois plus précis que "ça ne marche pas". Qu'est-ce qui se passe réellement ?

Sinon, mieux que les tables temporaires (c'est très couteux les accès SGBD), est-ce que tu as essayé de remplacer ton
while($x <= $y)
par un
foreach($vals as $num_commande)
qui correspond à 100% à ce que tu cherches à faire, à savoir exécuter le code pour chaque (foreach) ligne de ton tableau
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 965 Messages

14 août 2008, 13:17

J'ai pas compris ca : "Je peuple un tableau de toutes les valeurs POST envoyées par le navigateur (je sais, c'est pas bien, mais c'est un autre problème)."

par exemple de faire une boucle foreach et de tester chaque element $_POST pour voir s'il contient des erreurs, créer un tableau d'erreurs et l'afficher, c'est le mal ?

Petit nouveau ! | 8 Messages

14 août 2008, 14:02

En fait, ce que je voulais, c'est que tu sois plus précis que "ça ne marche pas". Qu'est-ce qui se passe réellement ?
La valeur de $x ne change pas quelle que soit la taille de l'array, donc à chaque fois j'ai un seul passage de boucle ($y = 0 <= $x = 0), malgré un echo correct.
Sinon, mieux que les tables temporaires (c'est très couteux les accès SGBD), est-ce que tu as essayé de remplacer ton
while($x <= $y)
par un
foreach($vals as $num_commande)
qui correspond à 100% à ce que tu cherches à faire, à savoir exécuter le code pour chaque (foreach) ligne de ton tableau
Essayé, pas marché... :? Mais c'est pas grave, j'imagine que c'est du à certaines variables environnementales (?) ou autres. Merci.

Agité: en fait le "mal" c'est de récupérer toutes les variables postées sans contrôle sur leur nom, ce qui ouvre une faille de sécurité si quelqu'un bidouille son propre formulaire et l'envoie.