Aldric-L / DiamondCMS

DiamondCMS est un CMS pour les serveurs de jeu. Il est gratuit et open-source.
Other
0 stars 1 forks source link

[BUG] Erreur dans le code #28

Open TheRophil opened 2 years ago

TheRophil commented 2 years ago

Bonjour,

Impossible de finaliser l'installation du cms. Au moment de la configuration de la base de donnée j'ai l'erreur suivante : "Erreur, impossible de se connecter à la BDD. Voici l'erreur levée : Erreur fatale: Exception non-attrapée: "Undefined class constant 'MYSQL_ATTR_INIT_COMMAND'". Levée dans /var/www/html/models/bdd_connexion.php à la ligne 105."

Installation sur un serveur en local pour un test. serveur web :

OS : debian 11

Serveur web : Apache2

Version de php : 7.4.28

Serveur BDD : Apache2

OS : debian 10

BDD : mariadb 15.1

Version de php : 7.3.31

J'ai essayer de regarder ce qui ne va pas mais je ne suis pas développeur et mes compétences s'arrête très vite ^^ Dommage qu'il y ai autant de bug...

Dans l'attente d'un retour de votre part.

Aldric-L commented 2 years ago

Bonjour,

Je vous remercie tout d'abord de l'intérêt que vous portez au projet et je m'excuse vraiment pour les difficultés que vous rencontrez. Je vais faire tout mon possible pour vous aider au plus vite.

Malheureusement, il ne semble pas que cette erreur provienne du code du CMS. J'ai fait une petite recherche auprès des sites spécialisés et il semblerait que ça provienne d'un bug de votre installation de PHP. Je me permets de vous mettre ce lien vers une conversation en anglais dans laquelle plusieurs solutions semblent être proposées : https://stackoverflow.com/questions/2424343/undefined-class-constant-mysql-attr-init-command-with-pdo

Je suis navré des difficultés que vous rencontrez. N'hésitez pas si vous avez des questions ou si je peux vous aider davantage. C'est un peu notre difficulté en tant que concepteurs de CMS : construire quelque-chose qui supporte les problèmes des installations clients contre lesquelles on ne peut pas grand chose... mais pour lesquelles on est tenus responsables !

Je vous souhaite une bonne soirée et un bon courage. Bien cordialement. AL

Aldric-L commented 2 years ago

Bonjour,

Je vous ai répondu hier soir mais votre problème m'a empêché de dormir ! En y réflechissant à deux fois, je pense que ça vient du Driver que vous utilisez. Mais, la bonne nouvelle est que c'est contournable ! Une petite manip à réaliser quand même. Remplacez le contenu de ces deux fichiers :

/models/DiamondCore/db.class.php

<?php
/**
 * DB - Class est une base pour se connecter à une base de données avec PDO
 * @author Aldric.L
 * @copyright Copyright 2016-2017-2020 Aldric L.
 * @access public
 */
class DB {
    protected $bdd_Config = array();

    /**
    * __construct - Constructeur qui veu récuperer les identifiants de la base de données
    * @author Aldric.L, 
    * @copyright 2020 Aldric L.
    * @access public
    * @param array $bdd_infos : array("host" => host, "db" => db, "usr" => Utilisateur, "pwd" => mot de passe, "port" => 3306)
    * @return array
    */
    function __construct($bdd_infos){
        $this->bdd_Config = $bdd_infos;
    }

    /**
    * getConfig - Fonction pour récuperer la config de la BDD
    * @author Aldric.L, 
    * @copyright 2020 Aldric L.
    * @access public
    * @return array
    */
    public function getConfig(){
        return $this->bdd_Config;
    }

  /**
   * getPDO - Fonction pour faire une connexion PDO plus stable
   * Attention, il fortement conseillé d'utiliser cette méthode dans une structure try/catch puisqu'elle crée l'objet PDO.
   * @author Aldric.L 
   * @copyright Copyright 2016-2017-2020 Aldric L.
   * @access public
   * @return PDO|PDOException 
   */
    public function getPDO() {
       static $pdo = null;
       if(is_null($pdo)) {
          $host = $this->bdd_Config['host'];
          $db = $this->bdd_Config['db'];
          $user = $this->bdd_Config['usr'];
          $pwd = $this->bdd_Config['pwd'];
          $port = intval($this->bdd_Config['port']);
          $charset = 'utf8';
          $options = [
             PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // activation des erreurs par exceptions
             PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
          ];
          $dsn = sprintf('mysql:host=%s;port=%s;dbname=%s;charset=%s', $host, $port, $db, $charset);
          $pdo = new PDO($dsn, $user, $pwd, $options);
       }
       return $pdo;
    }

}

/models/bdd_connexion.php

<?php
/**
 * BDD - Class pour se connecter à une base de donnée via PDO
 * @author Aldric.L
 * @copyright Copyright 2016-2017-2020 Aldric L.
 * @access public
 */
//Cette class permet de créer une connexion en PDO
  class BDD extends DB {
    private $forceinstall = false;
    private $noerr = false;

    //On récupère les identifiants pour la BDD (venant d'un fichier)
    function __construct($bdd_file, $noerr=false, $forceinstall=false){
        parent::__construct($bdd_file);
        $this->forceinstall = $forceinstall;
        $this->noerr = $noerr;
    }

   /**
    * changeConfig - Fonction pour modifier la config du serveur (en ce qui concerne le fichier bdd.ini)
    * Attention, cette fonction peut lever des Exceptions. Il faut l'utiliser dans une structure try catch
    *
    * @author Aldric.L, 
    * @copyright 2020 Aldric L.
    * @access public
    * @return bool
    */
    public function changeConfig($host, $db, $usr, $pwd, $port=3306){
        $temp_conf = $this->bdd_Config;
        //On modifie l'array temporaire
        $temp_conf['host'] = $host;
        $temp_conf['db'] = $db;
        $temp_conf['usr'] = $usr;
        $temp_conf['pwd'] = $pwd;
        $temp_conf['port'] = $port;
        $ini = new ini (ROOT . "config/bdd.ini", ';Configuration DiamondCMS - Base de donnees');
        //On lui passe l'array modifié
        $ini->ajouter_array($temp_conf);
        //On écrit en lui demmandant de conserver les groupes
        return $ini->ecrire(true);
    }

  /**
   * getPDO - Fonction pour faire une connexion PDO plus stable
   * Attention : Cette méthode remplace celle de la classe mère (DB)
   * @author Aldric.L 
   * @copyright Copyright 2016-2017 Aldric L.
   * @access public
   * @return PDO
   */
    public function getPDO() {
       static $pdo = null;
       if(is_null($pdo)) {
          $host = $this->bdd_Config['host'];
          $db = $this->bdd_Config['db'];
          $user = $this->bdd_Config['usr'];
          $pwd = $this->bdd_Config['pwd'];
          $port = intval($this->bdd_Config['port']);
          $charset = 'utf8';
          $options = [
             PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // activation des erreurs par exceptions
             PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
          ];
          if ($this->forceinstall){
            $dsn = sprintf('mysql:host=%s;port=%s;charset=%s', $host, $port, $charset);
            $pdo = new PDO($dsn, $user, $pwd, $options);
          }else {
            $dsn = sprintf('mysql:host=%s;port=%s;dbname=%s;charset=%s', $host, $port, $db, $charset);
            try {
              $pdo = new PDO($dsn, $user, $pwd, $options);
            }catch (PDOException $e) {
               if (!$this->noerr){
                  define("EXCEPTION", $e->getMessage());
                  require_once(ROOT . "installation/bdd_urgence.php");
                  die;
               }
            }
          }
       }
       return $pdo;
    }

  /**
   * testPDO - Fonction pour tester la connexion à la base de données
   * @author Aldric.L 
   * @copyright Copyright 2020 Aldric L.
   * @return PDO
   * @access public
   */
  public function testPDO() {
   static $pdo = null;
   if(is_null($pdo)) {
      $host = $this->bdd_Config['host'];
      $db = $this->bdd_Config['db'];
      $user = $this->bdd_Config['usr'];
      $pwd = $this->bdd_Config['pwd'];
      $port = intval($this->bdd_Config['port']);
      $charset = 'utf8';
      $options = [
         PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // activation des erreurs par exceptions
         PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
      ];
      $dsn = sprintf('mysql:host=%s;port=%s;dbname=%s;charset=%s', $host, $port, $db, $charset);
      $pdo = new PDO($dsn, $user, $pwd, $options);
      return $pdo;
   }
}

  }

N’hésitez pas à me tenir informé ! Bien cordialement. AL