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


Lartak
Réponse acceptée

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.

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.

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

}

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];

Je me trompre ou ta pris ça ici :

http://www.developpez.net/forums/d1577931/webmasters-developpement-web/javascript-ajax-typescript-dart/javascript/bibliotheques-frameworks/jquery/incrementation-quantites-panier/

en tous cas ça y ressemble vachement et il est déjà pleins de beug. tu développe depuis quand ?

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

Voila la photo de ma page http://imgur.com/MHZ7fmK

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

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

}

Avez vous skype ?

Ou rejoinez moi sur appear.in/curl

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.

A ok Alors a tu une solutions ? a ceci http://imgur.com/MHZ7fmK

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

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

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.

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)

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

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

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

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

}

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é.

Non toujours la meme erreur