2017-09-16 101 views
1

我不认为这是一个重复的选择,我只发现了非常相似的问题。PHP - 多值不同(安全更简单的方法)

我有4个复选框,我想,以确保它们是不同的,但我想我的“如果”是一个烂摊子。假设我有20个选择框,那么我会有一个无尽的“if”(option1!= option2 ... option20,它会是一个非常长的“if”)。

我怎么能简化这个?一个while循环或什么?

以下是我有:

PHP检查,然后将其保存:

if(($option1!=$option2 and $option1!=$option3 and $option1!=$option4) 
and ($option2!=$option1 and $option2!=$option3 and $option2!=$option4) 
and ($option3!=$option1 and $option3!=$option2 and $option3!=$option4) 
and ($option4!=$option1 and $option4!=$option2 and $option4!=$option3)) { 
//insert it to database if everything is okay... 

HTML:

<select name="option1"> 
<option value="">Choose one</option> 
<option value="1">Option A</option> 
<option value="2">Option B</option> 
<option value="3">Option C</option> 
<option value="4">Option D</option> 
... 
</select> 
<select name="option2"> 
<option value="">Choose one</option> 
<option value="1">Option A</option> 
<option value="2">Option B</option> 
<option value="3">Option C</option> 
<option value="4">Option D</option> 
... 
</select> 
<select name="option3"> 
<option value="">Choose one</option> 
<option value="1">Option A</option> 
<option value="2">Option B</option> 
<option value="3">Option C</option> 
<option value="4">Option D</option> 
... 
</select> 
<select name="option4"> 
<option value="">Choose one</option> 
<option value="1">Option A</option> 
<option value="2">Option B</option> 
<option value="3">Option C</option> 
<option value="4">Option D</option> 
... 
</select> 
+0

你不会完全说出你在处理所有这些状态。在某些情况下,你可以检查X个复选框,但是你想用状态组合来做什么?即一些组合意味着DB插入,另一种意味着鸣响喇叭等等。根据这个列表看起来像什么,一种技术是创建布尔值,将其封装以便无论您需要它。 – jdv

回答

1

如果你有20 选择与所有下拉列表他们有时间顺序name属性,如name='option1'name='option2',...,name='option20' ,那么你应该使用一个for循环是这样的:

$numSelects = 20; 
$selectValues = array(); 
$differentValues = true; 
for($i = 1; $i <= $numSelects; ++$i){ 
    if(in_array($_POST['option'.$i], $selectValues)){ 
     $differentValues = false; 
     break; 
    } 
    $selectValues[] = $_POST['option'.$i]; 
} 

if($differentValues){ 
    // all the selected values are different 
}else{ 
    // selected values are not different 
} 

$numSelects是在你的代码选择下拉列表的数量,所以你需要修改这个值,按您的代码。这个for循环在这里做的是,在for循环的每次迭代中它检查用户的选择值是否存在于$selectValues数组中,并且如果该数组已经存在于数组中,那么它将禁用$differentValues标志并从循环中跳出。而且,在每次迭代中,它都会将用户选择的值附加到$selectValues阵列中。退出循环后,可以根据$differentValues标志的状态检查所有提交的值是否不同。

+0

不错的一个!谢谢! – Jones

0

你可以做这样使用array_unique(),你可以建立在它知道哪个键是缺少合适的地方显示错误。它还允许您定义您希望检查/计数的邮件键。

<?php 

$_POST = [ 
    'name' => 'Steve McQueen', 
    'csrf' => 'y53zmSV0LhhjcjEg', 
    'option1' => '1', 
    'option2' => '3', 
    'option3' => '2', 
    'option4' => '1' 
]; 

$expected = [ 
    "option1", 
    "option2", 
    "option3", 
    "option4" 
]; 

$result = []; 
foreach ($expected as $key) { 
    $result[$key] = isset($_POST[$key]) ? $_POST[$key] : null; 
} 

$check = array_unique($result); 

if (count($check) !== count($expected)) { 
    echo 'Please only select unique choices from the options'; 
} else { 
    echo 'All good!'; 
}