Probleme array dans base de données

Eléphanteau du PHP | 25 Messages

11 août 2008, 16:25

Bonjour,

Me voila face à un nouveau probleme :

J'ai un formulaire permettant de renseigner des données pour une personne, un des champs de ce formulaire est un champ (select multiple) "theme" composé de plusieurs items. Chaque personnes peu avoir plusieurs themes.

Lors de la creation, je mets ces themes dans un select multiple, qui se rempli via une base de données grace a ce bout de code.

Code : Tout sélectionner

<?php include 'connect.php'; $sql_theme = " SELECT theme FROM themes order by theme asc "; $result_theme = mysql_query($sql_theme) or die("Requete pas comprise"); echo "Theme : <select name='theme[]' size='4' multiple>"; while ($row=mysql_fetch_array($result_theme)) { echo"<option>$row[0]</option>"; } echo"</select>"; ?>
Lors de la sauvegarde de ce champ multiple dans la base de données, j'avais toujours une inscription "array" à la place de ce champ multiple (ce qui est normal, c'est un tableau). Pour eviter ce probleme, je l'ai donc inscrit de cette facon

Code : Tout sélectionner

if (isset($_POST['theme'])) {$tab_theme = implode(", ", $_POST['theme']);} else {$tab_theme='';}
Ce qui m'inscrit les differents elements du theme, encadrée par des virgules.

Vient la modification de ce theme (je veux que les items selectionnés soit marqués par defaut, d'ou le sujet que j'avais crée la http://www.phpfrance.com/forums/voir_sujet-242155.php), Je recré donc un tableau avec ceci, la modification se passe sans probleme :

Code : Tout sélectionner

<?php include 'connect.php'; $theme = explode(", ", $row_general[15]); $sql_theme = " SELECT theme FROM themes order by theme asc "; $result_theme = mysql_query($sql_theme) or die("Requete pas comprise"); echo "Theme : <select name='theme[]' size='4' multiple>"; while ($row=mysql_fetch_array($result_theme)) { if (in_array($row[0], $theme)) { echo"<option selected='selected'>$row[0]</option>"; } else { echo"<option>$row[0]</option>"; } } echo"</select>"; echo "<br>"; ?>
Le probleme commence maintenant :

Je crée donc un personne concernéé par 3 themes par ex: T1, T2, T3

Dans ma base de données, le champ theme de cette personne contient la valeur T1, T2, T3 crée par l'implode

Je veux faire une requete cherchant les personnes concernées par T1 et T2, cette personne doit donc apparaitre dans le resultat.

Mon systeme de requete dynamique me genere une requete quand je selectionne T1 et T2 du style

Select personnne from table where theme=T1 and theme=T2

Ce qui ne me donne rien :cry:

Petite precision, tout marchait bien avant que je n'affiche les champs par defaut dans les select a choix par multiple lors de la modification.

Desolé pour le pâvé
Modifié en dernier par ed_013 le 11 août 2008, 20:19, modifié 1 fois.

ViPHP
ViPHP | 1996 Messages

11 août 2008, 20:01

Essaye avec

Code : Tout sélectionner

SELECT personnne FROM table WHERE theme = 'T1, T2'

Au fait c'est FROM et non IN
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Eléphanteau du PHP | 25 Messages

11 août 2008, 20:18

j'ai bien from, c'est pas ca le probleme

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

12 août 2008, 10:11

Le problème c'est que ton champ peut avoir pour valeur 'T1', ou 'T2', ou 'T1, T2', ou 'T2, T3', ... etc.

Si tu fais une recherche sur theme = 'T1', tu n'auras que ceux qui ont sélectionné T1 exclusivement (donc pas de 'T1, T2'). Pour les récupérer également, il te faut utiliser un LIKE et un caractère jocker à la place du "=" :

Code : Tout sélectionner

WHERE theme LIKE '%T1%' OR theme LIKE '%T2%'
Tu obtiendras ainsi tous les enregistrements pour lesquels les thèmes T1 ou T2 ont été sélectionnés :)

A noter qu'en théorie, une association de type 0..N est représenté en base de données par une table intermédiaire contenant l'id (user ?) de ta table principale et l'id du theme de l'autre. Ainsi si l'utilisateur 42 a sélectionné les thèmes T1 et T3 il y aurait deux enregistrements dans cette table : "42 ; 1" et "42 ; 3".
Cela semble un peu plus lourd à gérer, mais cela te permet de profiter de l'intégrité (en t'empêchant de supprimer un theme utilisé, ou au contraire en supprimant en cascade les enregistrements associés à celui-ci).
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...