OVH Community, votre nouvel espace communautaire.

PHP fonction foreach() bug


kMoOg
04/12/2006, 09h38
Et comme çà ?
/* debut = menu déroulant des mois */
$chkmois = ( isset($_SESSION) && isset($_SESSION['mois']) ) ? $_SESSION['mois'] : '' ;

mangafan
23/11/2005, 13h51
j'edite ce post pour le test suite à un cafouillage.
Voilà l'adresse de trois site mutu il refuse tous le code mais ça marche en local et sur un serveur dédié.

Je ne trouve pas quel est le réglage qui pourrait bloquer ce code.

Chez jexiste.fr
http://harasamed.jexiste.fr/test/

Ovh en mutu
http://egheios.com/test/

Free ça m'étonne pas des masses.
http://blaplace.free.fr/test/


http://harasamed.jexiste.fr/test/source.zip

mangafan
23/11/2005, 13h13
oui car la fonction qui me donne l'erreur se trouve aussi dans le fichier tableau.php.

Je commence à croire que je suis fou je vais faire un fichier d'exmple simple avec le même type de code et vous donner toute la source voir si en le refesant ça bug ou pas car la version actuelle est un projet professionnel pour un ami.

Je vais l'installer sur un site perso ou il marche et sur le mutu vous pourrez comparer.

Thorgull
22/11/2005, 10h02
Es-tu sur que le fichier tableau.php est bien inclu lors de la seconde étape ?

mangafan
14/11/2005, 15h54
hum, $tableau est toujours un tableau et il n'est jamais vide puisqu'il s'agit d'une valeur fixe qui se trouve dans mon fichier tableau.php et que lors du premier affichage tout fonctionne, c'est si je valide mon formulaire en effectuant un choix que la page plante au retour.

C'est pour ça que je penchais plus sur un bug du foreach, ça marche en local, ça a marché sur un dédié ovh et ça marche au premier affichage sur le mutu donc je bloque complet là.

Faut que je vérifie la valeur qui se trouve dans ma variable de retour de choix. Je vous tiens au jus.

Homer Jay
14/11/2005, 15h01
mangafan écrivait :
Code PHP:
/* debut = menu déroulant des mois */
$chkmois = (empty($_SESSION['mois'])) ? '' $_SESSION['mois'];
TableauSelect($mois$chkmois'mois_opt');
/* fin = menu déroulant des mois */ 
Désormais l'erreur exact est :

Warning: Invalid argument supplied for foreach() in /home/egheios/www/gpm/include/tableau.php on line 6

Code PHP:
foreach ($tableau as $key => $value
Donc si je me rappel bien l'erreur peut se situer n'importe où dans le foreach. C'est étrange tant que la valeur est nul le menu déroulant marche mais dès qu'on en sélectionne une ça plante.
Je pense que ça indique que l'erreur est dans la valeur de $tableau: peut-être que la chaîne vide n'est pas une valeur acceptable comme tableau. Je propose d'utiliser print_r pour connaître précisément la valeur de $tableau dans les cas où ça plante.

mangafan
14/11/2005, 14h40
Re

J'ai fais en sorte d'enlever les @ avec ce code

Code PHP:
/* debut = menu déroulant des mois */
$chkmois = (empty($_SESSION['mois'])) ? '' $_SESSION['mois'];
TableauSelect($mois$chkmois'mois_opt');
/* fin = menu déroulant des mois */ 
Désormais l'erreur exact est :

Warning: Invalid argument supplied for foreach() in /home/egheios/www/gpm/include/tableau.php on line 6

Code PHP:
foreach ($tableau as $key => $value
Donc si je me rappel bien l'erreur peut se situer n'importe où dans le foreach. C'est étrange tant que la valeur est nul le menu déroulant marche mais dès qu'on en sélectionne une ça plante.

mangafan
06/11/2005, 18h36
je vais tester ça et je vous tiens au courant mais quand je vais retirer le @ au premier affiche de la page j'aurai droit à un "undefined variable" qui va je pense planter le script du premier coup.

Mais j'essai et je donne les résultat ^^.

Homer Jay
06/11/2005, 18h25
mangafan écrivait :
Je penche de plus en plus pour un rejet de la variable SESSION par le foreach sur le mutu mais je ne sais pas comment le vérifier et/ou passer outre.
Retire le @. S'il y a un problème à ce niveau, ça devrait mettre une erreur lisible dans le browser (plutôt que dans error.log auquel on n'a pas accès en mutu).

mangafan
06/11/2005, 18h13
En fait le script gère l'affichage d'un menu déroulant via le système de template Phpbb et pour moi le problème vient bien du foreach car j'ai deux menus déroulants tirés eux d'une base de donnée et donc généré via un mysql_fetch_array et cela fonctionne sur le mutualisé comme en local.

Le global est la justement pour que la fontion prenne bien en compte le template, son fonctionnement a-t-il été modifié par ovh ? Je pense pas, car dans un premier temps la fonction marche c'est plutard que ça se gatte.

En plus j'ai déjà eu l'occasion de tester le script sur un dédié ovh et cela marchait aussi...

Le problème se déroule de la manière suivante, quand j'affiche mon formulaire les menus sont bien présent mais dès que je clique pour valider et passer à la page suivante en ayant choisi une option du menu, le bug est provoqué et le menu déroulant se vide. Au lieu de mettre "selected" sur l'option voulu, le foreach plante et le bloc du template refuse de se créer se qui retire l'affichage des options.

Code PHP:
$selected = ($key == $valeur) ? ' selected="selected"' ''
Je me demande si le script ne plante pas ici, au moment où il vérifie la variable $valeur qui se trouve être de type $_SESSION["variable"], une restriction de la nouvelle version de php ou de l'hébergeur ?

Dans mon ficher index.php ex:

Code PHP:
/* debut = menu déroulant des mois */
TableauSelect($mois, @$_SESSION["mois"], 'mois_opt');
/* fin = menu déroulant des mois */ 
Dans mon ficher index.tpl ex:

Code PHP:
<select name="mois">

<
option value="{mois_opt.VALUE}"{mois_opt.SELECTED}>{mois_opt.OPTION}option>

select
Je penche de plus en plus pour un rejet de la variable SESSION par le foreach sur le mutu mais je ne sais pas comment le vérifier et/ou passer outre.

Homer Jay
04/11/2005, 20h41
Ça n'a probablement pas de rapport avec ton problème; ça raconte que dans 4.3.11 (uniquement), foreach ne signale pas de warning dan un cas où il devrait. Mais, pour tous les cas corrects, ça ne change rien.

Homer Jay
04/11/2005, 20h40
mangafan écrivait :
J'ai un script utilisant foreach() pour récupérer et réafficher une liste déroulante avec sa valeur sélectionnée.

Cela fonctionne en local sur Easyphp 1.8: (...) Mais pas en ligne pourtant je suis sur que ma variable est un tableau puisque que la valeur est fixée dans un fichier tableau.php appelé par un include.

J'ai vu sur la mailing liste une mise a jour de Php 4.4.1 via correctif.

(...)http://bugs.php.net/bug.php?id=32670

J'ai de la chance, visiblement moi j'ai le soucis inverse ou plutôt le même mais dans l'autre sens c'est comme on veut...
Je ne vois rien de suspect dans ton code (sauf que le sens du mot-clé «global» a peut-être changé, on ne sait jamais). Quel est le problème exact que tu observes? Est-ce qu'il y a de l'affichage ou rien du tout? Est-ce que sur ton serveur chez toi tu peux confirmer que rien n'arrive dans le log d'erreurs?

mangafan
04/11/2005, 17h05
Bonjour,

J'ai un script utilisant foreach() pour récupérer et réafficher une liste déroulante avec sa valeur sélectionnée.

Cela fonctionne en local sur Easyphp 1.8 :

Apache 1.3.33
Php 4.3.10
Mysql 4.1.9

Mais pas en ligne pourtant je suis sur que ma variable est un tableau puisque que la valeur est fixée dans un fichier tableau.php appelé par un include.

J'ai vu sur la mailing liste une mise a jour de Php 4.4.1 via correctif.

Les changelogs de php parle souvent de la fonction foreach mais je ne saisi pas tout.

Code PHP:
function TableauSelect($tableau,$valeur,$nom)
{
         global 
$template;
         foreach (
$tableau as $key => $value)
            {
               
$selected = ($key == $valeur) ? ' selected="selected"' ''
                
$template->assign_block_vars($nom, array(
                    
'OPTION' =>        $value,
                    
'VALUE' =>        $key,
                    
'SELECTED' =>        $selected
                
));
            }      

http://bugs.php.net/bug.php?id=32670

J'ai de la chance, visiblement moi j'ai le soucis inverse ou plutôt le même mais dans l'autre sens c'est comme on veut...