[RESOLU] PDO afficher produit en php

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] PDO afficher produit en php

Re: PDO afficher produit en php

par ynx » 25 sept. 2014, 11:59

Effectivement il est aussi possible de construire dynamiquement la requête que je t'ai proposé à partir d'une liste de id_boutique ;)

Re: PDO afficher produit en php

par WENKz » 25 sept. 2014, 11:48

je pense qu'il y a possibilité sans modifier a la main en faisant une requete qui sortirai l'id de boutique et qu'ensuite on applique une variable genre $var.= 'requete avec id'; dans une boucle for non ? je dois pas etre très clair

Re: PDO afficher produit en php

par ynx » 25 sept. 2014, 11:33

On reprend depuis le début : la solution que j'aurais du te conseiller dès le début est de changer ta requête pour récupérer directement le résultat attendu.

La requête que je te propose est donc celle-ci :
SELECT id_produit,
	CASE WHEN id_boutique = 1 THEN prix END AS prix_boutique1
	CASE WHEN id_boutique = 2 THEN prix END AS prix_boutique2
	CASE WHEN id_boutique = 3 THEN prix END AS prix_boutique3
FROM catalogue
GROUP BY id_produit
Cette requête nous retourne donc une seule ligne pour chaque produit avec le prix de chaque boutique (ou NULL si le prix d'une boutique n'est pas définie pour un produit), soit par exemple :
id_produit | prix_boutique1 | prix_boutique2 | prix_boutique3
1 | 50 | NULL | 60
2 | NULL | 10 | 20
3 | 28 | 30 | 34

Le parcours de ces résultats est donc beaucoup plus simple, il te suffit d'afficher directement les résultats de ta requête.
L'inconvénient et que le nombre de boutique est fixe (puisque écrit en dur dans la requête), tu devras donc modifier ta requête pour afficher le prix d'une quatrième boutique.

Source pour la création de la requête : http://stackoverflow.com/questions/1241 ... to-columns

Bonne journée

Re: PDO afficher produit en php

par arnaud69 » 25 sept. 2014, 11:31

@arnaud69 : l'index d'un tableau commence bien à 0, mais l'identifiant de ses boutiques commence à 1.
Il doit donc commencer sa boucle à 1, d'autant plus qu'il utilise des clés non numériques, ce qui n'empêche pas le tableau de commencer à l'index 0 :
Array {
'prix_boutique1' => value, /* index 0 */
'prix_boutique2' => value, /* index 1 */
...
}
Je n'avais point tout lu ! La question a donc trouvé ainsi une réponse pleine de complétude :lol: :lol:

Re: PDO afficher produit en php

par ynx » 25 sept. 2014, 11:22

@arnaud69 : l'index d'un tableau commence bien à 0, mais l'identifiant de ses boutiques commence à 1.
Il doit donc commencer sa boucle à 1, d'autant plus qu'il utilise des clés non numériques, ce qui n'empêche pas le tableau de commencer à l'index 0 :
Array {
'prix_boutique1' => value, /* index 0 */
'prix_boutique2' => value, /* index 1 */
...
}

Re: PDO afficher produit en php

par ynx » 25 sept. 2014, 11:18

Concernant la ligne
$prixParProduit[$donnee['nom_produit']]['prix_boutique1'] = $donnee['prix']
il ne s'agit pas d'une concaténation mais d'une affectation sur un tableau à 2 dimensions en utilisant le nom du produit comme clé du tableau principal et le prix_boutiqueN comme clé du sous-tableau, dans un soucis d'unicité (cf. message du 23). Si je n'utilisais pas l'id du produit comme clé du tableau, j'aurais des doublons puisque le résultat de la requête retourne plusieurs lignes pour un produits.

Concernant le code de ton dernier message, ce qui me trouble est que le nombre d'itération de ta boucle for dépend de l'id de la boutique : for ($i = 1; $i <= $donnee['id_boutique']; $i++)
Supposons que pour un produit nous n'avons que le prix de la boutique 1 (le prix de la boutique 2 n'est pas renseigné dans la base), du coup ta boucle for ne vas initialiser que la variable $prixParProduit[$donnee['nom_produit']]['prix_boutique1'], la variable $prixParProduit[$donnee['nom_produit']]['prix_boutique2'] ne sera jamais initialisée puisque $donnee['id_boutique'] ne sera jamais égal à 2 pour ce produit. Tu auras donc une Notice : undefined variable lors du parcours du tableau pour l'affichage (ce qui n'empêche pas le bon fonctionnement du code).
Je pense que ta boucle for devrait donc avoir un nombre d'itération fixe. Si ta base contient 3 boutiques, ta boucle for devrait toujours faire 3 itérations : for ($i = 1; $i <= $nombreBoutiques; $i++)

Finalement, la complexité de ce traitement des données vient surtout du résultat de la requête qui n'est pas structuré de la bonne façon.

Re: PDO afficher produit en php

par arnaud69 » 25 sept. 2014, 10:57

Code : Tout sélectionner

$PPP=count($prixParProduit) for( $i = 0 ; $i < $PPP ; $i++ ){ echo '<td>'.$prixProduit['prix_boutique'.$i].'</td>'; }
J'ai changé en 0, car un tableau commence toujours à 0, mais le comptage à 1...

Re: PDO afficher produit en php

par WENKz » 25 sept. 2014, 10:06

Bonjour,
Pour le moment j'ai fait ceci cela fonctionne, mais est-ce correcte, devrais-je écrire cela autrement ?
<?php 
function afficher() {
    include 'lib/config.php';
    $result = $bdd->query("SELECT * 
FROM  `CATALOGUE` c INNER JOIN PRODUIT p ON c.id_produit = p.id_produit WHERE url is not null");

    $prixParProduit = array();

    while ($donnee = $result->fetch()) {
        // on initialise nos variables si elle ne sont pas définies
        $n = $donnee['id_boutique']; 
        for ($i = 1;  $i <= $n; $i++) { // boucle for pour afficher les prix de tous les produits pour chaque boutiques
            if (!isset($prixParProduit[$donnee['nom_produit']]['prix_boutique' . $i])) {
                $prixParProduit[$donnee['nom_produit']]['prix_boutique' . $i] = 0;
            }
            if ($donnee['id_boutique'] == $i) {
                $prixParProduit[$donnee['nom_produit']]['prix_boutique' . $i] = $donnee['prix'];
            }
        }
    }

// on affiche les prix
    echo '<tbody><thead><tr><th>idProduit</th>   <th> boutique1 </th>   <th>boutique2</th><th>boutique3</th><th>boutique4</th><th>boutique5</th></tr></thead>';
    foreach ($prixParProduit as $idProduit => $prixProduit) {
        
        echo '<tr><td>' . $idProduit . '</td>';
        for( $i = 1 ; $i <= 11 ; $i++ ){
           echo '<td>'.$prixProduit['prix_boutique'.$i].'</td>';
        }
        echo '</tr>';
    }
}
?>

<table class = "table table-striped">
    <?  afficher()?>					
</table>
Comment pourrais-je trouver $n (pour remplacer 11) pour cette boucle for ?
<?php 
        for( $i = 1 ; $i <= 11 ; $i++ ){
           echo '<td>'.$prixProduit['prix_boutique'.$i].'</td>';
        }

Re: PDO afficher produit en php

par WENKz » 24 sept. 2014, 15:15

En fait sur cette ligne
$prixParProduit[$donnee['nom_produit']]['prix_boutique1'] = $donnee['prix']
tu concataine l'id du produit ainsi que le prix de la boutique et tu leur applique la $donnee prix ?? je suis pas sur de bien comprendre :s

Re: PDO afficher produit en php

par WENKz » 24 sept. 2014, 14:14

Merci merci merci pour ce sauvetage :D encore une petite question si j'ai d'autre boutique qui viendrait a s'ajouter je peux tout faire en "une seul ligne" pour qu'il y est un ajout automatique? ex :
if (!isset($prixParProduit[$donnee['id_produit']]['prix_boutique'])) {
                $prixParProduit[$donnee['id_produit']]['prix_boutique['$donnee['id_boutique'] ']= 0;
        }
if ($donnee['id_boutique'] == $numero) {
                $prixParProduit[$donnee['id_produit']]['prix_boutique['$donnee['id_boutique'] ']= $donnee['prix'];
        }
est-ce possible ?

Re: PDO afficher produit en php

par ynx » 24 sept. 2014, 11:29

C'est bien ça.

En résumé tu remplaces mon :
foreach ($resultatRequete as $donnee) {
par ton :
while ($donnee = $result->fetch()) {

Re: PDO afficher produit en php

par WENKz » 24 sept. 2014, 09:41

donc je n'ai pas besoin de resultatrequetes c'est ça ?

Re: PDO afficher produit en php

par ynx » 23 sept. 2014, 13:01

Non le tableau $resultatRequete correspond au résultat de ta requête qui est dans ta variable $result (que tu parcours avec fetch). Pour mes tests, n'ayant pas accès à ta bdd, j'ai créé ce tableau et je le parcours avec un foreach.

Puisque le résultat de la requête te retourne un prix par tuple, l'idée est donc de passer par un tableau associatif en utilisant l'id du produit en clé. Ainsi nous n'aurons pas de doublons sur les produits. Le même principe est appliqué pour les prix du produit en fonction de l'id de la boutique. Voici la structure du tableau final que je te propose :
Array {
id_produit1 => Array(prix_boutique1 => prix1, prix_boutique2 => prix2),
id_produit2 => Array(prix_boutique1 => prix3, prix_boutique2 => prix4),
id_produit3 => Array(prix_boutique1 => prix5, prix_boutique2 => prix6)
}
Nous avons ainsi pour chaque produit les prix boutique1 et boutique2 sans doublons sur les produits. Il suffit ensuite de parcourir ce tableau pour l'affichage.

Re: PDO afficher produit en php

par WENKz » 23 sept. 2014, 09:09

Bonjour, merci de ta reponse, desolé de mon absence (mariage et organisation ^^) , encore une petite question, donc si j'ai bien compris dans mon tableau je n'ai plus cas changer 'id_produit' par mon id_produit (manuellement) ou avec $donnee['id_produit'] ?
En fait je fais ma boucle while et dans ma boucle while de met mes array dans lesquelles je références les info sur une seul ligne genre
while($donnee = $result->fetch()){
$resultatRequete = array(
                array( 'id_produit' => '$donnee['id_produit']', 'id_boutique' => $donnee[id_boutique'], 'prix' => $donnee['prix']));

}
mais dans $prixParProduit à quoi sert il ? dans resultat requete on récupère deja le prix non ?

Re: PDO afficher produit en php

par ynx » 18 sept. 2014, 14:05

Ok je comprend mieux.

Le problème est que ta requête te retourne un prix par résultat (par tour de boucle), tu ne peux donc pas récupérer les deux prix sur un seul tour de boucle (ça serait possible en effectuant des sous-requêtes mais ce serait moins optimisé).

Une solution est donc de construire un tableau avec en clé l'id du produit, puis ajouter une deuxième dimension au tableau pour enregistrer les prix. On commence donc par parcourir l'ensemble des résultats de la requête dans ce tableau à deux dimensions, puis on l'affiche.

Voici un exemple : (pour mes tests j'ai remplacé ton fetch par un tableau $resultatRequete)
$resultatRequete = array(
		array('id_produit' => 'produit1', 'id_boutique' => 1, 'prix' => 'prix1'),
		array('id_produit' => 'produit1', 'id_boutique' => 2, 'prix' => 'prix2'),
		array('id_produit' => 'produit2', 'id_boutique' => 1, 'prix' => 'prix1'),
		array('id_produit' => 'produit2', 'id_boutique' => 2, 'prix' => 'prix2'),
		array('id_produit' => 'produit3', 'id_boutique' => 2, 'prix' => 'prix2'),
		array('id_produit' => 'produit4', 'id_boutique' => 1, 'prix' => 'prix1')
	);


$prixParProduit = array();
	
foreach ($resultatRequete as $donnee) {
	// on initialise nos variables si elle ne sont pas définies
	if (!isset($prixParProduit[$donnee['id_produit']]['prix_boutique1'])) {
		$prixParProduit[$donnee['id_produit']]['prix_boutique1'] = 0;
	}
	if (!isset($prixParProduit[$donnee['id_produit']]['prix_boutique2'])) {
		$prixParProduit[$donnee['id_produit']]['prix_boutique2'] = 0;
	}
	
	if ($donnee['id_boutique'] == 1) {
		$prixParProduit[$donnee['id_produit']]['prix_boutique1'] = $donnee['prix'];
	}
	if ($donnee['id_boutique'] == 2) {
		$prixParProduit[$donnee['id_produit']]['prix_boutique2'] = $donnee['prix'];
	}
}

// on affiche les prix
echo 'idProduit   prix boutique1   prix boutique2<br />';
foreach ($prixParProduit as $idProduit => $prixProduit) {
	echo $idProduit . ' ' .  $prixProduit['prix_boutique1'] . ' ' . $prixProduit['prix_boutique2'] . '<br />';
}
Bonne journée