Foreach php4 vs php5

m76
Invité n'ayant pas de compte PHPfrance

05 nov. 2012, 13:06

Bonjour à tous,
je fais parti de la majorité silencieuse du forum mais là, en noob que je suis, je suis bloqué avec un script pour un CMS qui ne passe pas suite à une "migration" en php5 et qui me donne :"Invalid argument supplied for foreach()"...

un morceau du code :
		$db->setQuery($q);
		$rows = $db->loadObjectList();
		
		$res = array();
		foreach($rows as $row){
			$row->dep = $this->getDep($row->id);
			$res[] = $row;
		}
		return $res;
	}
j'ai essayé différents trucs (vus ici ou ailleurs), mais au mieux j'ai juste le message d'erreur qui disparait.

En fait, il semblerait que la valeur soit nulle.

Comment faire pour que cela fonctionne comme avant ?
Merci d'avance :priere:

Eléphant du PHP | 267 Messages

05 nov. 2012, 13:26

salut,

avec PHP5, le objets sont passés par référence alors qu'en PHP4, c'est par valeur
donc il faut forcer la copie de l'objet :
$db->setQuery($q);
$rows = $db->loadObjectList();

$res = array();
foreach($rows as $row){
    $row_copie = clone $row;
    $row_copie->dep = $this->getDep($row_copie->id);
    $res[] = $row_copie;
}
return $res;
@+
dix2

m76
Invité n'ayant pas de compte PHPfrance

05 nov. 2012, 13:36

Ah ! ça marche

milles mercis =D>

m76
Invité n'ayant pas de compte PHPfrance

05 nov. 2012, 15:02

... heu non en fait ça ne marche pas ou plus (c'est possible ?)

:cry:

Eléphant du PHP | 267 Messages

05 nov. 2012, 15:04

quel est le message d'erreur ?

m76
Invité n'ayant pas de compte PHPfrance

05 nov. 2012, 15:48

toujours le même :
Warning: Invalid argument supplied for foreach()
avec en référence la ligne du foreach

Eléphant du PHP | 267 Messages

05 nov. 2012, 16:02

avec ce code là:
$db->setQuery($q);
$rows = $db->loadObjectList();

$res = array();
if(is_array($rows){
    foreach($rows as $row){
        $row->dep = $this->getDep($row->id);
        $res[] = $row;
    }
}
return $res;
}
as-tu tjs l'erreur ?

m76
Invité n'ayant pas de compte PHPfrance

05 nov. 2012, 16:09

là, il me met un parse error sur le premier crochet

m76
Invité n'ayant pas de compte PHPfrance

05 nov. 2012, 16:25

(désolé un peu trop assisté sur ce genre de bug :'()

il manquait un ) à la fin de "if(is_array($rows)"

là je n'ai plus le parse error ni le message d'erreur, mais je n'ai plus le résultat d'avant (sous php4)

Eléphant du PHP | 267 Messages

05 nov. 2012, 16:59

et avec ça :
$db->setQuery($q);
$rows = $db->loadObjectList();

$res = array();
if(is_array($rows)){
    foreach($rows as $row){
        $row_copie = clone $row;
        $row_copie->dep = $this->getDep($row_copie->id);
        $res[] = $row_copie;
    }
}
return $res;

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

05 nov. 2012, 17:05

Si le problème se situe au niveau du foreach(), c'est que c'est le tableau que tu lui passes en argument qui n'en est pas un. Probablement le même problème que celui signalé par dix2, mais sur le résultat de ta méthode loadObjectList() qui ne te retourne pas (plus ?) un tableau.

Tu peux faire un var_dump($rows) pour vérifier ce que celui-ci contient, mais à priori il faudrait regarder le traitement de cette méthode pour voir ce qui ne va pas :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

m76
Invité n'ayant pas de compte PHPfrance

05 nov. 2012, 19:31

merci pour tes efforts dix2 Image
malheureusement on a le même résultat

Ryle,
Null, c'est pas forcément bon ça ? XD

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

06 nov. 2012, 22:01

Null, c'est pas forcément bon ça ? XD
Nan pas trop, comme déjà indiqué, par Ryle il faut que tu revois le fonctionnement de ta méthode loadObjectList, ou alors bien prévoir ce cas ;)


@+
Il en faut peu pour être heureux ......