优化巨型if / else复杂,从$ _POST初始化变量,即使!isset

时间:2014-02-05 07:59:43

标签: php html arrays optimization

我有一个包含九个复选框的表单,每个表单都将值1传递给一个提交页面,该页面根据是否选中了复选框来更新SQL。

if (isset($_POST["cinn"])) {
    $cinn = $_POST["cinn"];
} else {
    $cinn = 0;
} if (isset($_POST["suga"])) {
    $suga = $_POST["suga"];
} else {
    $suga = 0;
} if (isset($_POST["bana"])) {
    $bana = $_POST["bana"];
} else {
    $bana = 0;
} if (isset($_POST["toba"])) {
    $toba = $_POST["toba"];
} else {
    $toba = 0;
} if (isset($_POST["spic"])) {
    $spic = $_POST["spic"];
} else {
    $spic = 0;
} if (isset($_POST["mint"])) {
    $mint = $_POST["mint"];
} else {
    $mint = 0;
} if (isset($_POST["sour"])) {
    $sour = $_POST["sour"];
} else {
    $sour = 0;
} if (isset($_POST["nutt"])) {
    $nutt = $_POST["nutt"];
} else {
    $nutt = 0;
} if (isset($_POST["glas"])) {
    $glas = $_POST["glas"];
} else {
    $glas = 0;
}

你已经知道这看起来有多糟糕了。因为我想在SQL中插入0或1,根据我的理解,我需要检查每个复选框的$ _POST名称是否有效(选中),并从中设置变量。在这里使用数组真的很不错,但由于每个复选框都有不同的名称,我认为不行。

我会喜欢下面的东西,而不是我现在拥有的垃圾:

//checkbox sends either a 1 if checked or 0 if unchecked via $_POST
//no if/else complex is needed; individual variables aren't even needed
//can just reference $_POST instead of initializing

三元运算符会减少行数,但我想象的整个布尔检查是不必要的。

$cinn = isset($_POST["cinn"]) ? $_POST["cinn"] : 0;
$suga = isset($_POST["suga"]) ? $_POST["suga"] : 0;
$bana = isset($_POST["bana"]) ? $_POST["bana"] : 0;
$toba = isset($_POST["toba"]) ? $_POST["toba"] : 0;
$spic = isset($_POST["spic"]) ? $_POST["spic"] : 0;
$mint = isset($_POST["mint"]) ? $_POST["mint"] : 0;
$sour = isset($_POST["sour"]) ? $_POST["sour"] : 0;
$nutt = isset($_POST["nutt"]) ? $_POST["nutt"] : 0;
$glas = isset($_POST["glas"]) ? $_POST["glas"] : 0;

2 个答案:

答案 0 :(得分:4)

首先,您可以实际上使用具有不同名称数组的复选框。诀窍是知道如何设置表单复选框,以允许您将所有复选框解析为单个数组。

<form action="" method="post">
<input type="checkbox" name="boxes[]" value="cinn">Cinn<br />
<input type="checkbox" name="boxes[]" value="suga">Suga<br />
<input type="checkbox" name="boxes[]" value="bana">Bana<br />
<input type="checkbox" name="boxes[]" value="spic">Spic<br />
<input type="checkbox" name="boxes[]" value="toba">Toba<br />
<input type="checkbox" name="boxes[]" value="sour">Sour<br />
<input type="checkbox" name="boxes[]" value="nutt">Nutt<br />

<input type="submit" name="Submit"/>
</form>
<?php
if ($_POST) {
    print '<pre>'; print_r($_POST); print '</pre>';
}
?>

请注意<input type="checkbox">元素的名称name="boxes[]"如何,并密切注意单词boxes[]后的开/关方括号。这将允许多个复选框值在一个数组中通过表单传递,而不是每个都作为自己的键/值对传递。这是一个至关重要的区别,不应该被忽视。

然后,您应该能够以更方便的方式处理这些复选框。与@hindmost的建议一样,您可以使用foreach循环遍历您知道要注意的复选框名称列表,然后使用变量变量动态设置新的变量名称和值。

这样可行,但我认为您需要该解决方案的唯一原因是,如果您不能将复选框本身用作数组。由于我提供的解决方案可以让您更灵活地处理数据,因此除非绝对必要,否则我不建议使用变量变量,这种情况非常罕见。我强烈建议您搜索一个更简单的解决方案,因为您可以在一个阵列中存储所有复选框数据。

答案 1 :(得分:2)

试试这段代码:

$a_fields = array('cinn', 'suga', 'bana', ...);
foreach ($a_fields as $name) {
    $$name = isset($_POST[$name])? $_POST[$name] : 0;
}