Bonjour,

Je suis sur l'apprentissage du PDO MVC etc...

Je sui sur le re-création de mon système que j'avais déjà fait et je suis bloquer car je ne sais pas comment utiliser foreach j'ai pris l'abitude avec les while.

Donc je récupére mes catégories et les forums dans cette catégorie.

Ce que je fais

Dans un premier temps je liste mes catégorie jusque la c'est bon

foreach(Categories::getCategories() as $cats):

ensuite je veut récupéré les forum dans cette catégorie

//dans ma class Database
public function boucle($statement,$attr){
     $req  = $this->getPDO()->prepare($statement);
    $req->execute($attr);
    $datas = $req->fetch();
    return $datas;
}

//dans ma class ViewForums
public static function catForums($id){

        return App::getDB()->boucle("SELECT * FROM ".static::getTable()." WHERE categorie_id = ?",[$id], get_called_class());

}

//dans la vue
$forum = [ViewForums::catForums($cats->id)];
foreach($forum as $forums): 

Ce que je veux

Je veut listé les forums dans chaque catégorie ou il est assigné

Ce que j'obtiens

ça ne fonctione pas comme je veut je ne récupère qu'un seul forum par cétégorie alors que je souhaite tous les listé, j'ai tester fetchall fetchobject etc... rien n'y fait.

J'avais fini mon forum mais je souhaite un code plus souple et aussi apprendre mai cette boucle me bloque, et elle me sera utile souvent.

D'alleur si vous savez comme je peut faire un while car j'ai tester ça ne fonctionne pas ça mouline.

voila merci.

4 réponses


neecride
Auteur
Réponse acceptée

Bon après moulte test je suis parvenur a faire ce que je voulais :

Ma nouvel fonction

    function catForum($statements,$attr){

        $req = $this->getPDO()->prepare($statements);
        $req->execute($attr);
        $datas = [];

        while($rows = $req->fetchObject()){
            $datas[] = $rows;
        }

        return $datas;
    }

    public static function catForums($id){

        return App::getDB()->catForum("SELECT * FROM ".static::getTable()." WHERE categorie_id = ?",[$id], get_called_class());

    }    

Je peut donc ainsi faire mon foreach de cette façon sans passer par un tableau :

foreach(ViewForums::catForums($cats->id) as $forum): 

Voila je poste quand même pour savoir ou j'en suit et si quelqu'un a le même soucis, car j'ai suivis le tuto de Grafikart.

Mai c'est quand même embêtant de devoir faire plusiuer fonction pour géré plusieur cas.

Salut,

Pourrais tu essayer de remplacer neecride:

 $datas = $req->fetch();

par

 $datas = $req->fetchAll();

De mémoire il me semble que fetch() ne récupère qu'une seul ligne et fetchAll() plusieurs lignes

Hello ,

Déjà un peu de doc ne fait pas de mal : Boucle foreach

En gros tu dois comprendre que l'argument sur lequel tu veux boucler doit être de type tableau.

La différence entre un while est un foreach est qu'un while c'est une boucle "TANT QUE" la condition est vrai et un foreach on sait combien de fois la boucle va boucler car on sait combien d'élément on a avant de boucler. (Ca fait bizarre dit comme ça mais l'idée est la)

(Après effectivement le commentaire du dessus est vrai. Un fetchall() en PDO renvoie un tableau de tous les éléments enregistrés)

la doc du fetchall .

Du coup, dans le nom de tes variables pour que tu puisses comprendre doit être un truc comme ça :

J'ai mis le "S" en majuscule pour te dire que tu as une variable contenant de multiple données, et que tu cherches une donnée en particulier quand tu fais un foreach.

//On récupère un tableau avec la liste des forums
$forumS = [ViewForums::catForums($cats->id)];

//On regarde sur chaque élément du tableau donc dans le tableau des forumS, on veut les infos relatif à un forum
// Ce qui donne :
foreach($forumS as $forum): 
neecride
Auteur

brelandas Oui j'ai déja tester j'ai même fais une fonction qui gere les deux cas.

Kaelyscius Justement je l'ai lu cette doc (qui n'aide pas un débutant) elle ne m'aide pas a comprendre pourquoi le foreach ne me retourne pas tous les forum qui sont lié au catégorie

De plus j'ai aussi tester le fetchAll ça ne fonctionne pas pour autant j'ai une erreur SQLSTATE

    public function prepare($statement, $attr, $uniq = false){
        $req  = $this->getPDO()->prepare($statement);
        $req->execute($attr);
        if($uniq){
            $datas = $req->fetch();
        }else{
            $datas = $req->fetchAll();    
        }

        return $datas;
    }  

Donc je fais bien un prepare et un execute de l'id qui est l'id de mes catégorie donc cat = 1 => forum_id = 1 je ne vois vraiment pas ce qui cloche.