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
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
A voir également:
- Tableau multi-dimensionnel et requête PHP
- Tableau croisé dynamique - Guide
- Tableau ascii - Guide
- Tableau word - Guide
- Trier tableau excel - Guide
- Easy php - Télécharger - Divers Web & Internet
8 réponses
yg_be
Messages postés
23449
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 janvier 2025
Ambassadeur
1 564
2 mars 2020 à 12:56
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.
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.
jordane45
Messages postés
38397
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
29 janvier 2025
4 732
2 mars 2020 à 23:34
2 mars 2020 à 23:34
Bonjour,
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.
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.
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
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 :
La page de panier ou sont censés aller les produits ajoutés au panier :
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>
yg_be
Messages postés
23449
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 janvier 2025
1 564
2 mars 2020 à 14:10
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?
réfléchissons d'abord à l'ajout d'un produit dans le panier. quels sont les différents cas possibles? qu'en penses-tu?
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
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.
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.
yg_be
Messages postés
23449
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 janvier 2025
1 564
2 mars 2020 à 14:22
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.
maintenant que c'est clair, je suppose que plus rien ne t’empêche de continuer à travailler sur la solution de ton exercice.
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
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.
yg_be
Messages postés
23449
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 janvier 2025
1 564
2 mars 2020 à 19:06
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
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
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
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 !
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
3 mars 2020 à 11:16
Bon, j'ai réussi à avoir les données que je voulais ! Voici le code :
Maintenant, il faut que j'arrive à automatiser tout ça dans une fonction, c'est le nouveau point de blocage, mais ça avance !
$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 !
jordane45
Messages postés
38397
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
29 janvier 2025
4 732
3 mars 2020 à 12:03
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...
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...
jordane45
Messages postés
38397
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
29 janvier 2025
4 732
3 mars 2020 à 12:05
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
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
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
3 mars 2020 à 16:16
J'ai bien avancé dans mon code que voici :
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.
$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.