如何将mysql记录显示为预先选中的复选框?

时间:2010-03-22 20:30:59

标签: php mysql

我在名为posts的表中有一个名为post_tags的表列,其中分配的标记以@符号分隔存储。我还有一个名为tags的表,其中存储了所有标记名称。我想以更规范的方式设计我的数据库但是为了达到目的,我想要实现这个是最简单的选择。

无论如何,我想在屏幕上显示标签表中的所有条目作为复选框,所以我这样做:

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

    }

接下来,我希望预先选择分配给特定帖子的标签。例如,如果我的post_tags列中包含以下内容的帖子:

  

方@海滩@海豚@

我希望默认情况下选中“派对”,“海滩”和“海豚”复选框(而取消选中其他选项的复选框)。怎么办呢?

2 个答案:

答案 0 :(得分:1)

尝试两个结果和in_array()函数。

<?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";
}
?>

<强>更新 由于杰夫对性能的质疑,我寻找更快的解决方案,使用isset()更快,这样可以更快地查找值。 array_flip()in_array()少3倍的费用:

<?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";
}
?>

答案 1 :(得分:0)

首先要做的是查看是否有任何现有数据。因此,运行该查询并将该表格单元格的结果放入让我们说$checkedstring,如果没有,则将您的默认字符串放入。

<?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";
}


?>