Bonsoir,
Pour un site que je développe je dois réaliser un système de panier avec une gestion des commandes (des articles passés et validés dans le panier), ma question serait donc, quel serait le meilleur moyen de stocker et de récupérer mes commandes. Je ne vous cacherais pas que je me suis un tantinet inspiré du tutoriel de grafikart pour réaliser mon système de panier mais je pêche sur la réalisation des commandes.
Ma question est plus d'ordre théorique que technique étant donné qu'actuellement j'essaye de procéder avec un gros tableau $_SESSION'cart'] pour ensuite insérer les articles 1 par 1 dans une table "commandes" à l'aide d'un foreach.
Quelle serait pour vous la meilleure solution/technique ?
Actuellement je procède de cette façon :
addcart.php
$sql = $db->prepare("SELECT *
FROM " . PREFIX . "items
WHERE i_id=:id");
$sql->execute(array(
'id' => intval($_GET'id']),
));
$item = $sql->fetch();
if( empty($item) )
{
setFlash('This item does\'nt exist', 'danger');
header('Location:' . WEBROOT . 'categories');
die();
}
if( isset($_SESSION'cart']$item'i_id']]) )
{
setFlash('This item is already in your basket', 'danger');
header('Location:' . WEBROOT . 'item/' . $item'i_slug']);
die();
}
$panier->add($item'i_id'], $item);
cart.php : au moment de l'insertion dans la db
$panier->secure();
// On récupère les ids des produits du panier client
$ids = array_keys($_SESSION'cart']);
if( empty($ids) )
{
$carts = array();
$s = '';
}
else
{
$sql = $db->query("SELECT i.*, img.img_name
FROM " . PREFIX . "items i
LEFT JOIN " . PREFIX . "images img
ON img.img_id = i.i_image
WHERE i.i_id IN (" . implode(',', $ids) . ")");
$carts = $sql->fetchAll();
$s = ($sql->rowCount() > 1) ? 's' : '';
}
// On crée une ligne pour chaque article
foreach($carts as $cart)
{
// On insère la commande dans la base de donnée
$sql = $db->prepare("INSERT INTO " . PREFIX . " orders SET
o_user_id=:user_id,
o_item_id=:item_id,
o_time=:time,
o_number=:number
o_statut=:statut,
o_total=:total,
o_count=:count");
$array = array(
'user_id' => $_SESSION'Auth']'u_id'],
'item_id' => $_SESSION'cart']$cart'i_id']],
'time' => time(),
'number' => rand(0,999999),
'statut' => STEP1,
'total' => $panier->total(),
'count' => $panier->count(),
);
$sql->execute($array);
}
et enfin la classe panier, notamment la fonction add :
public function add($id, $item)
{
if( $_SESSION'secure'] == FALSE )
{
$_SESSION'cart']$id] = array(
'i_name' => $item'i_name'],
'i_name_fr' => $item'i_name_fr'],
'i_price' => $item'i_price'],
'i_reference' => $item'i_reference'],
'i_image' => $item'i_image'],
);
}
}
Mais j'obtiens cette erreur :/
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 'orders SET o_user_id='1',
o_item_id=NULL, o_time='141393' at line 1
Ce code pourrait éventuellement le faire si jamais $_SESSION'cart']$id] n'était pas nul après un SELECT dans les items... Mais je pense qu'il y a bien plus simple à faire, pour éviter notamment de stocker les informations propres à un article dans les commandes (en cas de modification d'un article par exemple).
Je vous remercie par avance pour vos explications :)