Bonjour,

j'ai une erreur du style Notice: Undefined variable: connexion in C:\wamp64\www\POO_php_grafikart\Blog\environnement\BDD.php on line 35 et Fatal error: Call to a member function query() on null in C:\wamp64\www\POO_php_grafikart\Blog\environnement\BDD.php on line 40

alors que ma requête dans mon getCategorie ma l'air bonne et ma boucle foreach aussi donc je ne comprend pas voila le code :

Categories.php

merci pour vos futurs

Ce que je fais

home.php


    <ul>
      <?php
        foreach(\Environnement\Table\Categories::getCategorie() as $categories)
        {
      ?>
          <li><a href="<?= $categories->url; ?>"> <?= $categories->nom; ?> </a></li>
      <?php
        }
      ?>
   </ul>

et

Categories.php

<?php

namespace Environnement\Table;

use Environnement\Environnement;

class Categories
{
  private static $tables = 'categories';

  public static function getCategorie()
  {
    return Environnement::getDb()->requete('
    select *
    from ' . self::$tables .'
    ', __CLASS__);
  }
}

 ?>

Ce que je veux

résoudre mon problème sur ce petit problème

Ce que j'obtiens

Undefined variable: connexion in C:\wamp64\www\POO_php_grafikart\Blog\environnement\BDD.php on line 35
Fatal error: Call to a member function query() on null in C:\wamp64\www\POO_php_grafikart\Blog\environnement\BDD.php on line 40

4 réponses


Lartak
Réponse acceptée

Bonjour.
Tu retournes une variable, alors que tu es censé retourner la valeur de la propriété.
Il te faut donc remplacer return $connexion; par return $this->pdo;.

Bonjour,

Le problème semble venir du fichier BDD.php où il ne trouve pas la variable "connexion".
Peux-t-on voir ce fichier ?

BDD.php

<?php
namespace Environnement;

use \PDO;

class BDD
{
  private $db_name, $db_host, $db_pass, $db_user, $pdo;

  public function __construct($db_name, $db_host = 'localhost', $db_user = 'root', $db_pass = '') //constructeur pur intialiser
  {
    $this->db_name = $db_name;

    $this->db_host = $db_host;

    $this->db_user = $db_user;

    $this->db_pass = $db_pass;
  }

  public function getPDO() //connexion bdd
  {
    if($this->pdo === null) //si il n'y a pas de connexion
    {

      $connexion = new PDO('mysql:dbname=test_poo;host=localhost', 'root', ''); //connexion bdd

      $connexion ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //gestion d'erreur

      $this->pdo = $connexion;

  }

    return $connexion;
  }

  public function requete($etat, $nom_classe) //methode pour la requete SQL
  {
    $resultats = $this->getPDO()->query($etat); //requête

    $donnees = $resultats->fetchAll(PDO::FETCH_CLASS, $nom_classe); //éxécution résultats

    return $donnees;
  }

  public function prepare($etat, $attribut, $nom_classe, $unarticle = false)
  {
      $resultats = $this->getPDO()->prepare($etat); //requête

      $resultats->execute($attribut);

      $resultats->setFetchMode(PDO::FETCH_CLASS, $nom_classe); //setFetchMode : définit le fetch utilisé

      if($unarticle)
      {
          $donnees = $resultats->fetch(); //un resultat
      }
      else
      {
          $donnees = $resultats->fetchAll(); //les resultats
      }

      return $donnees;
  }
}
 ?>

effectivement, désolé pour le dérangement et merci ^^