Tableau multi-dimensionnel et requête PHP

Résolu/Fermé
Mithrandyll - 2 mars 2020 à 12:24
Mithrandyll Messages postés 6 Date d'inscription lundi 2 mars 2020 Statut Membre Dernière intervention 3 mars 2020 - 3 mars 2020 à 16:16
Bonjour à tous,

Je fais face à un problème un peu complexe,je suis dessus depuis plusieurs jours et je commence à perdre espoir. J

e 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

- 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 et qui peut 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)

{
$ordersModel = new Orders();


//$panier_exist = $ordersModel->getUserPanier($user->id);

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

debug($panier);
foreach ($product as $k => $v) {
debug($k);
debug($v);
array_push($panier, $v);

}
debug($panier);
array_push($panier, $product);
debug($panier);

//$panier = serialize($panier);
//$ordersModel->addPanier($user->id, $panier);

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

// si le produit existe déjà dans le panier

// alors modifier la valeur
// sinon push le produit dans le tableau

}


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


debug($panier);
}





Ma requête qui ajoute le produit dans le panier en récupérant l'id de l'utilisateur :

   // Ajouter un produit dans un 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 requête qui affiche 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 !
A voir également:

8 réponses

yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
2 mars 2020 à 12:56
bonjour,
est-ce ton premier exercice avec une base de donnés?
je ne comprends pas pourquoi tu prévois d'utiliser un tableau multi-directionnel. où ce tableau est-il utilisé dans ton code?
comment as-tu choisi d’enregistrer plusieurs produits dans le même panier?
quels sont les types des champs dans ta table?
pour que ce soit bien clair, peux-tu nous montrer un exemple de ce que contiendra la table, par exemple avec un utilisateur ayant un produit dans son panier, et un autre ayant deux produits dans son panier.
1
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
2 mars 2020 à 23:34
Bonjour,


Pas forcement avec des virgules,

Si le format de stockage dans la bdd n'est pas une "obligation", dans ce cas tu pourrais t'orienter vers la serialisation de ton array ou la conversion en JSON

Avec ces deux formats, il t'est alors facile de stocker sous forme de chaine un tableau puis de le restituer...

https://www.php.net/manual/fr/function.serialize.php
https://www.php.net/manual/fr/function.json-encode.php

perso, j'ai une nette préférence sur le json.



1
Mithrandyll Messages postés 6 Date d'inscription lundi 2 mars 2020 Statut Membre Dernière intervention 3 mars 2020
2 mars 2020 à 13:27
Merci pour ta réponse,

Alors non ça n'est pas mon premier exercice avec une BDD

En fait le tableau me servira à parcourir les différents produits d'un utilisateur. Je pensais enregistrer ses choix en base de données justement avec le tableau. Je te poste un screen de la base pour que ce soit plus clair, avec un exemple :



Le champ "products" est de type text, les produits que l'utilisateur ajoutera seront donc à la suite, sur une seule ligne (cf "product A etc").

Pour le moment mon tableau n'est utilisé nul part, je n'arrive pas à le mettre en forme avec ce que je veux. Voici le code contenant mes vues :

La liste des produits :

<div class="card">
<div class="card-body" id="order">
<div class="col-sm-12">
<div class="row">

<!-- Je recupère mes produits présent en BDD et je boucle pour les rendre à la vue-->
<?php foreach ($products_list as $product): ?>


<div class="card" style="width: 18rem; margin-top: 25px; margin-right: 25px">
<img src="..." class="card-img-top" alt="...">
<div class="card-body">
<form method="post" >
<h5 class="card-title"><?= $product->nom ?></h5>
<input name="product_id" value="<?= $product->id; ?>" hidden>
<input class="form-control" name="qt" style=" width: auto; margin-bottom: 10px" type="number" placeholder="quantité :">
<button type="submit" class="btn btn-info" name="product_add_<?= $product->id; ?>"><i class="fas fa-shopping-cart"></i> Ajouter au panier</button>
</form>

</div>
</div>
<?php endforeach; ?>
</div>
</div>
</div>
</div>



La page de panier ou sont censés aller les produits ajoutés au panier :

    <div class="col-lg-12 col-md-12 col-sm-12">
<div class="card mb-3">
<div class="card-body">
<div class="card-title">
<div class="border-bottom pt-3 pb-2 mb-3">
<h1 class="h2 d-inline">Votre panier</h1>
</div>
</div>
<div class="table-responsive-md">
<table class="table table-striped table-bordered table-hover">
<thead class="thead-dark">

<tr>
<th class="w-25">Produit</th>
<th class="w-25">Quantité </th>
<th class="w-25">Action</th>
</tr>
</thead>
<tbody>
<?php foreach ($panier as $k => $v):
$produit = $productModel->read($k);

?>

<tr>
<th><?= $produit->nom; ?></th>
<th><?= $v["product_qt"]; ?></th>
<th></th>
</tr>



</tbody>
<?php endforeach; ?>
</table>

</div>
</div>
</div>
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
2 mars 2020 à 14:10
tu as donc choisi, quand tu as plusieurs produits dans le panier, de les enregistrer dans la base de données en utilisant la virgule comme séparateur.
réfléchissons d'abord à l'ajout d'un produit dans le panier. quels sont les différents cas possibles? qu'en penses-tu?
0
Mithrandyll Messages postés 6 Date d'inscription lundi 2 mars 2020 Statut Membre Dernière intervention 3 mars 2020
2 mars 2020 à 14:17
Pas forcement avec des virgules, tant que cela s'ajoute à la suite, mais je pense que c'est le plus optimal en effet.

Alors, sur la page de la liste des produits disponible, l'utilisateur ajoute le(s) produit(s) de son choix au panier et précise la quantité.
Au niveau du code, quand l'utilisateur arrive sur cette page, on vérifie si un panier existe, sinon on en crée un (vide) qui se remplira au fur et à mesure.
Une fois cela fait, l'utilisateur clique sur "voir mon panier" ou il retrouvera un récap de ses comanndes.

Sur cette page, il pourra modifier la quantité d'un produit qu'il a commandé, ou le supprimer.
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
2 mars 2020 à 14:22
comment as-tu prévu d'enregistrer dans la base de données les quantités commandées de chaque produit?
maintenant que c'est clair, je suppose que plus rien ne t’empêche de continuer à travailler sur la solution de ton exercice.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Mithrandyll Messages postés 6 Date d'inscription lundi 2 mars 2020 Statut Membre Dernière intervention 3 mars 2020
2 mars 2020 à 14:26
Via un tableau, je pensais enregistrer toute les valeurs et les passer dans la table en parcourant le tableau, mais je n'y arrive pas du tout malheureusement.
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
2 mars 2020 à 19:06
montre-nous ce que tu as essayé, tu ne progresseras pas si nous faisons ton exercice à ta place.
comme c'est tout de même un travail assez important, je suggère que tu le fasses en deux étapes:
- d'abord tout faire fonctionner avec maximum un produit par panier
- ensuite, quand tout cela fonctionnera bien, adapter pour pouvoir avoir plusieurs produits
0
Mithrandyll Messages postés 6 Date d'inscription lundi 2 mars 2020 Statut Membre Dernière intervention 3 mars 2020
3 mars 2020 à 09:08
Oui c'est ce que je vais faire, je vais convertir tout ça en JSON, je pense que je vais beaucoup moins me compliquer la vie. Merci de vos réponses, je vous dirais si j'ai réussi !
0
Mithrandyll Messages postés 6 Date d'inscription lundi 2 mars 2020 Statut Membre Dernière intervention 3 mars 2020
3 mars 2020 à 11:16
Bon, j'ai réussi à avoir les données que je voulais ! Voici le code :

$panier = unserialize($ordersModel->getUserPanier($user->id)->products);

$products_list = $productModel->findAll();

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

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

if(array_key_exists($_POST["product_id"]."a", $panier)){
echo "OUI";

}else{
echo "NON";

}

$tab2 = array_merge($panier, $tab);

}


Maintenant, il faut que j'arrive à automatiser tout ça dans une fonction, c'est le nouveau point de blocage, mais ça avance !
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
3 mars 2020 à 12:03
Déjà,
merci de bien vouloir utiliser correctement les BALISES DE CODE lorsque tu postes du code dans le forum.
Pour ça... il faut y indiquer le langage ( ici PHP ) afin que nous ayons la coloration syntaxique et l'indentation.
Explications disponibles ici ( à lire complètement ! ) : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code



Ensuite... tu nous dis que tu vas partir sur du json... et finalement tu pars sur du Serialize ...
Tu changes d'avis comme de chemises...
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
3 mars 2020 à 12:05
Quelques remarques également sur ton code

Si une variable est !empty ... c'est qu'elle est set ....
Donc le isset ne sert à rien !

Je t'invite à lire et a appliquer les conseils donnés ici :
https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code

et vu que tu fais du PDO.. d'appliquer également ce qui est marqué ici :
https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs
0
Mithrandyll Messages postés 6 Date d'inscription lundi 2 mars 2020 Statut Membre Dernière intervention 3 mars 2020
3 mars 2020 à 16:16
J'ai bien avancé dans mon code que 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);

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


Et non je ne change pas d'avis comme de chemise, je test plusieurs choses jusqu'à trouver une solution, or en JSON cela ne fonctionnait pas, j'ai donc opté pour du serialize qui à mieux fonctionné au final.

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, je n'en abuserai pas plus longtemps.
0