8 回答
如果您的表单是动态生成的,您可以包含一个具有相同名称的隐藏表单元素,其中包含一个虚拟值。然后,只需忽略虚拟值,如果您为该变量获得的值是,['dummy_value']那么您可以将其视为代码中的“未选择任何内容”。
如果在多选元素之前添加隐藏输入,如果没有选择多选项目,它将发送隐藏输入值。但是,一旦您选择了一个选项,就会使用该选定的值。
通过这种方式,我能够区分 Laravel/php 中的 2 个不同场景,即:
- 将所有设置
myitems为空(需要隐藏输入,因此 PHP 会收到一个空字符串myitems) - 无需触摸即可更新模型的其他属性(因此不包括表单的
myitems任何输入。PHP 不会收到密钥)myitemsmyitems
示例代码:
<input type="hidden" name="myitems" value="" />
<select name="myitems[]" multiple>
<option value="1">Foo</option>
<option value="2">Bar</option>
</select>
您是否有理由不能将未设置数组的情况视为发送时没有内容?
if (!isset($_POST['eng_0']))
$_POST['eng_0'] = array();
编辑:
只要表单中出现多项选择,就添加一个隐藏字段:
<input type="hidden" name="eng_0_exists" value="1"/>
然后检查:
if (!isset($_POST['eng_0']) && isset($_POST['eng_0_exists']))
$_POST['eng_0'] = array();
您可以添加 - 请选择 - 条目并预选它。
<select id="eng_0" name="eng_0[]" multiple size="3">
<option value="nothing" selected="selected">- please select -</option>
<option value="Privilégier">Privilégier</option>
<option value="Accepté">Accepté</option>
<option value="Temporaire">Temporaire</option>
</select>
添加类似的东西
$("#field").change(function() {
if (($("#field").val() || []) == "") $("form").append("<input type='hidden' name='field' value=''>");
});
如果即使用户选择了它,在 $_POST 中也没有任何关于选择的信息怎么办?
<form action="cart.php" method="POST">
<input type="hidden" id="acao" name="acao" value="add" />
<input type="hidden" id="id" name="id" value="<?=$cnt->cnt_codigo?>" />
<?php
$resOpc = mysql_query("SELECT * FROM loja_opcionais ORDER BY descricao")or die(mysql_error());
if(mysql_num_rows($resOpc) > 0){
?>
<select id="opcional" nome="opcional">
<?php
while($opc = mysql_fetch_object($resOpc)){
?>
<option value="<?=$opc->descricao?>"><?=$opc->descricao?></option>
<?php
}
?>
</select>
<?php
}
?>
<button class="botao" type="submit">Adicionar ao Carrinho</button>
</form>
当我做 print_r($_POST); 另一方面,输出很简单:数组( [acao] => add [id] => 3 )并且没有选择标记的符号,即使我更改了另一侧的值;
如果没有 $_POST,Post 一个空字符串(什么都没有)绝对是最简单的解决方案。
这是我的表单解决方案<select name="related[]" multiple>
只需在处理表单存储的 php 部分添加以下行:
if (!isset($_POST['related'])) $_POST['related']="";
包括在您的表单中,其中名称与您选择<input type="hidden" name="yourfield" value="" />的名称相同。multiple="multiple"
不幸的是,浏览器不会multiple="multiple"像非多重选择或普通输入那样为选择发送空表单参数。
使用已接受答案中提出的虚拟值不是一个非常干净的解决方案。
(这个问题与jQuery无关)