在PHP中简化长IF语句

时间:2017-11-18 10:33:48

标签: php validation session conditional is-empty

以下if声明是否有更简单的格式?

if((!empty($_SESSION['email'])) && (!empty($_SESSION['serial'])) && (!empty($_SESSION['name'])) && (!empty($_SESSION['number'])) && (!empty($_SESSION['institution'])) && (!empty($_SESSION['address'])) && (!empty($_SESSION['item2']))){ 
    echo "OK u can proceed";
} else {
    echo "U didn't complete the requested info";
}

很抱歉,如果这对你来说太简单了,但非常感谢任何亲建议。

4 个答案:

答案 0 :(得分:2)

因为条件语句在第一次失败时会“短路”,所以使用迭代器重写你的进程的效率会降低。

如果您只想向用户提供广义反馈,请使用当前的方法,不要使用剩余的括号。

if(!empty($_SESSION['email']) &&
   !empty($_SESSION['serial']) &&
   !empty($_SESSION['name']) &&
   !empty($_SESSION['number']) &&
   !empty($_SESSION['institution']) &&
   !empty($_SESSION['address']) &&
   !empty($_SESSION['item2'])){
    // valid
}

或者(同样):

if(empty($_SESSION['email']) ||
   empty($_SESSION['serial']) ||
   empty($_SESSION['name']) ||
   empty($_SESSION['number']) |
   empty($_SESSION['institution']) ||
   empty($_SESSION['address']) ||
   empty($_SESSION['item2'])){
    // invalid
}

如果您希望指定失效的原因,那么您是否需要设置迭代过程。此外,如果您要执行迭代验证,您可以借此机会从邪恶行动者注入的$_SESSION数组中删除任何不需要的元素,以利用超全局上的任何未来循环。

$valid_keys=['email','serial','name','number','institution','address','item2'];
$validated=true; // default value
foreach($valid_keys as $key){
    if(!empty($_SESSION[$key])){
        $session_data[$key]=$_SESSION[$key];
    }else{
        echo "Oops, there was missing data on $key";
        $validated=false;
        break;
    }
}
if($validated){...
// from this point, you can confidently run loops on `$session_data` or slap it directly into a pdo call knowing that it has been validated and ordered.

所有这一切,如果你的$_SESSION元素有可能保持零 - 是/假y /空值,那么isset()是更好的调用(仅{{1}会被抓住)。关于NULL的另一个好处是它允许将多个变量写入单个调用并保持相同/预期的性能。

isset()

if(isset($_SESSION['email'],$_SESSION['serial'],$_SESSION['name'],$_SESSION['number'],$_SESSION['institution'],$_SESSION['address'],$_SESSION['item2'])){
    // valid
}

答案 1 :(得分:1)

您可以构建一个函数,在其中传递要检查的所有键。 我已将$_SESSION更改为$SESSION以使用某些值来欺骗数组...

<?php

$SESSION = [
    'email' => 'xx',
    'serial' => 'xx',
    'name' => 'xx',
    'number' => 'xx',
    'institution' => 'xx',
    'address' => 'xx',
    'item2' => 'xx'
];

$keys = [
    'email',
    'serial',
    'name',
    'number',
    'institution',
    'address',
    'item2'
];

if(isNotEmpty($SESSION, $keys)) {
    echo "OK u can proceed";
} else {
    echo "U didn't complete the requested info";
}

function isNotEmpty($array, $keys) {
    foreach($keys as $key) {
        if(empty($array[$key])) {
            return false;
        }
    }

    return true;
}

PHP Fiddle

答案 2 :(得分:0)

只是&#34;介意游戏&#34;

$arr = array_flip('email', 'serial', 'name','number'...);
if (count(array_filter(array_intersect_key($_SESSION, $arr))) == count($arr)) {

答案 3 :(得分:0)

这只是我的意见,但我认为你的表达很好。也许你可以用另一种方式对其进行格式化以使其更具可读性:

if ( !empty($_SESSION['email']) && 
     !empty($_SESSION['serial']) && 
     !empty($_SESSION['name']) && 
     !empty($_SESSION['number']) && 
     !empty($_SESSION['institution']) && 
     !empty($_SESSION['address']) &&
     !empty($_SESSION['item2']) ) {

     /* Proceed */

} else {

     /* Don't proceed */

}

或者可以使用自定义验证功能:

/* My original version */
function filled_required_fields($fields, $array) {
    $valid = true;
    foreach ($fields as $field) {
        $valid = $valid && !empty($array[$field]);
        if (!$valid) return false;
    }
    return $valid;
}

/* Cleaner solution based on @caramba's answer */
function filled_required_fields($fields, $array) {
    foreach ($fields as $field) {
        if (empty($array[$field])) return false;
    }
    return true;
}


if (filled_required_fields(['email', 'serial', 'name', 'number', 'institution', 'address', 'item2'], $_SESSION) {

    /* Proceed */

} else {

    /* Don't proceed */
}