更新 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 个,这似乎效率低下。 为了提高效率,您可以将所有复选框值拉入一个布尔数组(假设没有数千个)。然后你可以这样做:&lt;?= $values['Water'] ? 'checked="checked" : '' ?&gt; 但是,您实际上需要一个 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?

未选中 POST PHP 时复选框不保存 [重复]

如何根据复选框更新数据库值? jQuery的/ PHP / AJAX

即使未从 HTML 检查到 PHP,如何获取所有复选框变量?

PHP:如何存储和复选框值并更新它们