Bonjour,

je suis actuellement entrain de suivre la formation de POO php et je suis au chapitre refactoring. Mais je suis bloquer car j'ai une erreur que je n'arrive pas du tout à résoudre. PLEASEEEEEE!!!!

voici le code erreur :

Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '?' at line 4 in E:\Serveurs\www\Blog2\core\Database\MysqlDatabase.php:36 Stack trace: #0 E:\Serveurs\www\Blog2\core\Database\MysqlDatabase.php(36): PDO->query('\r\n\t\t\tSELECT art...') #1 E:\Serveurs\www\Blog2\core\Table\Table.php(43): Core\Database\MysqlDatabase->query('\r\n\t\t\tSELECT art...', 'App\Entity\Arti...', false) #2 E:\Serveurs\www\Blog2\app\Table\ArticleTable.php(18): Core\Table\Table->query('\r\n\t\t\tSELECT art...') #3 E:\Serveurs\www\Blog2\pages\articles\home.php(4): App\Table\ArticleTable->getLast() #4 E:\Serveurs\www\Blog2\public\index.php(19): require('E:\Serveurs\www...') #5 {main} thrown in E:\Serveurs\www\Blog2\core\Database\MysqlDatabase.php on line 36

Et mon voici les code de mon fichier MysqlDatabase.php

<?php

namespace Core\Database;
use \PDO;

class MysqlDatabase extends 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 = 'bessino95', $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=blog;host=localhost', 'root', 'bessino95');
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $this->pdo = $pdo;
        }

        return $this->pdo;
    }

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

        $req = $this->getPDO()->query($statement);

        if($class_name === null){
            $req->setFetchMode(PDO::FETCH_OBJ);
        } else {
            //fetch style
            $req->setFetchMode(PDO::FETCH_CLASS, $class_name);
        }

        if($one){
            $datas = $req->fetch();
        } else {
            $datas = $req->fetchAll();
        }

        return $datas;
    }

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

        $req = $this->getPDO()->prepare($statement);
        $req->execute($attributes);
        $req->setFetchMode(PDO::FETCH_CLASS, $class_name);

        if($one){
            $datas = $req->fetch();
        } else {
            $datas = $req->fetchAll();
        }
        return $datas;
    }
}

3 réponses


Bessino
Auteur
Réponse acceptée

Merci Lartak,

j'ai réussi à résoudre mon problème.

:)

Bonjour.
Montres nous plutôt la requête que tu fais, car d'après l'erreur la base de données reçoit quelque chose comme : '\r\n\t\t\tSELECT art...' et à priori c'est lorsque tu fais appel à ta méthode getLast de App\Table\ArticleTable.

Bessino
Auteur

Bonjour et merci Lartak,

voici le code de ma classe ArticleTable, mais je ne vois pas du tout c'est quoi l'erreur de mon code :

<?php

namespace App\Table;

use Core\Table\Table;

class ArticleTable extends Table{

    // permet de récupérer les dernieres articles
    public function getLast(){
        return $this->query("SELECT articles.id, articles.titre, articles.contenu, categories.titre as categorie 
            FROM articles 
            LEFT JOIN categories ON articles.categorie_id = categories.id
            WHERE articles.id = ?
            ");
    }
}