Önceden seçilmiş onay kutuları olarak mysql kayıtları görüntülemek nasıl?

2 Cevap php

Ben bir tablo içinde post_tags adında bir tablo sütunu atanan etiketler @ sembolüyle ayrılmış saklanan mesajları adında var. Ben de tüm etiket isimleri saklanan bir tablo olarak adlandırılan etiketleri var. Ben daha normal bir şekilde benim veritabanı tasarımı istiyorum ama amaç için bu kolay seçenek elde etmek çalışıyorum.

Her neyse, ben ekranda onay kutuları olarak etiketler tablosundan tüm girdileri görüntülemek istiyorsanız, bu yüzden do:

    $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";

    }

Sonraki Belirli bir yazı atanan etiketler önceden olmak istiyorum. Örneğin, ben bunun en post_tags sütununda aşağıdaki ile bir yazı varsa:

Yunuslarla @ party @ plajlar @

Ben "parti", "plaj" ve varsayılan tarafından kontrol edilecek "yunus" kutularını (diğer seçenekler için onay kutularını işaretli iken) istiyorum. Bu nasıl yapılabilir?

2 Cevap

Yapılacak ilk şey, herhangi bir mevcut veri olup olmadığını görmek. Yani bu sorguyu çalıştırmak ve diyelim içine tablo hücresinin sonucunu koymak $checkedstring eğer varsayılan dize içeri koymak değil

<?php
$checkedstring = "party@beaches@dolphins@";
//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";
}


?>

İki sonuçları ve in_array() fonksiyonunu deneyin.

<?php
$tags = mysql_query("SELECT * FROM tags ORDER BY name");
$post_tags = "party@beaches@dolphins@";
$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";
}
?>

UPDATE Because of Jeff question on performance, I looked for faster solutions and using isset() is faster so this would do a faster lookup of the values. the array_flip() is 3 time less taxing than in_array():

<?php
$tags = mysql_query("SELECT * FROM tags ORDER BY name");
$post_tags = "party@beaches@dolphins@";
$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";
}
?>