Page 1 sur 1

Tableau multi dimensionnel et requête SQL

Posté : 02 mars 2020, 12:26
par Mithrandyll
Bonjour à tous,

Je fais face à un problème un peu complexe, je vais essayer d'être le plus clair possible. J'ai une liste de produit qu'un utilisateur peut parcourir pour en ajouter un ou plusieurs dans un panier. Le problème, c'est que l'exercice impose 2 choses : ne pas utiliser de session et faire en sorte que dans la BDD (dans ma table "panier" qui comporte 2 champs : "users_id" et "products"), le produit s'ajoute sur la même ligne, à la suite. En gros, ne pas ajouter une ligne par produit présent dans le panier.

Et la, je bloque complètement. Il faut que je fasse un tableau mutli-dimensionnel qui parcours les produits présent dans le panier, pouvoir en ajouter tout en gardant le même index. Je ne sais pas si je suis assez clair ... Je vous poste ce que j'ai déjà fait, je vous remercie d'avance pour votre aide qui est la bienvenue !

Ma fonction qui vérifie qu'un panier existe et l'ajout d'un produit dedans (qui ne fonctionne pas) :
function AddProductPanier($panier, $product)
{

    if (is_array($panier) && empty($panier)) {


        foreach ($product as $k => $v) {

            array_push($panier, $v);

        }

        array_push($panier, $product);



    } else if (is_array($panier) && !empty($panier)) {



    }
    
    if (isset($panier_exist) && !empty($panier_exist)) {
        $panier = $panier_exist->products;
    } else {
        $panier = [];
    }


}

Ma requête pour l'ajout d'un produit dans le panier :
public function addPanier($users_id, $products){

        $req = $this->pdo->prepare("INSERT INTO panier(users_id, products) VALUES (?, ?)");
        $req->execute([$users_id, $products]);

    }

Et ma fonction pour afficher le panier d'un utilisateur :
// Afficher le panier d'un utilisateur

    public function getUserPanier($users_id){
        $req = $this->pdo->prepare("SELECT * FROM panier WHERE users_id = ?");
        $req->execute([$users_id]);
        $data = $req->fetch();
        return $data;
    }

Voilà, j'espère avoir été assez clair dans mes explications, je suis vraiment bloqué de chez bloqué. Merci d'avance !

Re: Tableau multi dimensionnel et requête SQL

Posté : 02 mars 2020, 16:47
par Mithrandyll
Up du désespoir ...

Re: Tableau multi dimensionnel et requête SQL

Posté : 03 mars 2020, 12:23
par Saian
Bonjour, comment as tu stocké les produits dans la colonne products ? json ? serialize ? autre ? As tu une table des produits ?

Si tu as bien une table des produits avec id et que dans le panier tu stockes les produits disons sous format json d'un tableau indexé sur l'id des produits c'est pas très compliqué.
// déclaré en dur ici pour la compréhension mais théoriquement provenant de la base de données
$productToAdd = (object)[
  'id' => 1,
  'title' => 'Mon produit'
];

$panier = $taClass->getUserPanier($userId);
$products = json_decode($panier->products);// je préfère travailler avec de l'objet donc je considère que $panier en est un

if (array_key_exists($productToAdd->id, $products))
  $products[$productToAdd->id]->quantity++;
else {
  $products[$productToAdd->id] = $productToAdd;
  $products[$productToAdd->id]->quantity = 1;
}

$panier->products = json_encode($products);
// puis mettre à jour le panier en base de données;

C'est juste un exemple à adapter à ta logique et tes préférences. La colonne products pourrait aussi bien être simplement un tableau d'id et de quantité sans les autres informations des produits.

Re: Tableau multi dimensionnel et requête SQL

Posté : 03 mars 2020, 14:49
par Mithrandyll
J'ai réussi à avancer, j'ai utiliser du serialize pour obtenir les données attendues, et cela fonctionne. Mais j'ai une erreur assez étrange :
Parse error: syntax error, unexpected '.', expecting :: (T_PAAMAYIM_NEKUDOTAYIM)

J'ai lu sur internet que cela venait d'un problème de semi colon, quand j'essai de corriger, l'erreur persiste. Voici le code en question :

Code : Tout sélectionner

if(isset($_POST) && !empty($_POST)){ $tab = [$_POST["product_id"]."a" => ["qt" => $_POST["qt"]]]; $post = $_POST; if(existPanier($post, $panier)){ unset($_POST["product_id"]."a", $panier2); $tab2 = array_merge($panier, $tab); }else{ $tab2 = array_merge($panier, $tab); } }
L'erreur se situe sur la ligne $tab2 = array_merge($panier, $tab);

Re: Tableau multi dimensionnel et requête SQL

Posté : 03 mars 2020, 15:27
par @rthur
Tu essaye de concaténer un tableau avec une chaine de caractères, ça ne peut pas marcher.

Re: Tableau multi dimensionnel et requête SQL

Posté : 03 mars 2020, 15:40
par Mithrandyll
J'ai trouvé, je poste la correction, ça peut servir :

Code : Tout sélectionner

$panier = unserialize($ordersModel->getUserPanier($user->id)->products); $products_list = $productModel->findAll(); if(isset($_POST) && !empty($_POST)){ $tab = [$_POST["product_id"]."a" => ["qt" => $_POST["qt"]]]; $post = $_POST; if(existPanier($post, $panier)){ $index = $_POST["product_id"]."a"; unset($panier[$index]); $tab2 = array_merge($panier, $tab); }else{ $tab2 = array_merge($panier, $tab); } } function existPanier($post, $panier) { if(array_key_exists($post["product_id"]."a1", $panier)){ return true; }else{ return false; } return false; }

Re: Tableau multi dimensionnel et requête SQL

Posté : 03 mars 2020, 16:29
par Mithrandyll
J'ai amélioré le code pour qu'il ne renvois plus d'erreur, le voici :
$panier = ( $ordersModel->getUserPanier($user->id) && $ordersModel->getUserPanier($user->id)->products ) ? unserialize($ordersModel->getUserPanier($user->id)->products) : array();


$products_list = $productModel->findAll();

if(isset($_POST) && !empty($_POST)){

    $tab = [$_POST["product_id"]."a" => ["qt" => $_POST["qt"]]];

    $post = $_POST;
    if(existPanier($post, $panier)){
        $index = $_POST["product_id"]."a";
        unset($panier[$index]);
        $tab2 = array_merge($panier, $tab);
        $panier = $ordersModel->addPanier($user->id, existPanier($post,$panier));

    }else{
        $tab2 = array_merge($panier, $tab);
        $panier = $ordersModel->addPanier($user->id, existPanier($post,$panier));

    }


}

function existPanier($post, $panier) {

    if(array_key_exists($post["product_id"]."a1", $panier)){
        return true;
    }else{
        return false;
    }
    return false;
}
Il me reste beaucoup à faire (notamment envoyer les données dans ma base sur la même ligne si l'utilisateur commande plusieurs produits et rendre tout ça à la vue), mais j'ai au moins réussi une partie. Merci pour votre aide =D>

Re: [RESOLU] Tableau multi dimensionnel et requête SQL

Posté : 03 mars 2020, 18:00
par Saian
function existPanier($post, $panier) {
    if (array_key_exists($post["product_id"]."a1", $panier)) {
        return true;
    } else {
        return false;
    }
    return false;
}

// plus simplement
function existPanier($post, $panier) {
  return array_key_exists($post["product_id"]."a1", $panier);
}

// plus correctement
function existPanier($post, $panier) {
  return isset($post["product_id"]) && array_key_exists($post["product_id"]."a1", $panier);
}

Re: [RESOLU] Tableau multi dimensionnel et requête SQL

Posté : 04 mars 2020, 13:35
par Mithrandyll
function existPanier($post, $panier) {
    if (array_key_exists($post["product_id"]."a1", $panier)) {
        return true;
    } else {
        return false;
    }
    return false;
}

// plus simplement
function existPanier($post, $panier) {
  return array_key_exists($post["product_id"]."a1", $panier);
}

// plus correctement
function existPanier($post, $panier) {
  return isset($post["product_id"]) && array_key_exists($post["product_id"]."a1", $panier);
}
Merci beaucoup ! C'est plus propre effectivement !