Erreur lorsque panier vide

Résolu
MatthieuMarty -  
 Utilisateur anonyme -
Bonjour,
je débute en PHP je suis un cours en ligne pour apprendre à faire un site e-commerce basique.
Je code actuellement mon panier, cependant lorsqu'il est vide une erreur apparaît:

Warning: PDOStatement::execute(): 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 1 in C:\xampp\htdocs\ppe\classes\Db.php on line 40

Je ne parviens pas à comprendre pourquoi elle survient uniquement lorsque le panier est vide.

Code de la page Panier :

<?php
require 'includes/header.php';
$liste = $panier->getPanier();
$items = implode(',', $liste);

?>
<div class="title_label">Votre panier</div>

<?php
$produits = $DB->query('SELECT * FROM products WHERE id in ('.$items.') ');
?>

<div class="spliter"></div>
<!----------------------------------- TABLEAU RECAPITULATIF DU PANIER ----------------------->
<div class="panier_container">

<!-- Première ligne du tableau -->
<div class="panier_ligne">
<div class="panier_label_1">Produit(s)</div>
<div class="panier_label_2">Prix Unitaire</div>
<div class="panier_label_2">Quantité</div>
<div class="panier_label_2">Prix Total</div>
<div class="panier_label_2">Actions</div>
</div>

<!-- remplissage dynamique des lignes -->
<?php if(empty($_SESSION)): ?>
<div>Panier vide</div>
<?php endif ?>
<?php if(!empty($_SESSION)):?>
<?php foreach ($produits as $produit): ?>
<div class="panier_ligne">
<!-- NOM + IMAGE -->
<div class="panier_label_3">
<div class="lien_panier"><a id="panier" href="produit.php?id=<?php echo $produit->id ?> & qte=<?php echo $produit->qte ?>"><?php echo $produit->name ?></a></div>
<div class="panier_image"><img src="<?php echo $produit->photo ?>"></div>
</div>

<!-- PRIX UNITAIRE -->
<div class="panier_label_4"><?php echo number_format($produit->price,2,',',' '); ?>€</div>

<!-- QUANTITE -->
<div class="panier_label_4"><?php echo $panier->getQte($produit->id); ?></div>

<!-- PRIX TOTAL -->
<div class="panier_label_4"><?php echo number_format($produit->price * $panier->getQte($produit->id),2,',',' '); ?>€</div>

<!-- ==============================================================================================================================================================-->

<!-- ACTIONS -->
<div class="panier_label_4">
<!-- <a id="panier" href="<?php ?>">modifier (en cours)</a>-->
<a id="panier" href="panier.php?delPanier=<?php echo $produit->id; ?>">supprimer</a>
</div>
</div>

<!--===============================================================================================================================================================-->

<?php endforeach ?>
<?php endif?>

<?php var_dump($_SESSION); ?>
</div>
<!----------------------------------------- TOTAL COMMANDE ------------------------------>

<div class="commande_container">
<div class="commande_label">Total Commande :</div>
<div class="commande_total"><?php echo number_format($panier->total(),2,',',' ') ?>€</div>
<div class="valider_commande"><a id="commande"href="">Valider Commande</a></div>
</div>

<?php require 'includes/footer.php'; ?>

3 réponses

  1. MatthieuMarty
     
    <?php
    /**
    • Panier
    • /

    class Panier
    {
    private $DB;

    function __construct($db)
    {
    $this->DB = $db;

    if (!isset($_SESSION))
    {
    session_start();
    }

    if (!isset($_SESSION['panier']))
    {
    $_SESSION['panier'] = array();
    }

    if(isset($_GET['delPanier']))
    {
    $this->del($_GET['delPanier']);
    }

    }

    /* panier */
    function getPanier()
    {
    return array_keys($_SESSION['panier']);
    }

    /* Quantité */
    function getQte($key)
    {
    return $_SESSION['panier'][$key];
    }

    /* Calcul total commande */
    function total()
    {
    $total = 0;
    $liste = $this->getPanier();

    if(empty($liste))
    {
    $produits= array();
    }
    else
    {
    $produits = $this->DB->query('SELECT id,price FROM products WHERE id IN('.implode(',',$liste).')');
    }

    foreach($produits as $produit)
    {
    $total += $produit->price * $_SESSION['panier'][$produit->id];
    }
    return $total;

    }

    function del($key)
    {
    if(isset($_SESSION['panier'][$key]))
    {
    unset($_SESSION['panier'][$key]);
    }
    }

    }
    0
  2. MatthieuMarty
     
    <?php

    /**
    • Gestion de la base de données
    • /

    class Db{

    private $host ='localhost';
    private $name='eshop';
    private $user="root";
    private $pass='';

    private $connexion;

    function __construct($host=null,$name=null,$user=null,$pass=null){

    if($host != null){
    $this->host = $host;
    $this->name = $name;
    $this->user = $user;
    $this->pass = $pass;
    }

    try{

    $this->connexion = new PDO('mysql:host='.$this->host.';dbname='.$this->name,
    $this->user,$this->pass,array(
    PDO::MYSQL_ATTR_INIT_COMMAND =>'SET NAMES UTF8',
    PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING
    ));

    }catch (PDOException $e){
    echo 'Erreur : Impossible de se connecter à la base de données !';die();
    }
    }

    /* requête */
    public function query($sql , $data=array()){
    $req = $this->connexion->prepare($sql);
    $req->execute($data);
    return $req->fetchAll(PDO::FETCH_OBJ);
    }

    public function insert($sql , $data=array()){
    $req = $this->connexion->prepare($sql);
    $req->execute($data);
    }

    }
    0
  3. Utilisateur anonyme
     
    Bonjour

    Regarde ta requête :
    $produits = $DB->query('SELECT * FROM products WHERE id in ('.$items.') ');

    Que devient-elle quand le panier est vide ? Il y a un
    IN()
    , ce qui n'est pas correct. Il faut qu'il y ait quelque chose dans le IN
    Avant d'exécuter la requête, teste $items.
    0