8768 sujets

Développement web côté serveur, CMS

Bonjour, j'aurais besoin de votre aide, je ne comprends pas pourquoi j'ai ce message d'erreur :

Warning: Invalid argument supplied for foreach() in D:\xampp\htdocs\projets\STAGE\WordPress\wp-content\plugins\mindmap-plugin\mindmap-plugin.php on line 78


Par rapport à ce code :

 <?php
    
  foreach ($les_mindmap as $mindmap){
     echo '<tr>';                                                              
          echo '<td>'.$mindmap->getId_mind_map().'</td>';
          echo '<td>'.$mindmap->getNom_mind_map().'</td>';
      echo '</tr>';
   }
?>

Je suis entrain de faire un plugin, j'ai déjà fais tout en php et tout marche.
Maintenant je dois le mettre mon code dans wordpres, je mis connais pas du tout en wordpress.
J'ai cherché mais je n'ai rien trouvé, pouvez-vous m'aider svp ? Merci Smiley biggrin
a mon avis tu as un problème en amont, tu devrais


print_r($les_mindmap);


pour voir ce que contient ta variable
Salut

Quand on fait un foreach, on test toujours si la variable existe avant :


if(isset(les_mindmap)){
      foreach ($les_mindmap as $mindmap){
     }
}
JENCAL a écrit :
Salut

Quand on fait un foreach, on test toujours si la variable existe avant :


if(isset(les_mindmap)){
      foreach ($les_mindmap as $mindmap){
     }
}


J'ai fais le isset et voici le message d'erreur que j'ai eu :

Fatal error: Cannot use isset() on the result of an expression (you can use "null !== expression" instead) in D:\xampp\htdocs\projets\STAGE\WordPress\wp-content\plugins\mindmap-plugin\mindmap-plugin.php on line 75


Donc la valeurs est NULL si je comprends bien ?
non mais les variables c'est avec un $ devant Smiley langue

là tu as fais un mauvais copié (sans relire!) de mon erreur car j'avais oublié le dollar dans le isset.

les_mindmap (ceci est une expression, d'où l'erreur) c'est différents de $les_mindmap (ceci est une variable)
Modifié par JENCAL (05 Feb 2020 - 11:25)
Ah désolé Smiley ravi , javais pas vus, en rajoutant le $, il n'y a pas d'erreur donc j'imagine qu'il y a bien quelque chose dans la variable :
$les_mindmap.


Mais le soucis c'est qu'il n'y a rien dans mon tableau Smiley sweatdrop

J'ai essayé de faire un :
print_r($les_mindmap);
pour voir que contenait exactement cette variable mais rien s'affiche.
Modifié par MlleYouma (05 Feb 2020 - 11:33)
donc si ça n'affiche rien c'est que c'est vide. Smiley cligne Il faut que tu regardes en amont dans ton code.
donc il faut aller à la source

à l'assignation de $les_mindmap.
Celle ci doit être vide. mais là avec le code que tu nous montres impossible de comprendre/deviner.
Après si la variable est vide, c'est peut être du au faite qu'elle est déclarée sur une autre page php, peut être que le problèmes c'est que les 2 pages n'arrive pas à communiquer ensemble.

J'ai mis en relation les deux pages grâce à mon Init.php :

mindmap-plugin.php (page qui contient foreach) à un require_once"Init.php";

Dans Inti.php il y a :
require_once plugin_dir_path(__FILE__) ."classes/MindmapDAO.php";
require_once plugin_dir_path(__FILE__) . 'classes/Mindmap.php'; 


Dans Mindmap.php et MindmapDAO.php, il y a les variables : $les_mindmap et$mindmap
Dans la page du foreach il y a aussi ça :

$les_mindmap=array();
$dao = new MindMapDAO(); 
$les_mindmap = $dao->findAll(); 


Voici le code de MindmapDAO contient ça :

<?php

require_once plugin_dir_path(__FILE__)."DAO.php";

class MindmapDAO extends DAO {

    /**
    * Constructeur
    */

    function __construct() {
        parent::__construct();
    }

    /** 
    * Lecture d'un mindmap par son ID
    * @param int ID de le mindmap
    * @return \Mindmap
    */

    public function find($id_mind_map)
    {
        $sql = "SELECT * FROM mind_map WHERE id_mind_map= :id_mind_map";
        try {
            $params = array(":id_mind_map" => $id_mind_map);
            $sth=$this->executer($sql, $params);
            $row = $sth->fetch(PDO::FETCH_ASSOC);
        } catch (PDOException $e) {
            die("Erreur lors de la requête SQL : " . $e->getMessage());
        }
        $mindmap=null;
        if ($row) {
            $mindmap = new Mindmap($row);
        }
        // Retourne l'objet métier
        return $mindmap;
    } // function find()
  
    /**
    * Lecture de tous les mindmaps
    * @return array
    */
    public function findAll()
    {
        $sql = "SELECT * FROM mind_map";
        try {
            $sth=$this->executer($sql);
            $rows = $sth->fetchAll(PDO::FETCH_ASSOC);
        } catch (PDOException $e) {
            die("Erreur lors de la requête SQL : " . $e->getMessage());
        }
        $les_mindmap = array();
        foreach ($rows as $row) {
            $les_mindmap[] = new Mindmap($row);
        }
        // Retourne un tableau d'objets "mindmaps"
        return $les_mindmap;
    } // function findAll()
    

Modifié par MlleYouma (05 Feb 2020 - 11:49)
Dans ta méthode findAll() il faudrait tester le retour.

public function findAll()
    {
        $sql = "SELECT * FROM mind_map";
        try {
            $sth=$this->executer($sql);
            $rows = $sth->fetchAll(PDO::FETCH_ASSOC);
        } catch (PDOException $e) {
            die("Erreur lors de la requête SQL : " . $e->getMessage());
        }
        $les_mindmap = array();
        foreach ($rows as $row) {
            $les_mindmap[] = new Mindmap($row);
        }
        // Retourne un tableau d'objets "mindmaps"
       var_dump($les_mindmap);die;// ici
        return $les_mindmap;
    } 


Si le var_dump de fonctionne pas, alors ton programme ne passe pas par findAll(),

Si il affiche "vide" ou "null" alors il faut remonter le var_dump avant le foreach pour voir si le fecthAll à fonctionné.
En faisant ton :
 var_dump($les_mindmap);die; 


Je récupère bien des données :

array(11) { [0]=> object(Mindmap)#371 (2) { ["id_mind_map":"Mindmap":private]=> string(1) "1" ["nom_mind_map":"Mindmap":private]=> string(6) "Test01" } [1]=> object(Mindmap)#370 (2) { ["id_mind_map":"Mindmap":private]=> string(1) "2" ["nom_mind_map":"Mindmap":private]=> string(6) "Test02" } [2]=> object(Mindmap)#369 (2) { ["id_mind_map":"Mindmap":private]=> string(1) "3" ....... ect .......

Modifié par MlleYouma (05 Feb 2020 - 11:57)
et donc

  foreach ($les_mindmap as $mindmap){
     echo '<tr>';                                                              
          echo '<td>'.$mindmap->getId_mind_map().'</td>';
          echo '<td>'.$mindmap->getNom_mind_map().'</td>';
      echo '</tr>';
   }


se situe dans le même fichier et à après ça : ?

$les_mindmap=array();
$dao = new MindMapDAO(); 
$les_mindmap = $dao->findAll(); 
Ce code est est avant le foreach :
$les_mindmap=array();
$dao = new MindMapDAO(); 
$les_mindmap = $dao->findAll(); 


Le soucis c'est que ça s'affiche toujours pas dans le tableau ^^'
Modifié par MlleYouma (05 Feb 2020 - 13:34)
Donc si tu as tout ça a la suite
$les_mindmap=array();
$dao = new MindMapDAO(); 
$les_mindmap = $dao->findAll(); 
foreach ($les_mindmap as $mindmap){
     echo '<tr>';                                                              
          echo '<td>'.$mindmap->getId_mind_map().'</td>';
          echo '<td>'.$mindmap->getNom_mind_map().'</td>';
      echo '</tr>';
   }


il ne devrait pas y avoir d'erreurs... difficile de comprendre.
il doit y avoir autre chose...

et Si tu fais un dernier test :
$les_mindmap=array();
$dao = new MindMapDAO(); 
$les_mindmap = $dao->findAll(); 
var_dump($les_mindmap);die; // ajout du test var_dump die ici
foreach ($les_mindmap as $mindmap){
     echo '<tr>';                                                              
          echo '<td>'.$mindmap->getId_mind_map().'</td>';
          echo '<td>'.$mindmap->getNom_mind_map().'</td>';
      echo '</tr>';
   }

Modifié par JENCAL (05 Feb 2020 - 13:39)
Meilleure solution
Okay ! Un grand merci pour votre aide !
Vus que ce bloque :

$les_mindmap=array();
$dao = new MindMapDAO(); 
$les_mindmap = $dao->findAll(); 

Vus que ce bloque été pas juste avant le foreach ça marchait pas, mais comment ça se fait ? c'est parce que il n'arrivait pas à capté ces commande? ( je parle du foreach avec le bloc)
car il y avait du code entre les deux ?
Bah je connais pas le fichier en entier, donc il peut y avoir différentes sources de conflits