Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

J'ai une liste d'utilisateur que j'affiche dans un tableau. Lorsque je veux éditer un utilisateur, catastrophe. Plus rien ne marche.
J'ai cette erreur qui me fatigue la vue... et je crie à l'aide :(

// Extrait du tableau


                            <td scope="col">
                                <div class="dropdown pull-xs-right m-l-1">
                                    <button type="button" class="btn btn-xs btn-outline btn-outline-colorless dropdown-toggle" data-toggle="dropdown" aria-expanded="false"><i class="fa fa-cog"></i></button>
                                    <div class="dropdown-menu dropdown-menu-right">
                                        <li><a href="?page=admin.edit&id=<?=$user->id?>"><i class="dropdown-icon fa fa-pencil"></i>&nbsp;&nbsp;Editer</a></li>
                                        <li><a href="#"><i class="dropdown-icon fa fa-times text-danger"></i>&nbsp;&nbsp;Remove</a></li>
                                    </div>
                                </div>
                            </td>

// edit.php

$app = App::getInstance();
$userTable = $app->getTable('user');
$user = $userTable->find($_GET['id']);

// Ma function dans userTable.php

    public function find($id)
    {
        return $this->db->query("SELECT * FROM {$this->table} where matricule=?", [$id], true);
    }

// MysqlDatabase.php

<?php

namespace Core\Database;

use PDO;

class MysqlDatabase extends Database
{

    private $db_name;

    /**
     * @var string
     */
    private $db_user;

    /**
     * @var string
     */
    private $db_pass;

    /**
     * @var string
     */
    private $db_host;

    private $pdo;

    public function __construct($db_name, $db_user = 'root', $db_pass = 'root', $db_host = 'localhost; charset=utf8')
    {
        $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=cms; host=localhost; charset=utf8', 'root', 'root');
            $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 (
            strpos($statement, 'INSERT') === 0||
            strpos($statement, 'UPDATE') === 0||
            strpos($statement, 'DELETE') === 0
        ) {
            return $req;
        }
        if ($class_name === null) {
            $req->setFetchMode(PDO::FETCH_OBJ);
        } else {
            $req->fetchAll(PDO::FETCH_CLASS, $class_name);
        }
        if ($one) {
            $data = $req->fetch();
        } else {
            $data = $req->fetchAll();
        }
        return $data;
    }

    public function prepare($statement, $attributes, $class_name = null, $one = false)
    {
        $req = $this->getPDO()->prepare($statement);
        $res = $req->execute($attributes);
        if (
            strpos($statement, 'INSERT') === 0||
            strpos($statement, 'UPDATE') === 0||
            strpos($statement, 'DELETE') === 0
        ) {
            return $res;
        }
        if ($class_name === null) {
            $req->setFetchMode(PDO::FETCH_OBJ);
        } else {
            $req->setFetchMode(PDO::FETCH_CLASS, $class_name);
        }
        if ($one) {
            $data = $req->fetch();
        } else {
            $data = $req->fetchAll();
        }
        return $data;
    }

Ce que je veux

Je voudrais pouvoir faire fonctionner ma requête.

Ce que j'obtiens

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 MySQL server version for the right syntax to use near '?' at line 1 in C:\www\cms_template\core\Database\MysqlDatabase.php:49 Stack trace: #0 C:\www\cms_template\core\Database\MysqlDatabase.php(49): PDO->query('SELECT FROM u...') #1 C:\www\cms_template\app\Table\UserTable.php(45): Core\Database\MysqlDatabase->query('SELECT FROM u...', Array, true) #2 C:\www\cms_template\pages\admin\editer.php(6): App\Table\UserTable->find('1') #3 C:\www\cms_template\public\admin.php(35): require('C:\www\cms_temp...') #4 {main} thrown in C:\www\cms_template\core\Database\MysqlDatabase.php on line 49 :(

4 réponses


Huggy
Réponse acceptée

ça devrait ressembler à ça

public function find($id)
    {
        return $this->db->prepare("SELECT * FROM {$this->table} where matricule=?", [$id], null, true);
    }

Dans la méthode find, tu utilises query mais comme tu passes en argument une requete avec un joker puis un tableau de paramètres
c'est donc la méthode prepare qu'il faut utiliser à la place de query

Diarill
Auteur

Merci pour ta réponse Huggy. Mais lorsque je change par prépare, je reçois cette erreur:
Erreur irrécupérable : PDOException Uncaught: SQLSTATE [HY000]: Erreur générale: classname doit être une chaîne dans C: \ www \ cms_template \ core \ Base de données \ MysqlDatabase.php: 90 Trace de pile: # 0 C: \ www \ cms_template \ core \ Base de données \ MysqlDatabase.php (90): PDOStatement-> setFetchMode (8, true) # 1 C: \ www \ cms_template \ app \ Table \ UserTable.php (45): Core \ Base de données \ MysqlDatabase-> prepare ('SELECT * FROM u ... ', Array, true) # 2 C: \ www \ cms_template \ pages \ admin \ editer.php (6): App \ Table \ UserTable-> find (' 5502-N ') # 3 C: \ www \ cms_template \ public \ admin.php (35): require ('C: \ www \ cms_temp ...') # 4 {main} lancé dans C: \ www \ cms_template \ core \ Base de données \ MysqlDatabase. php sur la ligne 90.
J'ai essayé de ménager comme je pouvais, mais je ne trouve rien.

Diarill
Auteur

Gratia plena Huggy. Fiat lux. Mea quaestio est certus.