Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
简化PHP中的长IF语句_Php_Validation_Session_Conditional_Is Empty - Fatal编程技术网

简化PHP中的长IF语句

简化PHP中的长IF语句,php,validation,session,conditional,is-empty,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['addr

下面的
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";
}
如果这对你来说太简单了,很抱歉,但是非常感谢任何专业人士的建议。

只是“心理游戏”


您可以构建一个传递所有要检查的键的函数。 我已将
$\u 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;
}

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

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 */
}

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

如果您只想向用户提供一般性反馈,请使用当前方法,而不使用多余的括号

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

只有当您希望指定失效的原因时,才应该费心设置一个迭代过程。此外,如果要执行迭代以进行验证,则可以借此机会从
$\u会话
数组中删除任何不需要的元素,这些元素可能是邪恶势力为了利用超全局上的任何未来循环而注入的

$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.

综上所述,如果您的
$\u会话
元素有一点点可能会持有零ish/false-y/empty值,那么最好的调用就是(只有
NULL
会被捕获)。
isset()
的另一个好处是,它允许在单个调用中写入多个变量,并保持相同/预期的性能

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



你为什么不来一个
!空($\u会话)这不是等效的,@Akintunde。如果在
$\u会话中有更多信息怎么办?它不会是空的,但可能需要的值是空的。我试过了!空($\u会话),它不像我期望的那样工作。我认为这意味着:只要它不是空的,就有十分之一的参数存在。但我想要的是,10个参数中有10个必须满足。我应该问你是否知道
empty()
关于零ish、空ish值的假设。是否有可能通过这些元素传递有效值,从而导致
empty()
发生意外故障?如果您不确定我的意思,请阅读本手册:我不建议依赖
array\u filter()
的默认/贪婪行为来过滤
$\u会话
数组。您预计会出现什么问题?猴子扭动值:
$\u会话['number']='0'
也许你可以这样减少函数调用:
如果(array\u intersect\u key($arr,$\u SESSION)==$arr){
?嗯,等等,我的错。这是
empty()的默认行为
也是。没有意外的丢失。循环中没有早期的
中断;
。@mickmackusa你认为更好吗?那很干净……等一下,你需要将超全局变量传递给函数还是它已经可用。另外,将
$\u会话
传递给函数可以重用该函数来检查其他数组。@Micku正如你所评论的那样,这是一个很好的转折点,但它可以写得更干净。谢谢你的评论@mickmackusa!我相信它可以更干净。我鼓励你写一个答案,这样我们都可以学到一些东西!:)我不知道,不是我的。但可能不应该复制别人的方法。第三种方法是否有效可以告诉用户哪个部分未完成?是的,如果您想高度了解失效原因,可以使用该选项。有时您想提供信息,有时出于安全目的,您想对该信息保密。
$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.
if(isset($_SESSION['email'],$_SESSION['serial'],$_SESSION['name'],$_SESSION['number'],$_SESSION['institution'],$_SESSION['address'],$_SESSION['item2'])){
    // valid
}
if(!isset($_SESSION['email'],$_SESSION['serial'],$_SESSION['name'],$_SESSION['number'],$_SESSION['institution'],$_SESSION['address'],$_SESSION['item2'])){
    // invalid
}