Problème Créer un panier

Par fabricedu57, il y a 9 ans


Bonjour,

Warning: PDOStatement::execute(): SQLSTATE[42S22]: Column not found: 1054 Champ '$product_id' inconnu dans where clause in

ce code suivant commence a la ligne 21 et ce termines a la ligne 32

    if (isset($_POST['panier']['quantity'])) {
        $this->recalc();
    }
}

public function recalc(){
    foreach ($_SESSION['panier'] as $product_id => $quantity) {
        if (isset($_POST['panier']['quantity'][$product_id])) {
            $_SESSION['panier'][$product_id] = $_POST['panier']['quantity']['$product_id'];
        }
    }
} 

et donc voici tous le code d'erreur
Warning: PDOStatement::execute(): SQLSTATE[42S22]: Column not found: 1054 Champ '$product_id' inconnu dans where clause in D:\wamp\www\fabtech\db.class.php on line 31

23 réponses

neecride, il y a 9 ans

Voila l'erreur je pense :

$_SESSION['panier'][$product_id] = $_POST['panier']['quantity']['$product_id'];

il faudrai voir tout le code et la requète ton $product_id n'existe pas selon le message on ne met pas de $ dans une méthode post donc fait comme ceci $_POST['product_id'] si c'est le nom de ton champ.

fabricedu57, il y a 9 ans

Voilà tous le fichier de panier.class.php

<?php
class panier{

private $DB;

public function __construct($DB){
    if (!isset($_SESSION)) {
        session_start();
    }
    if (!isset($_SESSION['panier'])) {
        $_SESSION['panier'] = array();
    }
    $this->DB = $DB;

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

    if (isset($_POST['panier']['quantity'])) {
        $this->recalc();
    }
}

public function recalc(){
    foreach ($_SESSION['panier'] as $product_id => $quantity) {
        if (isset($_POST['panier']['quantity'][$product_id])) {
            $_SESSION['panier'][$product_id] = $_POST['panier']['quantity']['$product_id'];
        }
    }
} 

public function count(){
    return array_sum($_SESSION['panier']);
}

public function total(){
    $total = 0;
    $ids = array_keys($_SESSION['panier']);
        if (empty($ids)) {
            $products = array();
        }else{
            $products = $this->DB->query('SELECT id, price FROM products WHERE id IN ('.implode(',',$ids).')');
    }       
    foreach ( $products as $product) {
        $total += $product->price * $_SESSION['panier'][$product->id];

    }
    return $total;
}

public function add($product_id){
    if (isset($_SESSION['panier'][$product_id])) {
        $_SESSION['panier'][$product_id]++;
    }else{
        $_SESSION['panier'][$product_id] = 1;
    }
}

public function del($product_id){
    unset($_SESSION['panier'][$product_id]);
}

}

AlexJM, il y a 9 ans

En recopiant, tu as mis des ' ou il n'en fallait pas :
change

$_SESSION['panier'][$product_id] = $_POST['panier']['quantity']['$product_id'];

en

$_SESSION['panier'][$product_id] = $_POST['panier']['quantity'][$product_id];
fabricedu57, il y a 9 ans

Neecride Non

et AlexJM il y a toujours cette erreur

Warning: PDOStatement::execute(): SQLSTATE[42S22]: Column not found: 1054 Champ '$product_id' inconnu dans where clause in D:\wamp\www\fabtech\db.class.php on line 31

neecride, il y a 9 ans

Il te manque une colone comme indiquer "collumn not found" ou elle est mal nommé c'est le $product_id qui coince

fabricedu57, il y a 9 ans

voici ma mon fichier ou il y a les requête :

<?php

class DB{

private $host = "localhost";
private $username = "root";
private $password = "";
private $database = "*****";
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 ce connecter a la base de donnee<h1>');
    }

}

public function query($sql, $data = array()){
    $req =$this->db->prepare($sql);
    $req->execute($data);
    return $req->fetchAll(PDO::FETCH_OBJ);
}

}

fabricedu57, il y a 9 ans

Avez vous skype ?

fabricedu57, il y a 9 ans

Ou rejoinez moi sur appear.in/curl

Lartak, il y a 9 ans

Bonsoir.

Avez vous skype ?
Ou rejoinez moi sur https://join.me/858-658-137

Nous ne faisons qu'apporter notre aide pour aider à résoudre des problème, personne n'est à la disposition de qui que ce soit.
Arrêtez de nous demander de vous aider via Skype ou un autre moyen de communication, le forum à pour objectif de demander de l'aide/d'apporter son aide en y renseignant des pistes ou des solutions de manière à ce qui si quelqu'un d'autre à le même problème ou du même genre, qu'il puisse trouver la réponse à son problème sans avoir obligatoirement à créer un autre sujet, ce qui ne sera pas le cas si nous devions répondre via Skype ou autre.

neecride, il y a 9 ans

Commence par donner ce qui bloque et donc ta ligne 31 mai comme dit plus haut tous vient de $product_id

fabricedu57, il y a 9 ans

LE probleme est apparrue quand j'ai ajouter ceci

if (isset($_POST['panier']['quantity'])) {
$this->recalc();
}
}

public function recalc(){
    foreach ($_SESSION['panier'] as $product_id => $quantity) {
        if (isset($_POST['panier']['quantity'][$product_id])) {
            $_SESSION['panier'][$product_id] = $_POST['panier']['quantity'][$product_id];
        }
    }
} 
Lartak, il y a 9 ans

Tu as peut-être corrigé ton code, mais dans les données de session, tu as toujours le '$product_id' au lieu de la valeur, du coup à chaque appel de la requête SQL, il te retourne l'erreur.
Vides donc bien la session et testes à nouveau.
Si tu fais par exemple un var_dumpde $_SESSION['panier'], tu devrais le voir.

fabricedu57, il y a 9 ans

Quand je fais le var dump voila ce qu'il m'affiche

array (size=5)
0 => string '10' (length=2)
1 => int 22
2 => string '3' (length=1)
3 => int 1
'$product_id' => string '3' (length=1)

Lartak, il y a 9 ans

Regardes tout simplement le dernier, il a bien $product_id, donc vides la session et retentes.

fabricedu57, il y a 9 ans

je mis connais pas trop pourrais tu me dire ou la mettre exactement

Lartak, il y a 9 ans

Heu ....
Je ne t'ai pas dit de lui demander de déménager, tu peux par exemple faire :

$_SESSION['panier'] = [];

De cette manière, le tableau de la session avec l'index panier sera vide.
Ou alors tu supprimes seulement le dernier, celui qui pose problème :

unset($_SESSION['panier'][3]);
fabricedu57, il y a 9 ans

ne ce que je veux dire c'est le mettre ou a quel ligne

<?php
class panier{

private $DB;

public function __construct($DB){
    if (!isset($_SESSION)) {
        session_start();
    }
    if (!isset($_SESSION['panier'])) {
        $_SESSION['panier'] = array();
    }
    $this->DB = $DB;

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

    if (isset($_POST['panier']['quantity'])) {
        $this->recalc();
    }

}

public function recalc(){
    foreach ($_SESSION['panier'] as $product_id => $quantity) {
        if (isset($_POST['panier']['quantity'][$product_id])) {
            $_SESSION['panier'][$product_id] = $_POST['panier']['quantity'][$product_id];
        }
    }

} 

public function count(){
    return array_sum($_SESSION['panier']);
}

public function total(){
    $total = 0;
    $ids = array_keys($_SESSION['panier']);
        if (empty($ids)) {
            $products = array();
        }else{
            $products = $this->DB->query('SELECT id, price FROM products WHERE id IN ('.implode(',',$ids).')');
    }       
    foreach ( $products as $product) {
        $total += $product->price * $_SESSION['panier'][$product->id];

    }
    return $total;
}

public function add($product_id){
    if (isset($_SESSION['panier'][$product_id])) {
        $_SESSION['panier'][$product_id]++;
    }else{
        $_SESSION['panier'][$product_id] = 1;
    }
}

public function del($product_id){
    unset($_SESSION['panier'][$product_id]);
}

}

Lartak, il y a 9 ans

C'est une action temporaire, tu n'as pas besoin de l'intégrer dans ton code, il te suffit par exemple de créer un nouveau fichier PHP, que tu peux nommer delete.php par exemple et dedans tu y met :

<?php session_start(); unset($_SESSION['panier'][3]);

Ensuite tu te rends à cette page (une seule fois suffit), ensuite tu reviens sur ta page d'accueil et ça devrait être réglé.

fabricedu57, il y a 9 ans

Non toujours la meme erreur

Lartak, il y a 9 ans

Non toujours la meme erreur

Est-ce que c'était le seul enregistrement de la session à avoir comme valeur la variable ?
Car dans le code que tu as montré, le var_dump indiquait 5 éléments, mais tu ne nous en a montré que 4, donc si ça se trouve le n°4 (le dernier) est pareil que le numéro 3.
Fait à nouveau le var_dump sur $_SESSION['panier']et montre nous le résultat.