更新 PHP 中已选中的复选框
Posted
技术标签:
【中文标题】更新 PHP 中已选中的复选框【英文标题】:Updating Already Checked Checkboxes in PHP 【发布时间】:2012-05-03 07:55:54 【问题描述】:假设我有一个用户选择的复选框列表。
<input type="checkbox" name="utility[]" id="utility[]" value="Water" />Water<br />
<input type="checkbox" name="utility[]" id="utility[]" value="Cable" />Cable<br />
<input type="checkbox" name="utility[]" id="utility[]" value="Electricity" />Electricity<br />
etc...
用户选择了水并将其添加到数据库中。现在用户想要更新列表:
<input type="checkbox" name="utility[]" id="utility[]" value="Water" checked="checked"/>Water<br />
<input type="checkbox" name="utility[]" id="utility[]" value="Cable" />Cable<br />
<input type="checkbox" name="utility[]" id="utility[]" value="Electricity" />Electricity<br />
etc...
如何检查该实用程序是否已在 php 中检查?
【问题讨论】:
【参考方案1】:我过去所做的,为了节省数百行的臃肿是这样的......
首先编译一个变量中的所有html,没有任何“检查”的实例。
$boxes = '';
$boxes .= '<input type="checkbox" name="utility[]" id="utility[]" value="Water" />Water<br />';
$boxes .= '<input type="checkbox" name="utility[]" id="utility[]" value="Cable" />Cable<br />';
$boxes .= '<input type="checkbox" name="utility[]" id="utility[]" value="Electricity" />Electricity<br />';
现在我遍历您的字段数组进行检查。我在这里也提供了一个示例数组。
$already_checked = array('Water', 'Electricity');
foreach( $already_checked as $ac )
$find = 'value="' . $ac . '"';
$replace = $find . ' checked="checked"';
$boxes = str_replace($find, $replace, $boxes);
echo $boxes;
【讨论】:
这行得通,但它不直观,也不是特别有效。对字符串进行线性搜索几乎没有比包罗万象的方法或结构良好的if
语句更好或更高效的解决方案。
斯图尔特,你没抓住重点。使用上述方法(即作为纯 html)维护大量复选框列表比为每个输入编辑单独的 if 语句要容易得多。我同意从技术上讲它是一种更暴力的方法,但它使代码更干净。
但是您必须在每个实例中手动列出已检查的数组。更好的解决方案是动态生成它(以及复选框本身),这样以后的任何更改或添加都不需要手动重写数组或表单元素值。【参考方案2】:
你可以这样做:
<input type="checkbox" name="utility[]" value="Water"
<?= in_array('Water', $utilities) ? 'checked="checked"' : '' ?>"
/>
(上面的$utilities
变量是$_REQUEST['utilities']
之类的替代变量,具体取决于代码的结构。)
【讨论】:
与在每个复选框表单中都有一个 if 语句相比,有什么不同的方法吗?我有大约 50 个,这似乎效率低下。 为了提高效率,您可以将所有复选框值拉入一个布尔数组(假设没有数千个)。然后你可以这样做:<?= $values['Water'] ? 'checked="checked" : '' ?>
但是,您实际上需要一个 if
或每个 input
的三元运算符。不过,这并不意味着它效率低下,因为它们是非常简单的运算符。性能问题只是您如何从数据库中提取数据。【参考方案3】:
喜欢吗?
<input type="checkbox" name="utility[]" id="utility[]" value="Water"
<?php
if(isAlreadyChecked("Water"))
echo "checked=\"checked\""
?>
/>Water<br />
<?php
function isAlreadyChecked(value)
//Check if it is already checked and return a boolean
?>
【讨论】:
正如我在下面所说的,有没有更有效的方法,你能想到吗?我现在正在努力思考。【参考方案4】:我尝试了in_array
条件的所有变体,但永远无法让它工作(检查其值先前已被选中并因此插入数据库的复选框)。我尝试使用表连接进行复杂查询,但也没有运气。我最终放弃并生成了一个 display:hidden
div
打开数组(出于某种奇怪的原因,我不得不 IMPLODE 而不是爆炸)并将其项目列为逗号分隔的文本。然后我加入了一点 jQuery indexOf()
魔法来确定每个复选框的值是否是所述数组的一部分。用 jQuery 花了我 10 分钟的时间,非常简单。
这里有一些可以正常运行的示例代码:
<div class="categories">
<span class="keywords"><?php $categories = array(); $categories = implode(', ', $keywords); echo $categories ?></span>
<em>Please verify category selections with each update.</em><br/>
<?php
include 'db.php';
$sql = mysqli_query($con,"SELECT * FROM categoriesTable ORDER BY Category_Name ASC");
while ($row = mysqli_fetch_assoc($sql))
$key = urldecode($row['Category_Name']);
$id = urlencode($row['catID']);
echo "<input type='checkbox' name='Category_Key[]' value='$id' id='cat_$id' $chk> $key<br/>";
?>
</div>
CSS 将该 div 设置为不可见:
.keywords display:none; visibility:hidden;
和 jQuery 部分:
$(document).ready(function()
$('.categories input').each(function(index,data)
var str=$('.keywords').text();
var catid = $(this).val();
var chk = str.indexOf(catid);
if (chk >= 0)
$(this).prop('checked', true);
);
);
我希望这可以帮助那些想知道为什么 in_array
条件失败的人。由于这属于数据和 UI 之间关于数据持久性的暮光区,我认为这是一条合法的路线。您有一个“回声”语句来生成多个复选框(在我的情况下,这里大约有 40 个类别),然后是一个简单的 jQuery .each()
来定位之前选择的内容并将其对应的框呈现为选中状态。
【讨论】:
以上是关于更新 PHP 中已选中的复选框的主要内容,如果未能解决你的问题,请参考以下文章
如何根据复选框更新数据库值? jQuery/php/ajax
如果选中则如何更新数据库1的复选框值,如果未选中则更新为0?
如何根据复选框更新数据库值? jQuery的/ PHP / AJAX