2010-03-22 2 views
1

J'ai une colonne de table appelée post_tags dans une table appelée posts où les étiquettes affectées sont stockées séparées par le symbole @. J'ai aussi une table appelée tags où tous les noms de tag sont stockés. Je voudrais concevoir ma base de données d'une manière plus normalisée mais dans le but que j'essaye de réaliser ceci est l'option la plus facile.Comment afficher les enregistrements mysql en tant que cases à cocher présélectionnées?

Quoi qu'il en soit, je veux afficher sur l'écran toutes les entrées de la table des balises comme des cases à cocher, donc je fais:

$query = mysql_query("SELECT * FROM tags ORDER BY name"); 

    while ($row = mysql_fetch_assoc($query)) { 

     $tag = $row['name']; 

     echo "<input type='checkbox' name='tags[]' value='$tag' />\n"; 

    } 

Ensuite, je veux avoir les balises qui sont affectés à un poste en particulier présélectionné . Par exemple, si j'ai un poste avec ce qui suit dans c'est la colonne post_tags:

partie @ plages @ dauphins @

Je veux que le « parti », « plages » et les cases à cocher « dauphin » à être coché par défaut (alors que les cases à cocher des autres options ne sont pas cochées). Comment cela peut-il être fait?

+0

Je ne suis pas sûr que vous voulez avoir une colonne comme post_tags au lieu d'utiliser une table d'intersection. Mais si vous le faites vraiment, vous aurez juste besoin de faire plus de traitement lorsque vous extrayez des données. –

Répondre

0

La première chose à faire est de voir s'il y a des données existantes. Donc exécuter cette requête et mettre le résultat de cette cellule de table en laisse dire $checkedstring sinon, mettez votre chaîne par défaut dans.

<?php 
$checkedstring = "[email protected]@[email protected]"; 
//Pull from DB if exsists and set $checkedstring to that value 
/// 
$checkeditems = explode ("@" , $checkedstring); 
$checked = array(); 
foreach($checkeditems as $item) 
{ 
    $checked[$item]=true; 
}  

$query = mysql_query("SELECT * FROM tags ORDER BY name"); 

while ($row = mysql_fetch_assoc($query)) 
{ 
    $tag = $row['name']; 
    $checkedstatus = ''; 
    if($checked[$tag]) 
    { 
     $checkedstatus = "checked='checked'"; 
    } 
    echo "<input type='checkbox' name='tags[]' value='$tag' $checkedstatus />\n"; 
} 


?> 
+0

Merci beaucoup sooooooooooooooooooooooo !!! – Jennifer

1

essayer les deux résultats et la fonction in_array().

<?php 
$tags = mysql_query("SELECT * FROM tags ORDER BY name"); 
$post_tags = "[email protected]@[email protected]"; 
$arr_tags = explode("@", $post_tags); 

while ($row = mysql_fetch_assoc($query)) { 
    $check = in_array($arr_tags, $row['name'])? 'checked="checked"' : ""; 
    echo '<input type="checkbox" name="tags[]" value="'.$row['name'].'" '.$check.' />'; 
    echo "\n"; 
} 
?> 

MISE À JOUR En raison de la question Jeff sur la performance, je cherchais des solutions plus rapides et l'utilisation isset() est plus rapide donc ce serait faire une recherche plus rapide des valeurs. le array_flip() est 3 fois moins éprouvant que in_array():

<?php 
$tags = mysql_query("SELECT * FROM tags ORDER BY name"); 
$post_tags = "[email protected]@[email protected]"; 
$arr_tags = array_flip(explode("@", $post_tags)); 

while ($row = mysql_fetch_assoc($query)) { 
    $check = isset($arr_tags[$row['name']])? 'checked="checked"' : ""; 
    echo '<input type="checkbox" name="tags[]" value="'.$row['name'].'" '.$check.' />'; 
    echo "\n"; 
} 
?> 
+0

Quel est le surcoût de la fonction in_array? Est-ce qu'il scanne tout le tableau à chaque fois? –

+0

J'ai testé sur ma machine avec des résultats de requête de taille moyenne et il a fonctionné 0,25 secondes –

+0

Votre mise à jour est superbe, quand je regardais plus à l'in_array, il balayerait le tableau à chaque fois dans la boucle afin que le nombre d'étiquettes augmente avoir des problèmes mais le flip et isset semble beaucoup mieux. –

Questions connexes