[RESOLU] PDO afficher produit en php

Eléphant du PHP | 134 Messages

17 sept. 2014, 16:57

Bonjour après avoir finis de remplir ma base de donnée je souhaite appelé mon catalogue , j'ai trois table une table ou il y a les nom et id de produit, une table boutique ou je reference mes boutiques, et une table catalogue ou je recupère mes prix selon mes boutique et produit ,
je souhaite afficher un tableau mais j'ai un soucis ^^ j'utilise la requete
function afficher() {
    include '/var/www/dashboard/lib/config.php';
    $result = $bdd->query("SELECT * 
FROM  `CATALOGUE` ");
    while ($donnee = $result->fetch()) {
        $id_boutique = $donnee['id_boutique'];
        if ($id_boutique == 2) {
            $b2 = $donnee['prix'];
        }
        if ($id_boutique == 1) {
            $b1 = $donnee['prix'];
        } 
       echo '<tr>';
        echo '<td>' . $b1 . '-1</td>';
        echo '<td>' . $b2 . '-2</td>';
        echo '</tr>';
    }
     
}


et pour afficher
<table class = "table table-striped">
    <thead>
        <tr>
            
            <th>prix1</th>
            <th>prix2</th>
        </tr>
    </thead>
    <tbody>
        <? echo afficher();
        ?>					
    </tbody>
</table>
mais j'ai une duplication du genre :
Image

je ne sais plus quoi faire j'ai essayer de tout retourner dans tout les sens mais la je suis perdu, pouvez vous m’éclairer ma lanterne ?

Eléphant du PHP | 151 Messages

17 sept. 2014, 17:25

Bonjour,

Je ne vois pas de PDO !
Tu inclus un fichier config depuis sa racine
Tu parles de 3 tables, je n'en vois qu'une dans ta requête
Tu fais echo dans ta fonction et encore echo lafonction()...

Bon... On corrige et on recommence ?
Développeur d'applications pour intranets industriels (IHM), DBA Oracle, auto entrepreneur. Je fuis les frameworks car je pense comme Rasmus Lerdorf : "all PHP frameworks suck"...
Je me suis lancé dans la reprise du projet PhpMyNewsletter (GNU GPL), que je vous invite à essayer.

echo ($user=='enregistré?"je t'aide":"je t'aide pas !");

Eléphant du PHP | 134 Messages

18 sept. 2014, 10:21

Merci de ta réponse j’espère que ma correction te conviendra concernant ma reaquete pour le moment je n'ai pas la nécessiter d'afficher le nom du produit le nom de la boutique ....
sinon voici mes bases
<?php
function afficher() {
    include 'lib/config.php';
    $result = $bdd->query("SELECT * 
FROM  `CATALOGUE` WHERE id_produit = 501");
    while ($donnee = $result->fetch()) {
        $id_boutique = $donnee['id_boutique'];
        if ($id_boutique == 2) {
            $b2 = $donnee['prix'];
        }
        if ($id_boutique == 1) {
            $b1 = $donnee['prix'];
        } 
       ?> <tr>
         <td><? echo $b1 ?>-1</td>
         <td><? echo $b2 ?>-2</td>
         </tr><?
    }
     
}?>

<table class = "table table-striped">
    <thead>
        <tr>
            
            <th>prix</th>
            <th>prix</th>
        </tr>
    </thead>
    <tbody>
        <?  afficher();?>					
    </tbody>
</table>

ma requete complète
SELECT * FROM CATALOGUE INNER JOIN PRODUIT ON CATALOGUE.id_produit = PRODUIT.id_produit INNER JOIN BOUTIQUE ON CATALOGUE.id_boutique = BOUTIQUE.id_boutique
-- phpMyAdmin SQL Dump
-- version 3.4.10.1deb1
-- http://www.phpmyadmin.net
--
-- Client: localhost
-- Généré le : Jeu 22 Mai 2014 à 05:28
-- Version du serveur: 5.5.35
-- Version de PHP: 5.3.10-1ubuntu3.11

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Base de données: `php`
--

-- --------------------------------------------------------

--
-- Structure de la table `BOUTIQUE`
--

CREATE TABLE IF NOT EXISTS `BOUTIQUE` (
  `id_boutique` int(11) NOT NULL AUTO_INCREMENT,
  `nom_boutique` varchar(255) DEFAULT NULL,
  `type` varchar(33) NOT NULL,
  PRIMARY KEY (`id_boutique`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=14 ;

--
-- Contenu de la table `BOUTIQUE`
--

INSERT INTO `BOUTIQUE` (`id_boutique`, `nom_boutique`, `type`) VALUES
(12, 'boutique_1', 'INTERNE'),
(13, 'boutique_2', 'EXTERNE');

-- --------------------------------------------------------

--
-- Structure de la table `CATALOGUE`
--

CREATE TABLE IF NOT EXISTS `CATALOGUE` (
  `url` varchar(255) DEFAULT NULL,
  `prix` decimal(10,2) DEFAULT NULL,
  `solde` decimal(11,2) DEFAULT NULL,
  `ancien_prix` decimal(10,2) DEFAULT NULL,
  `stock` varchar(25) DEFAULT NULL,
  `ancien_stock` varchar(25) DEFAULT NULL,
  `id_produit` int(11) NOT NULL,
  `id_boutique` int(11) NOT NULL,
  PRIMARY KEY (`id_produit`,`id_boutique`),
  KEY `FK_catalogue_id_boutique` (`id_boutique`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Contenu de la table `CATALOGUE`
--

INSERT INTO `CATALOGUE` (`url`, `prix`, `solde`, `ancien_prix`, `stock`, `ancien_stock`, `id_produit`, `id_boutique`) VALUES
(NULL, 1.20, NULL, NULL, NULL, NULL, 3220, 12),
('url_du_produit_de_la_boutique_2.fr', 1.30, NULL, NULL, NULL, NULL, 3220, 13),
(NULL, 3.00, NULL, NULL, NULL, NULL, 3221, 12);

-- --------------------------------------------------------

--
-- Structure de la table `PRODUIT`
--

CREATE TABLE IF NOT EXISTS `PRODUIT` (
  `id_produit` int(11) NOT NULL AUTO_INCREMENT,
  `ref` varchar(25) DEFAULT NULL,
  `nom_produit` varchar(25) DEFAULT NULL,
  PRIMARY KEY (`id_produit`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3222 ;

--
-- Contenu de la table `PRODUIT`
--

INSERT INTO `PRODUIT` (`id_produit`, `ref`, `nom_produit`) VALUES
(3220, 'ACBR-0003', 'Produit_1'),
(3221, 'ACBR-0002', 'Produit_2');

--
-- Contraintes pour les tables exportées
--

--
-- Contraintes pour la table `CATALOGUE`
--
ALTER TABLE `CATALOGUE`
  ADD CONSTRAINT `FK_catalogue_id_boutique` FOREIGN KEY (`id_boutique`) REFERENCES `BOUTIQUE` (`id_boutique`),
  ADD CONSTRAINT `FK_catalogue_id_produit` FOREIGN KEY (`id_produit`) REFERENCES `PRODUIT` (`id_produit`);

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

et login bdd
/* 
 * INFO BDD
 */

$USER = '******';
$PASS = '*****';

try
{
	// On se connecte à MySQL
	$bdd = new PDO('mysql:host=localhost;dbname=dash', $USER, $PASS);
}
catch(Exception $ex)
{
	
        die('Erreur : '.$ex->getMessage());
}

ynx
Mammouth du PHP | 586 Messages

18 sept. 2014, 11:42

Salut,

Pas sur d'avoir bien compris ton problème mais il me semble que tu as une erreur sur l'initialisation des prix à chaque tour de la boucle.

Premier tour de boucle : on suppose que $id_boutique = 1 donc $b1 = 'prix1' et $b2 = 0
Deuxième tour de boucle : on suppose que $id_boutique = 2 donc $b2 = 'prix2' mais $b1 est toujours égal à 'prix1' (cette variable n'a pas été modifiée)

La solution serait donc de toujours initialiser tes variables $b1 et $b2 au début de la boucle :
while ($donnee = $result->fetch()) {
    $a = 0; $b = 0;
Bonne journée

Eléphant du PHP | 134 Messages

18 sept. 2014, 11:59

en fait il faudrait que sur 1 seul tour de boucle j'ai le resultat de $b1 et de $b2
$b1 m'affiche le prix appartenant l' id_boutique == 1 et $b2 -> id_boutique = 2

ynx
Mammouth du PHP | 586 Messages

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

Eléphant du PHP | 134 Messages

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 ?

ynx
Mammouth du PHP | 586 Messages

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.

Eléphant du PHP | 134 Messages

24 sept. 2014, 09:41

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

ynx
Mammouth du PHP | 586 Messages

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()) {

Eléphant du PHP | 134 Messages

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 ?

Eléphant du PHP | 134 Messages

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

Eléphant du PHP | 134 Messages

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

Eléphant du PHP | 151 Messages

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...
Développeur d'applications pour intranets industriels (IHM), DBA Oracle, auto entrepreneur. Je fuis les frameworks car je pense comme Rasmus Lerdorf : "all PHP frameworks suck"...
Je me suis lancé dans la reprise du projet PhpMyNewsletter (GNU GPL), que je vous invite à essayer.

echo ($user=='enregistré?"je t'aide":"je t'aide pas !");

ynx
Mammouth du PHP | 586 Messages

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.