PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 05-08-2014 13:01:42

lvdesign
Membre
Inscription : 05-08-2014
Messages : 6

formulaire php - récuperation et adaptation de donnée checkbox problem

bonjour à tous,

j'ai une question sur la récuperation de donnée issu d'une BD.
Je veux creer une page de mis à jours de données;
je cree le formulaire
et je le rempli des infos avec la requete SELECT
tout mes champs se remplisse sauf un. C'est un champs de checkbox qui checke les tags associés.

je recupere bien les données de ce champs issu d'un GROUP_CONCAT

donc j'ai
$tag = (végétalien,sans gluten,classique);

je le découpe avec

$tag = preg_split("/[\,]+/", $tag );

j'ai donc maintenant
$tag :: Array ( [0] => végétalien [1] => sans gluten [2] => classique )

Mais après cette opération,
je ne sais pas comment il faut faire pour qu'il checke les bons boutons




mon checkbox se définit ainsi :


Tag Array ( [tag] => végétarien [tag_id] => 1 ) végétarien
Array ( [tag] => végétalien [tag_id] => 2 ) végétalien
Array ( [tag] => sans lactose [tag_id] => 4 ) sans lactose
Array ( [tag] => sans gluten [tag_id] => 3 ) sans gluten
Array ( [tag] => classique [tag_id] => 5 ) classique
 

voici le html du checkbox

<div class="checkbox form-control">
    <label for="tag" class="control-label">Tag</label>
    <?php
    $qt="SELECT tag, tag_id FROM tag ORDER BY tag DESC";
    $r=mysqli_query($dbc,$qt);
      while ($rowt=mysqli_fetch_array($r, MYSQLI_ASSOC)) {
     
      print_r($rowt);
      ?>
      <div class="checkbox <?php if(array_key_exists('tag', $update_page_errors)) echo ' has-error'; ?>">
            <label>
              <input type="checkbox" name="tag[]" id="<?php echo $rowt['tag'] ?>" value="<?php echo $rowt['tag_id'] ?>"
              <?php
              if( isset($tag) && ($tag_id == $rowt['tag_id']) ) echo !empty('checked="checked"')?'checked="checked"':'';?>><?php echo $rowt['tag'] ?>
            </label>
        </div>
       
       
        <?php if(array_key_exists('tag', $update_page_errors)) echo'<span class="help-bloc">'.$update_page_errors['tag'].'</span>'; ?>
       
      <?php } ?>
  </div>

Pour l'instant un seul est checké, c'est Classique. Je pense que c'est par défaut car même si il n'est pas dans la liste c'est le dernier et il est checké.

Par avance merci

cordialement

Hors ligne

#2 05-08-2014 19:31:22

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : formulaire php - récuperation et adaptation de donnée checkbox problem

Saluton,

En fait, quand un checkbox est sélectionné il faut mettre son attribut HTML checked à "checked", tout simplement.

Ce que semble faire ton script alors du coup je ne comprends pas où est ton problème.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#3 05-08-2014 21:28:00

lvdesign
Membre
Inscription : 05-08-2014
Messages : 6

Re : formulaire php - récuperation et adaptation de donnée checkbox problem

hello Maljuna,

Le problème n'est pas sur le html du checked="checked"

if( isset($tag) && ($tag_id == $rowt['tag_id']) ) echo !empty('checked="checked"')?'checked="checked"':'';?>><?php echo $rowt['tag'] ?>

Je n'arrive pas à créer un tableau qui à partir de la sortie du SELECT pour $tag [-> $tag = (végétalien,sans gluten); ]

permette de valider :

Tag Array ( [tag] => végétarien [tag_id] => 1 ) végétarien
Array ( [tag] => végétalien [tag_id] => 2 ) végétalien
Array ( [tag] => sans lactose [tag_id] => 4 ) sans lactose
Array ( [tag] => sans gluten [tag_id] => 3 ) sans gluten
Array ( [tag] => classique [tag_id] => 5 ) classique

qui sera checké  selon la sortie de $tag
soit là par exemple:
          checked = checked  pour végétalien et sans gluten

Merci pour une idée de travail sur les array

cordialement

Hors ligne

#4 06-08-2014 02:09:01

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : formulaire php - récuperation et adaptation de donnée checkbox problem

Bonjour,

Vos variables $tag et $tag_id ne sont pas initialisées/définies, donc votre condition


if( isset($tag) && ($tag_id == $rowt['tag_id']) ) ...
 

n'est jamais vérifiée => case jamais cochée.

++


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#5 06-08-2014 08:10:22

lvdesign
Membre
Inscription : 05-08-2014
Messages : 6

Re : formulaire php - récuperation et adaptation de donnée checkbox problem

bonjour,

c'est justement le problème.
'Tag 'est une table lier à la table 'Pages' par une table de liaison 'Pages_tag'.

$tag est issu de la BD par une jointure,  c'est 'le nom' du tag que je retrouve. C'est par exemple 'végétalien'.
$tag_id  sera son indice selon sa position dan la table 'Tag' composé de tag, tag_id

donc selon ma table si j'ai végétalien, son tag_id est 2

c'est cette manière de faire correspondre et donc de valider ce que me retourne la requête SELECT
que je cherche à faire afin que mon formulaire checkbox soit bien checked.

ma table Tag avec les correspondances


Tag Array ( [tag] => végétarien [tag_id] => 1 ) végétarien
Array ( [tag] => végétalien [tag_id] => 2 ) végétalien
Array ( [tag] => sans lactose [tag_id] => 4 ) sans lactose
Array ( [tag] => sans gluten [tag_id] => 3 ) sans gluten
Array ( [tag] => classique [tag_id] => 5 ) classique

merci d'avance pour une idée

cordialement

Hors ligne

#6 06-08-2014 17:21:26

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : formulaire php - récuperation et adaptation de donnée checkbox problem

Bonjour,

J'ai plusieurs choses à dire à tout cela.

1) Bien que l'on soit dans un modèle de programmation type CMS (1 entité objet = 1 table et/ou 1 entité objet = 1 table de jonction (relation de plusieurs à plusieurs)), et donc dans un environnement assez dénormalisé au sens de l'algèbre relationnelle, il est important d'éviter des mappings d'identifiants au sein de l'application objet car cela créé de la complexité là où elle est inutile. Je vous recommande de vous caler sur les identifiants de votre base de données dans votre application ou au pire id_app=id_db-1 (dûs aux tableaux php dont le premier indice=0 contrairement aux dbs où la clé primaire technique commence à 1.)

2) A rapatrier dans un group_concat les informations, il faut que l'ordre des ids soit respectée et faudra y appliquer une clause ORDER BY sur la clé primaire de l'entité afférente.

3) On ne connait pas la structure de votre formulaire, à savoir si vous avez une case à cocher par tag ou si vous avez une case à cocher par type de tag.
Pour vous donner une piste de solution, on va considérer que vous avez un checkbox par tag.


// rappel du tableau associatif source
// $tag_source=array(1=>'végétarien',2=>'végétalien',3=>'sans gluten',4=>'sans lactose',5=>'classique');

$checked_1='';$checked_2='';$checked_3='';$checked_4='';$checked_5='';
switch (intval($rowt['tag_id'])){
     case 1:  $checked_1=' checked="checked" ';
     break;case 2: $checked_2=' checked="checked" ';
     break;case 3: $checked_3=' checked="checked" ';
     break;case 4: $checked_4=' checked="checked" ';
     break;case 5: $checked_5=' checked="checked" ';
}
// ensuite dans ton formulaire il suffit pour chaque input d'écrire :
echo '<input type="checkbox" id="is_vegetarien" '.$checked_1.' /><label for="is_vegetarien">Végétarien</label>';
echo '<input type="checkbox" id="is_vegetalien" '.$checked_2.' /><label for="is_vegetalien">Végétalien</label>';
....
 

Voilà l'idée est là. Maintenant à vous de transposer cela dans votre code.

Jc.

Dernière modification par Jc (06-08-2014 17:38:21)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#7 06-08-2014 18:19:11

lvdesign
Membre
Inscription : 05-08-2014
Messages : 6

Re : formulaire php - récuperation et adaptation de donnée checkbox problem

Bonjour,

merci pour la réponse.

je vais travailler sur la base de vos recommandations.

Je pensais qu'il me fallait une boucle foreach pour mettre en correspondance le résultat pour $tag de la bd qui sont mémorisés checked et la partie du formulaire checkbox.

Pour ma requete sur cat_p_id ( la categorie enregistrée cela fonctionne impeccable )

ci-joint cette partie :

 
html/php
echo'<div class="form-group';

  if(array_key_exists('category', $update_page_errors)) echo 'has-error';
  echo '"><label for="category" class="control-label">La catégorie</label>
  <select name="category" class="form-control"><option>Sélectionnez</option>';
    $q="SELECT cat_id, category FROM categorie ORDER BY cat_id ASC";
    $r= mysqli_query($dbc,$q);
    while ($row=mysqli_fetch_array($r, MYSQLI_NUM)) {
          echo "<option value =\"$row[0]\"";
      if(isset($category) && ($category == $row[0])) echo ' selected="selected"';
      echo ">$row[1]</option>\n";
      }
  echo '</select>';
  if(array_key_exists('category', $update_page_errors)) echo '<span class="help-bloc">' .$update_page_errors['category'].'</span>';
  echo'</div>';
?> 
 

Cordialement

pour le 1/
je fais au mieux pour structurer et optimiser les relations.
la table 'Pages' est la base du systeme
s'articule autour
une table 'Categorie'
une table 'User'
une table de jonction 'Pages_tag'
qui est lie à la table 'Tag'

pour le 2/
ma requete

 php/sql ::
SELECT p.user_id,p.status, p.title, p.cat_p_id, GROUP_CONCAT(t.tag) AS tag , p.summary, p.ingredient, p.recipe, p.tips, p.filename
      FROM pages AS p
      LEFT JOIN pages_tag AS pt USING (page_id)
      LEFT JOIN tag AS t USING(tag_id)
 

pour le point 3 :
chaque tag a sa case. La boucle affiche bien chaque tag avec sa valeur.

<div class="checkbox form-control">
    <label for="tag" class="control-label">Tag</label>
    <?php
    $qt="SELECT tag_id, tag FROM tag ORDER BY tag DESC";
    $r=mysqli_query($dbc,$qt);
      while ($rowt=mysqli_fetch_array($r, MYSQLI_ASSOC)) {
     
      print_r($rowt);
      ?>
      <div class="checkbox <?php if(array_key_exists('tag', $update_page_errors)) echo ' has-error'; ?>">
            <label>
              <input type="checkbox" name="tag[]" id="<?php echo $rowt['tag'] ?>" value="<?php echo $rowt['tag_id'] ?>"
              <?php

              if( isset($tag) && ($tag_id == $rowt['tag_id']) ) echo !empty('checked="checked"')?'checked="checked"':'';?>><?php echo $rowt['tag'] ?>
            </label>
        </div>
       
       
        <?php if(array_key_exists('tag', $update_page_errors)) echo'<span class="help-bloc">'.$update_page_errors['tag'].'</span>'; ?>
       
      <?php } ?>
  </div>

            WHERE p.page_id=?
            ORDER BY tag

Dernière modification par lvdesign (06-08-2014 18:21:34)

Hors ligne

#8 07-08-2014 04:49:32

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : formulaire php - récuperation et adaptation de donnée checkbox problem

Bonjour,

Je comprends mieux votre logique à présent. Je pense qu'il est important de préciser certaines choses à cet égard.

1) "je fais au mieux pour structurer et optimiser les relations." : Bien que le besoin fonctionnel soit à prendre en considération dans cette étape, les contraintes et règles de gestion métier doivent rester prioritaires dans leur définition, et d'autant plus lorsque le besoin fonctionnel exprimé n'est pas métier mais applicatif objet.

2) Vous construisez votre affichage dynamiquement en fonction de vos paramètres applicatif (tables de paramétrage AKA de référence). Pourquoi pas. Mais dans ce contexte votre approche n'est pas pertinente. Je m'explique.
Il faut toujours dissocier dans une application web les données d'environnement (paramétrage / de référence) des données métier d'exploitation.
Pourquoi?
1) Pour optimiser la consommation de bande passante
2) Pour gérer efficacement et d'une manière optimisée les différents caches de données et éviter ainsi de requêter systématiquement la BD.
3) Pour la maintenabilité et la lisibilité du code.

Vous l'avez compris, c'est ce que vous ne faites pas, et ce n'est pas parce que les données dynamiques dans votre cas de figure se limitent à une dizaine de références (végétarien, etc...) que cela rends votre structure "acceptable". Imaginez si vous faisiez de même avec les 38565 communes de France... C'est un peu comme si vous faisiez vos courses dans un supermarché avec 4 caddies que vous remplissez à ras bord (vos données) pour finalement passer en caisse qu'avec une seule baguette (ce que vous avez réellement besoin et que vous achetez).

La difficulté dans votre code et la raison de votre bug, c'est que vous ne pouvez raisonnablement requêter à la fois les données d'environnement et les données contextuelles dans votre contexte d'architecture applicative, et de toute manière l'exercice reste difficile en général. Il vous faut au moins deux requêtes, gérées par deux variables respectivement au niveau de PHP, une pour gérer le contexte d'affichage et l'autre pour gérer l'affichage des données, et éventuellement faire des rapprochements entre les deux et mettre à jour votre affichage en conséquence.

Bonne journée smile


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#9 07-08-2014 09:50:08

lvdesign
Membre
Inscription : 05-08-2014
Messages : 6

Re : formulaire php - récuperation et adaptation de donnée checkbox problem

bonjour,
merci, pour votre réponse.
cordialement

Hors ligne

#10 07-08-2014 18:05:48

lvdesign
Membre
Inscription : 05-08-2014
Messages : 6

Re : formulaire php - récuperation et adaptation de donnée checkbox problem

Bonjour JC,

J'ai trouvé la solution.

Il suffisait tout simplement d'utiliser in_array().

merci.

Cordialement




<div class="checkbox form-control">
    <label for="tag" class="control-label">Tag</label>
    <?php
    $qt="SELECT tag_id, tag FROM tag ORDER BY tag DESC";
    $r=mysqli_query($dbc,$qt);
      while ($rowt=mysqli_fetch_array($r, MYSQLI_ASSOC)) {
     
      //print_r($rowt);
     
      $monTag_id = $rowt['tag_id'];
      $monTag = $rowt['tag'];
     
      ?>
      <div class="checkbox <?php if(array_key_exists('tag', $update_page_errors)) echo ' has-error'; ?>">
            <label>
              <input type="checkbox" name="tag[]" id="<?php echo $monTag ?>" value="<?php echo $rowt['tag_id'] ?>"
              <?php
             
              if( isset($tagNom) && in_array( $monTag , $tagNom ) ) echo !empty('checked="checked"') ? 'checked="checked"' : '';?>><?php echo $rowt['tag'] ?>
            </label>
        </div>
       
       
        <?php if(array_key_exists('tag', $update_page_errors)) echo'<span class="help-bloc">'.$update_page_errors['tag'].'</span>'; ?>
       
      <?php } ?>
  </div>     
 

Hors ligne

Pied de page des forums