在表单中使用PHP和While循环的复选框
我试图复制这个搜索,我用一个选择输入,但每个选择选项都有一个复选框,但它不起作用。它实际上与select一起工作在表单中使用PHP和While循环的复选框,php,sql,checkbox,while-loop,Php,Sql,Checkbox,While Loop,我试图复制这个搜索,我用一个选择输入,但每个选择选项都有一个复选框,但它不起作用。它实际上与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
<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中的每个品牌,它都会创建一个带有值和品牌名称的复选框
谢谢您的帮助。您可以使用以下解决方案:
while($row= mysqli_fetch_assoc($result)) {
echo "<input type='checkbox' name='brands[]' value='".$row["value"]."'>".$row["brand"]."<br>";
}
目标HTML
这里缺少一个用于提升表单粘性的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、3、4而不是文本Coke,从长远来看,Slice可能更好、更安全。
检查编码、筛选和验证所有用户输入。正确地转义任何用户输入,因为它改变了上下文PHP->SQL、PHP->HTML等。。。。
切勿直接将用户提交的数据放入表单中。
将代码组织到类中。这会节省你的时间。
使用heredoc可以避免你做昂贵的扭伤。
在通过输出缓冲区发送之前,收集所有标签和输入。
这是一个简单的解决方案,不完全是我应该怎么做的。
您可以跟踪任何禁用的HTML属性(类)的状态,这样的类允许您通过禁用/启用控件来操作表单,或者通过在类属性中添加或删除CSS类来显示或隐藏表单元素。
这可以帮助您制作真正逐步增强的表单,几乎可以与您的JavaScript创作相媲美。
做MVC?您可以创建HTML视图来补充表单的JSON视图。
复选框“”不是由元素生成的。确保正确设置复选框HTML的格式。你所问的是离题的,有几个原因。我认为现在是你浏览帮助区的好时机,如果你还没有浏览过帮助区以及其中的相关链接的话。通读一遍,您将看到这里的堆栈溢出是如何工作的。这将给你一个好主意,如何制定一个好的问题,看看什么可以和不应该被问,以及什么是期望从你。这是为了帮助您在堆栈溢出方面有一个更好、积极的体验,这是每个人都想要和追求的。我很好地理解这个问题。您缺少标签。也不需要关闭选项标签。@Jonathan。。。很好的观察。我错过了。我已经修好了。谢谢。@AnthonyRutledge。。。我们这里不需要标签。品牌名称已被输出。@AnthonyRutledge。。。可以我同意你的看法。“需要”是一个强有力的词。谢谢。不要使用\n,请使用PHP常量PHP\u EOL,以实现跨平台兼容性。此外,对于复选框输入,如果存在选中属性,则将选中该属性,无论为其分配了什么值,例如,checked=false。这是一个非常常见的错误。PHP_EOL也显示为新行。它可能是\n或\r\n,具体取决于操作平台。有关属性问题,请参阅HTML spec/MDN文档。在这种情况下,所有输出的内容都将发送给web浏览器。平台是用户代理,在这种情况下,\n将在相关环境下工作,因为其上下文是浏览器中的视图源。PHP_EOL用于操作系统级别的遵从性,在本例中,这不会影响用户代理的上下文。试试看。你会看到的。虽然HTML不需要换行符,但它只是使查看源代码更容易。我知道W3C的HTML5规范是怎么说的。它没有说一致性意味着什么,但我说它确实意味着什么。@Raptor checked属性的语法是我唯一关心的。我现在关注的是服务器端问题,但返回checked而不是整个语法checked=checked时确实出错。尽管如此,您可以用更少的内存检查可检查控件。如果你对PHP_EOL和查看源代码有兴趣,一定要告诉我。
<?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>
<?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>