Fatal error: Cannot use object of type panier as array in

Bonjour,

Je suis entrain de créer un site en html et css et j'ai voulu ajouter un panier en PHP et étant débutant en PHP j'ai suivi un tuto sur Grafikart.fr en local avec mamp tout fonctionne très bien mais quand je le mets en ligne ça ne marche plus et j'ai le message d'erreur suivant:

Fatal error: Cannot use object of type panier as array in /home/www/web111/html/construction/fr/panier.class.php on line 50

Fatal error: Exception thrown without a stack frame in Unknown on line 0

Je ne comprend pas pourquoi en local ça marche et pas en ligne.

Voilà le code 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]);
}

}

2 réponses

  1. Salut,

    J'ai l'impression que ça vient de la manière dont tu appelles ta méthode 'add' sur la page qui exploite cette classe, et plus précisément du typage de l'argument que tu lui passes.

    Ce qui correspond à $product_id ne serait pas un entier, mais un objet.

    Si tu veux en avoir le coeur net, fais un var_dump de ce que tu passes en tant que $product_id juste avant d'invoquer ta méthode 'add'.
    0
    1. Salut,

      Je te remercie déjà de ta réponse mais je bloque un peu ^^ j'ai mis un var_dump juste après:
      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];
      Mais ça n'affiche rien. Je ne sais pas si je l'ai mis à la bonne place. Ah oui et j'ai oublier de préciser que j'obtient ce message d'erreur quand je clique sur le bouton ajouter au panier qui me renvoie sur la page "addpanier.php" c'est donc sur la page addpanier.php que j'ai le message d'erreur pour panier.class.php

      Voilà le code de addpanier.php qui peut peut-être être utile:
      <?php
      require '_header.php';
      $json = array('error' => true);
      if(isset($_GET['id'])){
      $product = $DB->query('SELECT id FROM products WHERE id=:id', array('id' => $_GET['id']));
      if(empty($product)){
      $json['message'] = "Ce produit n'existe pas";
      }else{
      $panier->add($product[0]->id);
      $json['error'] = false;
      $json['total'] = number_format($panier->total(),2,',',' ');
      $json['count'] = $panier->count();
      $json['message'] = 'Le produit a bien été ajouté à votre panier';
      }
      }else{
      $json['message'] = "Vous n'avez pas sélectionné de produit à ajouter au panier";
      }
      echo json_encode($json);

      Ce que je ne comprend pas c'est pourquoi ça marche très bien en local...
      Et désolé si je comprend peut être pas encore tout très bien je suis débutant
      0
      1. Ok alors ajoute un var_dump juste avant cette ligne : $panier->add($product[0]->id);

        var_dump($product);

        À mon avis ta requête a échoué, mais le résultat du var_dump nous en dira plus.
        0
      2. Voilà j'ai le message suivant:
        {"error":true,"message":"Vous n'avez pas s\u00e9lectionn\u00e9 de produit \u00e0 ajouter au panier"}
        voilà apparemment c'est comme si je n'avais pas sélectionné de produit
        0
      3. Donc tu es dans ton else, et tu n'appelles pas la méthode add. Ça n'a plus rien à voir avec ton premier post, du coup...
        0
      4. Alors tu n'a d'idée d'où peux venir le problème ?
        0