Erreur lorsque panier vide

Résolu/Fermé
MatthieuMarty - Modifié le 7 avril 2019 à 14:28
 Utilisateur anonyme - 7 avril 2019 à 14:44
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

MatthieuMarty
7 avril 2019 à 14:28
<?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
MatthieuMarty
7 avril 2019 à 14:29
<?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
Utilisateur anonyme
7 avril 2019 à 14:44
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