我在名为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列中包含以下内容的帖子:
方@海滩@海豚@
我希望默认情况下选中“派对”,“海滩”和“海豚”复选框(而取消选中其他选项的复选框)。怎么办呢?
答案 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";
}
?>