Bonjour,

Je travaille à partir de la formation "La POO en PHP".
J'ai la nécessité, de pouvoir créer / modifier / supprimer directement des tables dans ma base de données.

Pour le moment, je commence à faire un code simple pour ensuite ajouter des options.

Du coup, dans la class Database j'ai :

<?php
use \PDO;

class Database
{
    private $db_name;
    private $db_user;
    private $db_pass;
    private $db_host;
    private $pdo;

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

    private function getPDO() {
        if ($this->pdo===null) {
            $pdo = new PDO('mysql:dbname=mypralinepoo;host=localhost', 'root', '');
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $this->pdo=$pdo;
        }
        return $this->pdo;
    }

    public function query($statement, $class_name = null, $one = false) {...}

    public function prepare($statement, $attributes, $class_name = null, $one = false) {...}

    public function lastInsertId() {...}
}

Pour pouvoir lancer mes requêtes de création de table j'ai ajouté la fonction exec()

    public function exec($statement)
    {
        return $this->getPDO()->exec($statement);
    }

Dans la class Table on retrouve les fonctions créées pendant la formation :

<?php
class Table
{
    protected $table;
    protected $db;

    public function __construct(Database $db)
    {
        $this->db = $db;
    }

    public function all() {...}

    public function find($id) {...}

    public function update($id, $fields) {...}

    public function delete($id) {...}

    public function create($fields) {...}

    public function extract($key, $value) {...}

    public function query($statement, $attributes = null, $one=false) {...}
}

J'ajoute à cette classe la fonction newtable() permettant de créer mes tables :

    public function newtable($statement)
    {
        return $this->db->exec($statement);
    }

J'ai la class qui contient les requêtes scpécifiques à mon controller (vide pour le moment) :

class RotTable extends Table
{

}

Et enfin mon controller qui contient le contenu de la requête afin de générer ma nouvelle table :

<?php
class CronController extends AppController
{
  public function __construct()
    {
        parent::__construct();
        $this->loadModel('Rot');
    }

    public function index()
    {
        $statement = "CREATE TABLE `myp_rot_tmp` (
                                                `First` CHAR(4) NOT NULL ,
                                                `Transport` VARCHAR(8) NOT NULL ,
                                                `Voiture` VARCHAR(10) NOT NULL)
                        ENGINE = MyISAM CHARACTER SET utf8 COLLATE utf8_general_ci";

        $req=$this->Cron->newtable($statement);
        if($req)
        {
            var_dump('Table créée.');
        }
    }
}

J'ai un message d'erreur quand je lance ma page :

( ! ) Catchable fatal error: Argument 1 passed to MyPraline\Tables\Table::__construct() must be an instance of MyPraline\Tables\Database, instance of MyPraline\Database\Database given, called in C:\wamp64\www\MyPralineMVC\app\App.php on line 37 and defined in C:\wamp64\www\MyPralineMVC\app\Tables\Table.php on line 9
Call Stack

Time Memory Function Location

1 0.0007 241328 {main}( ) ...\index.php:0
2 0.0014 257408 App::load( ) ...\index.php:8
3 0.0027 282960 MyPraline\Router\Router->construct( ) ...\App.php:30
4 0.0044 312776 MyPraline\controllers\CronController->
construct( ) ...\Router.php:21
5 0.0062 364488 MyPraline\controllers\AppController->loadModel( ) ...\CronController.php:13
6 0.0062 364528 App->getTable( ) ...\AppController.php:38
7 0.0070 400840 MyPraline\Tables\Table->__construct( ) ...\App.php:37

La ligne 37 de class App correspond :

    public function getTable($name)
    {
        $class_name = '\\MyPraline\\Tables\\'.ucfirst($name).'Table';
        return new $class_name($this->getDb());
    }

Si quelqu'un peut m'aiguiller dans le déplantage je suis preneur...

5 réponses


PLJerem
Auteur
Réponse acceptée

Je viens de trouver !!!

J'ai une ligne de code que j'ai fait sauter je ne sais pas comment, dans ma class "Table" j'ai supprimé par erreur le :

use Database;

Une fois corrigé mon codre refonctionne et ressemble :

<?php
use Database;

class Table
{
    protected $table;
    protected $db;

    public function __construct(Database $db)
    {
        $this->db = $db;
    }

    public function all() {...}

    public function find($id) {...}

    public function update($id, $fields) {...}

    public function delete($id) {...}

    public function create($fields) {...}

    public function extract($key, $value) {...}

    public function query($statement, $attributes = null, $one=false) {...}
}

Merci pour votre aide !!!

Salut,

en regardant ton code de ta ligne 37, il me semble que ta variable suivante n'est pas déclaré ou alors tu t'ai trompé sur son nom :

$this->getDb()

je me trompe peut être car y a peut être pas toute ton code source.

Mais ta fonction getTable est bizarre je trouve, j'ai pas suivi cette formation.

PLJerem
Auteur

En effet, j'ai enlevé les parties qui je pense ne sont pas en cause.

La fonction getTable permet de charger un class qui comprend les "structures" de requêtes SQL que je peux être amenées à utiliser partout sur le site.

Dans la class App tu as aussi ce morceau de code qui permet d'instancier la classe Database que j'ai indiqué ci-dessus :

    public function getDb()
    {
        $config = Config::getInstance(ROOT.'/config/config.php');
        if (is_null($this->db_instance))
        {
            $this->db_instance = new Database($config->get('db_name'), $config->get('db_user'), $config->get('db_pass'), $config->get('db_host'));
        }
        return $this->db_instance;
    }

dans ta class Table, ta pas un soucis avec ton constructeur :

    public function __construct(Database $db)
    {
        $this->db = $db;
    }

C'est quoi se Database ? si tu l'enlève sa donne quoi ? il as instancié plusieurs fois Database c'est peut être sa ton problème

Salut,

montre nous les codes qui correspondent au message d'erreur,
en commantant pour préciser le nom du fichier, et la ligne :

1)
MyPraline\Tables\Table->__construct( ) ...\App.php:37

// app.php
public function getTable($name)
{
    $class_name = '\\MyPraline\\Tables\\'.ucfirst($name).'Table';
    return new $class_name($this->getDb());  // ligne 37 ?
}

2)
App->getTable( ) ...\AppController.php:38
On veut voir la fonction getTable en entière, et dans quel fichier elle est écrite,
et aussi la ligne 38 de AppController.php

3)
MyPraline\controllers\AppController->loadModel( ) ...\CronController.php:13
On veut voir la fonction loadModel en entière, et dans quel fichier elle est écrite,
et aussi la ligne 13 de CronController.php

4)
Pourquoi est-ce qu'on voit "loadModel()", ET "getTable()" ?

La fonction getTable permet de charger un class qui comprend les "structures" de requêtes SQL que je peux être amenées à utiliser partout sur le site.

Alors que fait la fonction "loadModel()" ?
J'ai l'impression que ce sont les même fonctions.