8768 sujets

Développement web côté serveur, CMS

Bonjour,

Je cherche depuis plusieurs jours à résoudre un problème, mais je n'y arrive pas .
Pourriez vous m'aider svpl.

Voilà, j'ai une base de données avec un seul champs de type text rempli de données séparées pas un spipe |.
Je voudrais afficher ces données séparément ligne par ligne dans un tableau.
Les données de la base "produits" s'affichent correctement, mais les données de la base "liste" affiche 2 erreurs :
1°) Warning: explode() expects parameter 2 to be string, object given in Z:\Documents\web_projet\havas.onelist.tech\test.php on line 20
2°) Notice: Trying to get property 'cadeaux' of non-object in Z:\Documents\web_projet\havas.onelist.tech\test.php on line 22

D'avance merci pour voir aide.

Voici mon code :

<div class="container">
    <div class="row">
        <div class="rounded col-lg-12">
          <table>
            <tr>
              <th>Nom du produit</th>
              <th>Destination</th>
              <th>Thème</th>
              <th>Prix du produit</th>
            </tr>
              <?php 
                echo '<tr>';
                $produits = $DB->query('SELECT * FROM produit') ;
                foreach ($produits as $produit) {
                  
                  echo '<td>';
                    $prods = $DB->query('SELECT * FROM liste') ;
                    $cad = explode('|', $prods[0]) ;
                    foreach ($prods as $prod) {
                    echo $cad->cadeaux;
                    }
                  echo '</td>';

                  echo '<td>';
                    echo $produit->destination;
                  echo '</td>';

                  echo '<td>';
                    echo $produit->nomtheme;
                  echo '</td>';
                  
                  echo '<td>';
                    echo $produit->prixproduit;
                  echo '</td>';
                echo '</tr>';
            }

            ?>
          </table>
      </div>
    </div>
</div>


Et voici la page php :
upload/1649718621-84072-capturedancran2022-04-1201100.png
Modifié par Loutschi (12 Apr 2022 - 01:10)
Je continue mes recherches.
Lorsque je fais un print_r sur $prods, la page affiche bien le tableau :
Mon code :

echo '<td>';
                  $prods = $DB->query('SELECT * FROM liste') ;

                  echo '<pre>';
                  print_r($prods);
                  echo '<pre>';
                  die;

Ma page :
upload/1649723028-84072-capturedancran2022-04-1202232.png

Mais lorsque je fais un print_r sur $prods['cadeaux'] dont cadeau est le nom du champ, là j'ai un message d'erreur :
Notice: Undefined index: cadeaux
Mon code :

$prods = $DB->query('SELECT * FROM liste') ;

                  echo '<pre>';
                  var_dump($prods['cadeaux']);
                  echo '<pre>';
                  die;

Ma page :
Modérateur
Bonjour,

il semble que tu as un tableau a plusieurs niveaux .

Pour afficher les valeurs de cadeaux , je ferais
var_dump($prods['0']['cadeaux']);
var_dump($prods['1']['cadeaux']);


C'est ce qu'il me semble.
Cdt
Modifié par gcyrillus (12 Apr 2022 - 09:44)
Salut

Et oui, gcyrillus à raison, tu as un tableau multi dimension.

donc il faut soit une boucle soit faire à la main [0] ou [1] pour accéder à cadeaux.
Salut,

sur ton code de base, cette partie m'a l'air bizarre ..

foreach ($produits as $produit) {
  echo '<td>';
  $prods = $DB->query('SELECT * FROM liste') ;
  $cad = explode('|', $prods[0]) ;
  foreach ($prods as $prod) {
    echo $cad->cadeaux;
  }
}


A priori c'est plutôt ça (j'ai mis des lignes en commentaire pour expliquer l'évolution du code/raisonnement vers la ligne que tu veux je pense) :
foreach ($produits as $produit) {
  echo '<td>';
  $prods = $DB->query('SELECT * FROM liste') ;
  // $cad = explode('|', $prods[0]) ; //ici on n’accède pas directement a $prods[0] mais on va dans la boucle 
  foreach ($prods as $prod) {
    // $cad = explode('|', $prod) ; //on remet la ligne ici mais en utilisant $prod plutôt que $prods[0]
    // echo $cad->cadeaux; si on fait un explode a priori on n'est pas sur un objet donc pas d'accès a ->cadeaux
    $cad = explode('|', $prod->cadeaux) ; //on re modifie la ligne a priori c'est $prod l'objet qui contient cadeaux et que l'on veut faire un explode dessus 
  }
//le reste de ton traitement 
}



Mini edit sans rapport : Pourquoi ce format de stockage bizarre en base de données ?
J'ai l'impression qu'il y aurait sans doute des améliorations à faire de ce coté la..
Modifié par Mathieuu (12 Apr 2022 - 10:46)
oui c'est vrai que le format est particulier.

Tu t'es surement dit "Vu que la liste de cadeaux est dynamique je peux pas faire des columns spécifique, je ne sais pas combien de cadeaux il y aura"...

Dans ce cas c'est plus simple de stocker du "JSON" au moins tu as une structure assez propre lisible par n'importe quel langage sans magouiller
Oui stocké en JSON ça serait plus simple pour l'exploiter (en javascript notamment), mais ça reste un stockage "bizarre" à mon goût Smiley lol

Perso je voyais plus un vrai rangement en base de données, avec genre 3 tables ..

Genre la on voit "Entrée Disneyland" présente sur 2 lignes, si demain on te dit il faut préciser que c'est "Entrée Disneyland Paris", tu vas devoir parcourir toute ta base pour trouver les lignes qui contiennent "Entrée Disneyland" puis les modifier (et perso j'aimerai pas trop avoir à faire un update du genre Smiley ohwell )

Tu aurais une table Cadeaux à 2 colonnes qui contient le nom du cadeau associé à un identifiant et ça roule : "Entrée Disneyland" , Id_Cadeau1 (Et le jour où tu veux modifier, en un coup c'est réglé)

Une autre table Produits (perso liste je ne trouve pas ça parlant comme nom de table..), pareil à 2 colonnes avec le nom du produit et un identifiant : "Weekend à Disneyland Paris" , Id_Produit1

Puis une 3e table Produits_Cadeaux qui permet d'associer les cadeaux à chaque produit :
Id_Produit1 , Id_Cadeau1
Id_Produit1, Id_Cadeau2
Id_Produit1, Id_Cadeau35

Cela permet de faire un rangement simple et facile à mettre à jour
oui thx mathieuu les 3 tables c'est bien entendu le mieux à faire.
Modifié par JENCAL (12 Apr 2022 - 15:07)
Salut Messieurs,

Tout d'abord mes excuses pour ne pas avoir pu vous répondre plus tôt, j'étais hospitalisé par une Covid-19 plus virulante que ce que l'on entend habituellement. Et à près de 70 ans, on est moins resistant à cette foutue maladie !
Ceci dit, je vous remercie, gcyrillus, JENCAL et Mathieuu pour vos réponse rapides qui m'ont bien éclairées. Comme dit l'autre, mais c'est bien sûr .... j'ai zapé l'idée du tableau à plusieurs niveau ! Et de réaliser 3 tables pour mieux gérer mes données je n'y ai pas pensé non plus.
Heureusement que vous êtes là pour aider de nombreux codeurs en herbe comme moi.
Je vais me replonger dans mon projet pour le finaliser et peut-être je reviendrais vers vous au besoin.
Encore mille mercis à vous, très belle soirée et joyeuses fêtes de Pâques ! Smiley lapin
Modifié par Loutschi (15 Apr 2022 - 18:10)