Bonjour,
Voila je rencontre un petit problème avec mon code. J'ai intégré le panier du tuto dans mon site e-commerce. Mais le problème est que j'ai une erreur au niveau de mon index.php. Le req->execute($data); (de la fonction query), entre en conflit avec mon While qui est censé faire un fetch de mes produits.
$statement = $DB->query('SELECT * FROM items WHERE items.category = ?');
Je veux que mes catégories s'affichent comme avant avec les produits qui s'y réfèrent.
Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: no parameters were bound in C:\xampp\htdocs\projets\BEYDA-TEST2\admin\database.php on line 27
Notice: Undefined index: id in C:\xampp\htdocs\projets\BEYDA-TEST2\index.php on line 51.
C'était simplement un exemple que j'avais fait avant de voir les commentaires que tu as posté entre temps, dans ton cas c'est plutôt :
$statement = $DB->query('SELECT * FROM items WHERE items.category = ?', [$category->id]);
Les $item['image'] correspondent au code d'un autre tuto, et les $item->id proviennent du code de Grafikart.
Tu dois faire attention dans ce cas là, car une variable ne peut pas à la fois être de type tableau et de type objet, d'après la fonction query
tu récupères les données sous forme d'objet, il te faut donc utiliser la syntaxe d'objet, soit $item->image
et non $item['image']
.
Bonsoir.
Tu semble confondre une simple requête avec une requête préparée.
Les requêtes faites sur la méthode query
de PDO, n'attendent aucun paramêtre, qu'ils soient nommés ou non, la requête que tu cherches à faire est une requête préparée, mais ça ne se fait pas directement dans la méthode query
, mais dans la méthode prepare
.
Je te conseille donc fortement de revoir les requêtes préparées si tu veux en faire une.
Bonsoir,
En fait dans le tuto Grafikart pour créer un panier, il a créer une fonction query pour pouvoir faire des requêtes plus rapidement :
public function query($sql, $data = array()){
$req =$this->db->prepare($sql);
$req->execute($data);
return $req->fetchAll(PDO::FETCH_OBJ);
}
Ici, le script de Grafikart :
<?php
class DB{
private $host = 'localhost';
private $username = 'root';
private $password = '';
private $database = 'beyda';
private $db;
public function __construct($host = null, $username = null, $password = null, $database = null){
if($host != null){
$this->host = $host;
$this->username = $username;
$this->password = $password;
$this->database = $database;
}
try{
$this->db = new PDO('mysql:host=' .$this->host.';dbname='.$this->database, $this->username, $this->password, array(PDO::MYSQL_ATTR_INIT_COMMAND =>'SET NAMES UTF8', PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
}catch(PDOException $e){
die('<h1>Impossible de se connecter à la base de données</h1>');
}
}
public function query($sql, $data = array()){
$req =$this->db->prepare($sql);
$req->execute($data); CECI EST LA LIGNE 27
return $req->fetchAll(PDO::FETCH_OBJ);
}
}
?>
Ici mon index.php :
<?php
echo '<nav>
<ul class="nav nav-pills">';
$categories = $DB->query('SELECT * FROM categories');
foreach ($categories as $category)
{
if($category->id == '1')
echo '<li role="presentation" class="active"><a href="#'. $category->id . '" data-toggle="tab">' . $category->name . '</a></li>';
else
echo '<li role="presentation"><a href="#'. $category->id . '" data-toggle="tab">' . $category->name . '</a></li>';
}
echo '</ul>
</nav>';
echo '<div class="tab-content">';
foreach ($categories as $category)
{
if($category->id == '1')
echo '<div class="tab-pane active" id="' . $category->id .'">';
else
echo '<div class="tab-pane" id="' . $category->id .'">';
echo '<div class="row">';
$statement = $DB->query('SELECT * FROM items WHERE items.category = ?');
while ($item = $statement)
{
echo '<div class="col-sm-6 col-md-4">
<div class="thumbnail">
<img src="images/' . $item['image'] . '" alt="...">
<div class="price">' . number_format($item['price'], 2, '.', ''). ' €</div>
<div class="caption">
<h4>' . $item['name'] . '</h4>
<p>' . $item['description'] . '</p>';
//<a href="addpanier.php?id=<?= $product->id; ?'>"
if($item['stock']!=0){ ?>
<a href="addpanier.php?id=<?= $item->id; ?>" class="add addPanier btn btn-order" role="button"><span class="glyphicon glyphicon-shopping-cart"></span> Ajouter au panier</a>
<?php }else{
echo'<h5 class="out-of-stock">Stock épuisé !</h5>';
}
echo'</div>
</div>
</div>';
}
echo '</div>
</div>';
}
echo '</div>';
?>
</div>
Tu ne peux pas utiliser la méthode query
sur un while
étant donné que la méthode retourne plusieurs enregistrements et que dans le while
il te les faut un par un.
Sinon il te faut remplacer ton while
par un foreach
.
Par contre, c'est quoi ce mélange d'objet et de tableau dans le code de ton while
?
Un moment tu fais $item['image']
et plus bas tu fais $item->id
.
Merci, je pense que je suis sur la bonne voie. Il m'affiche maintenant cette erreur :
Notice: Undefined index: id in C:\xampp\htdocs\projets\BEYDA-TEST2\index.php on line 51.
Les $item['image'] correspondent au code d'un autre tuto, et les $item->id proviennent du code de Grafikart.
Bingo ! ça marche ! Effectivement, il faudra que je revois la notion de PDO. Un grand merci à toi pour ta patience ! Bonne soirée !