bonjour,

j'ai un probleme avec la fonction save de la page Model.php. c'est que dans celle-si, on fait un foreach d'un objet déclarer dans la page Request.php. Or, depuis la version 5 de php, on ne peux plus faire un foreach d'un objet. Alors comment faire???

ma fonction save:

public function save($data){
        $key = $this->primaryKey;
        $fields = array();
        $d = array();
        $sql = "";
            if(is_array($data)){
                foreach ($data as $k => $v){
                $fields] = "$k=:$k";
                $d":$k"] = $v;
            }
        }

        if(isset($data->$key) && !empty($data->$key)){
            $sql = 'UPDATE '.$this->table.' SET '.implode(',',$fields).' WHERE '.$key.'=:'.$key;
        }

        $pre = $this->db->prepare($sql);
        $pre->execute($d);
        return $sql;
    }

Request.php:

<?php 
class Request{
    public $url; //URL appellé par l'utilisateur
    public $page = 1;
    public $prefix = false;
    public $data = false;
    function __construct(){
        $this->url = isset($_SERVER'PATH_INFO'])?$_SERVER'PATH_INFO']:'/';
        if(isset($_GET'page'])){
            if(is_numeric($_GET'page'])){
                if($_GET'page'] > 0){
                    $this->page = round($_GET'page']);
                }
            }
            if(!empty($_POST)){
                $this->data = new stdClass();
                echo $this->data;
                foreach ($_POST as $k => $v) {
                    $this->data->$k = $v;
                }
            }
        }
    }
}

merci de vos suggestion.

4 réponses


  • Or, depuis la version 5 de php, on ne peux plus faire un foreach d'un objet. Tu es sûr de cette information? parce que moi je pense que c'est faux. Essaye de détailler un peu le problème

et bien pour faire, j'ai mis

if(is_array($data)){
                foreach ($data as $k => $v){
                $fields] = "$k=:$k";
                $d":$k"] = $v;
            }

Or, lorsque j'essaye d'afficher $data après ma boucle, il ne maffiche rien du tout. Et j'avais lu sur un site(je ne me souvien plus lequel) que depuis php5, on ne peut plus faire de foreach avec un objet. Je ne sait pas si c'est vrai mais si ce l'est, cela pourait expliquer mon problème, puisque dans le tutoriel, cela marche très bien mais je crois qu'il était à une version antérieur à php5. C'est pourquoi j'ai dis que cela ne marche plus dans la version php5.

Salut,
sur mon PC (php5.3.9), un foreach marche avec un objet.
exemple:

$a= new stdclass();
$a->titre='titre du truc';
$a->param1='on met ce qu\'on veut';
$a->param2='ici aussi';
foreach($a as $k=>$v){
    echo $k.'='.$v.'<br>';
}

ligne 19 tu crée ton objet $data, donc il est vide
ligne 20 : tu l'affiches, normalement tu n'as rien.
en plus, faire un echo sur un objet ne marche pas.
Cela te crée une erreur style:
Catchable fatal error: Object of class stdClass could not be converted to string in C:\chemin\vers\le\fichier\new.php on line X.
Si ca ne t'affiche rien, tu as sans doute desactivé l'afichage des erreurs dans ton php.ini. insere

ini_set('display_errors', 1);

en debut de __construct. comme ca si tu as une erreur, elle s'affichera. plus d'infos ici.
autre point, pour le debuggage, prefere print_r ou mieux, var_dump au lieu de echo, c'est plus detaillé.
pour t'en convaincre, essai le code suivant :

echo null;
var_dump( null);

en conclusion, mets un print_r($data) apres la boucle te servant a remplir l'objet, et supprime le echo ligne 20.

tiens nous au courant

Eric

d'accord, j'ai résolut une partie de mon problème:

si vous vous souvenez, j'avais mis un if qui vérifiait si c'était bien un array(), question de sécurité. Or, la boucle de répétition devait prendre en conddition un objet, alors la boncle ne s'éxécutait pas.

j'ai surement réglé un autre probleme puisque avant d'avoir mit le if(is_array($data)), ça ne marchait pas.

merci quand même de m'avoir aider à trouver la solution, je vous suis très reconnaissant.