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.

Ce que je fais

$statement = $DB->query('SELECT * FROM items WHERE items.category = ?');

Ce que je veux

Je veux que mes catégories s'affichent comme avant avec les produits qui s'y réfèrent.

Ce que j'obtiens

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

10 réponses


Lartak
Réponse acceptée

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.

kery17
Auteur

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);
}

kery17
Auteur

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);
}  

}
?>

kery17
Auteur

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.

kery17
Auteur

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.

kery17
Auteur

Les $item['image'] correspondent au code d'un autre tuto, et les $item->id proviennent du code de Grafikart.

kery17
Auteur

Bingo ! ça marche ! Effectivement, il faudra que je revois la notion de PDO. Un grand merci à toi pour ta patience ! Bonne soirée !

De rien, merci de même.