在表单中使用PHP和While循环的复选框

时间:2018-08-15 23:22:02

标签: php sql checkbox while-loop

我正在尝试复制此搜索,该搜索与Select输入相同,但每个select选项均带有一个CheckBox,但它不起作用。实际上,它可以与select一起使用

<select required id="brand" name="brand" class="sm-form-control">
<option disabled value="">-- Brand--</option>
<?php
while($row= mysql_fetch_array($consult_brands)) {
echo "<option value='".$row["value"]."'>".$row["brand"]."</option>"; }
?>
</select>

您能在复选框中为我提供正确的方法吗?这个想法是,对于我在SQL中拥有的每个品牌,它都会创建一个带有值和品牌名称的复选框。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

目标HTML

<label for="Coke">Coke</label>
<input id="Coke" type="checkbox" name="brands[]" value="Coke">
<label for="Pepsi">Pepsi</label>
<input id="Pepsi" type="checkbox" name="brands[]" value="Pepsi">
<label for="Slice">Slice</label>
<input id="Slice" type="checkbox" name="brands[]" value="Slice">
<label for="Sprite">Sprite</label>
<input id="Sprite" type="checkbox" name="brands[]" value="Sprite">

在我的脑海中,您可以使用name属性的数组语法将所有品牌收集到一个数组元素中。因此,您的服务器端代码($_POSTfilter_input_array(INPUT_POST ...))将必须处理多维数组。

在PHP中动态执行一堆复选框的关键是设计服务器端代码以跟踪每个复选框的checked状态。这还要求您了解提交表单时未选中的复选框是不成功的(即,它们不提供超全局元素或超全局数组中的元素)。

此外,出于可访问性的原因,您需要考虑如何管理<label>。因此,可能需要考虑使用带有<select>属性的multiple控件,因为这样您就只需要处理一个标签即可。

一般启发式

<?php
    $brands = ['Coke', 'Pepsi', 'Slice', 'Sprite'];
    $checkboxes = [];

    foreach ($brands as $key => $brand) {
        $checkboxes[] = '<label for="' . $brand . '">' . $brand . '</label><input id="' . $brand . '" type="checkbox" name="brands[]" value="' . $brand . '">"';
    }

    $checkboxes = implode("\n", $checkboxes);
?>

<form action="/search.php" method="post">
    <?= $checkboxes; ?>
    <input type="submit" value="Search">
</form>

缺少这是checked属性的一个地方,可增强表单的粘性。 只需将处理逻辑添加到表单处理程序中,并跟踪选择了哪些品牌。然后,按如下所示运行循环逻辑。

<?php
    function isChecked($name, array $checkableControls)
    {
        if (in_array($name, $checkableControls)) {
            return ' checked="checked" ';
        }

        return '';
    }

    $brands = ['Coke', 'Pepsi', 'Slice', 'Sprite']; // From database

    // $submitted = $_POST['brands'];
    $submitted = ['Coke', 'Slice'];  // From the user during HTTP POST request

    $brandResults = search($submitted);
    $htmlBrandRecords = formatResults($brandResults);

    $checkboxes = [];

    foreach ($brands as $key => $brand) {
        $checkboxes[] = '<label for="' . $brand . '">' . $brand . '</label><input id="' . $brand . '" type="checkbox" name="brands[]" . isChecked($brand, $submitted) . value="' . $brand . '">';
    }

    $checkboxes = implode("\n", $checkboxes);
?>
<section id="search">
    <form action="/search.php" method="post">
        <?= $checkboxes; ?>
        <input type="submit" value="Search">
    </form>
    <div id="records">
        <?= $htmlBrandRecords; ?>
        <!-- Place your results here via PHP. -->
        <!-- Alternatively, send JSON to the user-agent. -->
    </div>
<section>

结论

  1. 可以轻松地对其进行编辑以与关联数组一起使用。
  2. 使用数字代码(1、2、3、4)代替文本(可乐,切片)可能会更好(从长远来看更安全)。
  3. 检查编码,过滤和验证所有用户输入。在更改上下文时(PHP-> SQL,PHP-> HTML等)正确地避免任何用户输入。
  4. 切勿直接将用户提交的数据放入您的表单中。
  5. 将代码组织成类。这样可以节省您的时间。
  6. 使用Heredoc可以避免您遭受昂贵的污染。
  7. 收集所有标签和输入,然后再通过输出缓冲区发送它们。
  8. 这是一个准系统解决方案,不完全是我要怎么做。
  9. 您可以像这样跟踪任何HTML属性(disabledclass)的状态,从而允许您通过禁用/启用控件来操纵表单,或者通过添加或删除来显示或隐藏表单元素来自class属性的CSS类。
  10. 这可以帮助您制作出真正的逐步增强的表单,可以与您的JavaScript创作相媲美(差不多;-)。
  11. 在做MVC吗?您可以制作HTML视图以补充表单的JSON视图。

答案 1 :(得分:-1)

您可以使用以下解决方案:

    while($row= mysqli_fetch_assoc($result)) {
        echo "<input type='checkbox' name='brands[]' value='".$row["value"]."'>".$row["brand"]."<br>";
    }