Vous n'êtes pas identifié(e).
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 :
voici le html du checkbox
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
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
hello Maljuna,
Le problème n'est pas sur le html du checked="checked"
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
Bonjour,
Vos variables $tag et $tag_id ne sont pas initialisées/définies, donc votre condition
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
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
merci d'avance pour une idée
cordialement
Hors ligne
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.
$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
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 :
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
pour le point 3 :
chaque tag a sa case. La boucle affiche bien chaque tag avec sa valeur.
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
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
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
bonjour,
merci, pour votre réponse.
cordialement
Hors ligne
Bonjour JC,
J'ai trouvé la solution.
Il suffisait tout simplement d'utiliser in_array().
merci.
Cordialement
Hors ligne