Page 1 sur 1

sizeof et les tableaux

Posté : 13 août 2008, 16:35
par subversive_element
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.

Posté : 13 août 2008, 16:50
par _activmik
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() ?

Posté : 13 août 2008, 19:18
par Aureusms
Essaye cela si tu veux allez plus vite :
$longueur_tableau_post = count($_POST);

Posté : 13 août 2008, 20:45
par Ryle
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 :)

Posté : 14 août 2008, 08:44
par subversive_element
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:

Posté : 14 août 2008, 09:29
par zeus
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.

Posté : 14 août 2008, 11:09
par subversive_element
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

Posté : 14 août 2008, 11:52
par zeus
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

Posté : 14 août 2008, 13:17
par agité
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 ?

Posté : 14 août 2008, 14:02
par subversive_element
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.