Connexion base de donnée mysql avec php en orienté objet

Fermé
Programming_018 Messages postés 106 Date d'inscription vendredi 13 janvier 2017 Statut Membre Dernière intervention 14 mars 2024 - Modifié le 9 nov. 2022 à 15:44
yg_be Messages postés 22731 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 avril 2024 - 10 nov. 2022 à 18:35

Bonjour,

Je me permet de poster mon petit problème que je ne comprend pas d'où cela peut provenir.

J'ai mon site internet qui ne veut pas se connecter à ma base de données pourtant de mon point de vue j'ai l'impression que tout est bien codé.
 

Je vous joins mon code et l'erreur.

L 'erreur est : Fatal error: Uncaught Error: Call to a member function prepare() on null in C:\Users\Gaetan GIBERT\Desktop\atelier-isabelle-main\Model\Manager\CategoryManager.php:18 Stack trace: #0 C:\Users\prog\Desktop\atelier-main\View\visitor\shop\category.view.php(7): Model\Manager\CategoryManager->getCategories() #1 C:\Users\prog\Desktop\atelier-main\Controller\Feature\RenderViewFeature.php(12): require_once('C:\\Users\\prog...') #2 C:\Users\prog\Desktop\atelier-main\Controller\ShopController.php(11): Controller\ShopController->render('shop/category', Array) #3 C:\Users\prog\Desktop\atelier-main\index.php(150): Controller\ShopController->showShop() #4 {main} thrown in C:\Users\prog\Desktop\atelier-main\Model\Manager\CategoryManager.php on line 18

Alors je sais que ce message stipule que cela renvoie null dans le prepare mais ce que je comprend pas c'est que sur d'autres PC et d'autres projet exactement le même code fonctionne d'après mes déductions que je pense c'est que la connexion à ma base de données chez Hostinger ne s'alimente pas. Ce qui me retourne une valeur nulle.

Voici mon code :

<?php
namespace Model;

use Model\Manager\Feature\ManagerFeature;
use PDO;
use PDOException;

class ConnectBDD{
    private string $host = "host";
    private string $database = "database_name";
    private string $userDataBase = "user";
    private string $passwordDataBase = "pass";

    private static ?PDO $db = null;

    public function __construct()
    {
        try {
            self::$db = new PDO("mysql:host=$this->host;dbname=$this->database;charset=utf8", $this->userDataBase, $this->passwordDataBase);
            self::$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            self::$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
            return self::$db;
        }catch (PDOException $exception){
            return $exception->getMessage();
        }
    }

    public static function instance(): ?PDO{
        if(is_null(self::$db)){
            new self();
        }
        return self::$db;
    }

    public function __notDuplicate(){}
}

Est-ce que quelqu'un aurait une solution svp ?
Windows / Chrome 107.0.0.0

A voir également:

1 réponse

jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
9 nov. 2022 à 17:03

Bonjour,

Le message d'erreur 

C:\Users\prog\Desktop\atelier-main\Model\Manager\CategoryManager.php on line 18

Indique le nom du fichier et la ligne concernée...

Il serait donc bien de nous montrer le fichier CategoryManager pour voir comment tu l'as codé...


0
Programming_018 Messages postés 106 Date d'inscription vendredi 13 janvier 2017 Statut Membre Dernière intervention 14 mars 2024 7
Modifié le 10 nov. 2022 à 09:45

Bonjour jordane45, merci de ton aide, oui effectivement j'ai zappé de mettre le code.

Voici mon code de CategoryManager.

<?php

namespace Model\Manager;

use Model\Manager\Feature\ManagerFeature;
use Model\Entity\Category;

class CategoryManager
{
    use ManagerFeature;

    /**
     * Get all categories
     * @return array
     */
    public function getCategories(): array
    {
        $request = $this->db->prepare("SELECT id, name FROM category ORDER BY name");
        $request->execute();
        return $request->fetchAll();
    }

    /**
     * Get category with name
     * @param $name
     * @return array|bool
     */
    public function getCategory($name)
    {
        $request = $this->db->prepare("SELECT id, name FROM category WHERE name = :name");
        $request->bindValue(":name", $name);
        $request->execute();
        return $request->fetch();

    }

    /**
     * Add a category
     * @param $name
     * @return bool
     */
    public function addCategory($name): bool
    {
        if(array($this->getCategory($name))){
            header("Location: index.php?642=admin642atelier&message=La catégorie existe déjà&color=red");
        }
        $category = new Category($name);
        $request = $this->db->prepare("INSERT INTO category (name) VALUES (:name)");
        $request->bindValue(":name", $category->getName());
        return $request->execute();
    }

    /**
     * Modify category
     * @param $oldName
     * @param $name
     * @return bool
     */
    public function modifyCategory($oldName, $name): bool
    {
        if(!$this->getCategory($oldName)){
            header("Location: index.php?642=admin642atelier&message=La catégorie n'a pas été trouvé&color=red");
            exit();
        }

        if(array($this->getCategory($name))){
            header("Location: index.php?642=admin642atelier&message=La catégorie existe déjà&color=red");
        }
        $category = new Category($name);
        $request = $this->db->prepare("UPDATE category SET name = :name WHERE name = :oldName");
        $request->bindValue(":name", $category->getName());
        $request->bindValue(":oldName", $oldName);
        return $request->execute();
    }

    /**
     * Delete category
     * @param $name
     * @return bool
     */
    public function deleteCategory($name): bool
    {
        if(!$this->getCategory($name)){
            header("Location: index.php?642=admin642atelier&message=La catégorie n'a pas été trouvé&color=red");
            exit();
        }
        $category = new Category($name);
        $request = $this->db->prepare("DELETE FROM category WHERE name = :name");
        $request->bindValue(":name", $category->getName());
        return $request->execute();
    }
}

La ligne 18 c'est :

$request = $this->db->prepare("SELECT id, name FROM category ORDER BY name");

Par contre cela me fait le même problème sur la page de connexion, inscription et toute les pages qui appelle la classe connectBDD.

J'ai tenté sur l'ordinateur de chez moi tout fonctionne parfaitement. Mais pas sur mon ordi du boulot.
Je précise que la base de donnée est sur Hostinger avec un accès à tous et pas qu'à une simple adresse IP.

0
yg_be Messages postés 22731 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 avril 2024 1 477 > Programming_018 Messages postés 106 Date d'inscription vendredi 13 janvier 2017 Statut Membre Dernière intervention 14 mars 2024
Modifié le 10 nov. 2022 à 09:38

Le message d'erreur "Call to a member function prepare() on null" t'indique, en effet, que $this->db est vide.

0
Programming_018 Messages postés 106 Date d'inscription vendredi 13 janvier 2017 Statut Membre Dernière intervention 14 mars 2024 7 > yg_be Messages postés 22731 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 avril 2024
10 nov. 2022 à 09:44

Bonjour yg_be, merci de ton aide.

ça je comprend bien j'ai regardé déjà plusieurs tuto mais ce que je voudrais savoir c'est comment savoir si la connexion à la bdd fonctionne car là j'ai exactement le même code qui fonctionne sur le PC perso mais pas sur le PC pro.

Mon pc perso tout fonctionne super bien (et je précise tout est exactement pareil niveau code)

Mon pc du boulot me fait cette fameuse erreur

Ma base de donnée elle est héberger sur hostinger et est partagé sur tout le monde. Le mot de passe l'user et la database sont correct j'ai fait des copiers coller pour être sur que les deux soit bon.

Sauf que là cela me fait une erreur sur internet cela dit de partout que c'est car cela renvoie du contenu vide d'accord mais pourquoi cela fonctionné encore il y a quelques jours et là plus rien sur mon pc boulot avec n'importe quel de mes projets qui ont une base de données.

Comme si l'ordinateur du travail me bloqué l'accès à la BDD alors que j'arrive à aller sur phpmyadmin.

0
yg_be Messages postés 22731 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 avril 2024 1 477 > Programming_018 Messages postés 106 Date d'inscription vendredi 13 janvier 2017 Statut Membre Dernière intervention 14 mars 2024
10 nov. 2022 à 10:01

Tu fais tourner le code PHP sur ton PC du travail, plutôt que sur le serveur hébergé?

Peut-être, en effet, que le PC du travail, ou le réseau au travail, ne te permet pas de te connecter via la porte 3306 à la base de données.  

Quand tu utilises phpmyadmin, je suppose que tu as un navigateur qui se connecte à ton serveur web, pas à la base de données.

0
Programming_018 Messages postés 106 Date d'inscription vendredi 13 janvier 2017 Statut Membre Dernière intervention 14 mars 2024 7 > yg_be Messages postés 22731 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 avril 2024
10 nov. 2022 à 10:10

Han d'accord oui ça peut être ça effectivement et serais-tu comment faire pour voir si j'ai accès au port 3306 stp ? Et comment l'activer si je n'ai pas d'accès. Merci en tout cas de tes réponses.

0