Bonjour,
Voila je rencontre un petit problème avec mon code.
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> Editer</a></li>
<li><a href="#"><i class="dropdown-icon fa fa-times text-danger"></i> 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;
}
Je voudrais pouvoir faire fonctionner ma requête.
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 :(
ç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
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.