Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.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_If Statement - Fatal编程技术网

PHP:构造IF子句的最有效方法

PHP:构造IF子句的最有效方法,php,if-statement,Php,If Statement,我正在寻找一种利用“不要重复自己”的枯燥原则来构造if子句的方法 这项工作涉及的脚本大约有15年的历史,并且使用globals等进行了糟糕的编码,我被要求将此脚本/站点拖到21世纪-但是由于时间和成本的限制,我无法从头开始进行完整的站点重写,尽管我知道这样会更好 我有一个以前是全局值的值,我不知道它来自哪里,它可能来自不同的页面的不同位置 我有一些活动正在检查$\u POST或$\u GET数据中的输入值,如果输入值为空(或无效),则检查该值是否实际位于$\u会话中。如果输入值仍然为空(或无效)

我正在寻找一种利用“不要重复自己”的枯燥原则来构造
if
子句的方法

这项工作涉及的脚本大约有15年的历史,并且使用globals等进行了糟糕的编码,我被要求将此脚本/站点拖到21世纪-但是由于时间和成本的限制,我无法从头开始进行完整的站点重写,尽管我知道这样会更好

我有一个以前是全局值的值,我不知道它来自哪里,它可能来自不同的页面的不同位置

我有一些活动正在检查
$\u POST
$\u GET
数据中的输入值,如果输入值为空(或无效),则检查该值是否实际位于
$\u会话中。如果输入值仍然为空(或无效),则引导到另一页

我的代码如下:

$userId = $_REQUEST['userid'];
if (empty($userId)) {
    $userId = $_SESSION['userid'];
    }
if(empty($userId) || !is_numeric($userId))
    {
    header("Location:contactdetails.php");
    die();
    }
我重复两次
empty()
函数,我可以将两个IF都包装到一行中,但是需要一个IF来将
请求
会话
中的值传递到
$userId
变量中


是否有(更好的)方法可以检查两个可能的输入,以查看此[以前的全局]'['userid']'变量来自何处,并将该值应用于页面本地
userid
变量

如果仅在请求或会话中设置该值,则对可能的值进行解析并验证一次。

如果仅在请求或会话中设置该值,则对可能的值进行解析并验证一次。

您应该对双向语句使用If-else,并对n-way语句使用开关声明

swicth($myVar){
case 1: doX();break;
case 'a': doY();break;
case 2: doZ();break;
default: doA();
}

对于双向语句应该使用if-else,对于n向语句应该使用开关

swicth($myVar){
case 1: doX();break;
case 'a': doY();break;
case 2: doZ();break;
default: doA();
}
您可以使用。如果第一个表达式的计算结果为true,则将使用它,否则将使用后一个表达式。在这种情况下,
$\u请求
超全局优先,就像问题中的代码一样:

$userId = $_REQUEST['userid'] ?: $_SESSION['userid'];
if (empty($userId) || !is_numeric($userId)) {
    header("Location:contactdetails.php");
    exit;
}
然而,正如哈夫纳德在上面的评论中所说,盲目信任请求数据可能是一个安全问题

还请注意,如果任何用户ID为
0
,则该条件为真,在这种情况下,
null
检查会更好:

$userId = $_REQUEST['userid'] ?: $_SESSION['userid'];
if ($userId === null || !is_numeric($userId)) {
    header("Location:contactdetails.php");
    exit;
}
当然,这是假设您在
$\u会话中没有将falsy值存储为非空值。

您可以使用。如果第一个表达式的计算结果为true,则将使用它,否则将使用后一个表达式。在这种情况下,
$\u请求
超全局优先,就像问题中的代码一样:

$userId = $_REQUEST['userid'] ?: $_SESSION['userid'];
if (empty($userId) || !is_numeric($userId)) {
    header("Location:contactdetails.php");
    exit;
}
然而,正如哈夫纳德在上面的评论中所说,盲目信任请求数据可能是一个安全问题

还请注意,如果任何用户ID为
0
,则该条件为真,在这种情况下,
null
检查会更好:

$userId = $_REQUEST['userid'] ?: $_SESSION['userid'];
if ($userId === null || !is_numeric($userId)) {
    header("Location:contactdetails.php");
    exit;
}

当然,这是假设您在
$\u会话中不将falsy值存储为非空值。

这里要解决两个不同的问题。首先是默认问题,其次是过滤问题。依次进行

对于默认设置,您可以实现一个简单的“如果存在数组,则从数组中获取默认值”帮助程序:

然后,可以使用此帮助器提供默认链接:

$userId = array_get($_REQUEST, 'userid', $_SESSION['userid']);
对于筛选,您可以从这个链中知道,您已经从两个数组中的一个得到了null或值。由于您正在寻找表面上的数据库ID,我喜欢这样的函数:

function is_id_like($it) {
    $rc = filter_var($it, FILTER_VALIDATE_INT, array ('options' => array (
        'default' => false, 'min_range' => 1,
    )));
   return (false === $rc ? false : true);
}
这将确保您给它的数字看起来像一个整数,等于或大于1,如果不是,则返回
false
。所以所有这些都通过了:
1
“1”
,和
“1.0”
,但都失败了:
0
“1.1”


结合这些,并允许会话没有用户ID:

$userId = array_get($_REQUEST, 'userid', array_get($_SESSION, 'userid'));
if (! is_id_like($userId)) {
    header('Location: contactdetails.php');
    die();
}

检查总数已更改为一个
array\u key\u exists
和一个
filter\u var
,但代码的可读性大大提高,这些方法可以在整个代码库中重复使用。

这里有两个不同的问题需要解决。首先是默认问题,其次是过滤问题。依次进行

对于默认设置,您可以实现一个简单的“如果存在数组,则从数组中获取默认值”帮助程序:

然后,可以使用此帮助器提供默认链接:

$userId = array_get($_REQUEST, 'userid', $_SESSION['userid']);
对于筛选,您可以从这个链中知道,您已经从两个数组中的一个得到了null或值。由于您正在寻找表面上的数据库ID,我喜欢这样的函数:

function is_id_like($it) {
    $rc = filter_var($it, FILTER_VALIDATE_INT, array ('options' => array (
        'default' => false, 'min_range' => 1,
    )));
   return (false === $rc ? false : true);
}
这将确保您给它的数字看起来像一个整数,等于或大于1,如果不是,则返回
false
。所以所有这些都通过了:
1
“1”
,和
“1.0”
,但都失败了:
0
“1.1”


结合这些,并允许会话没有用户ID:

$userId = array_get($_REQUEST, 'userid', array_get($_SESSION, 'userid'));
if (! is_id_like($userId)) {
    header('Location: contactdetails.php');
    die();
}

检查总数已更改为一个
array\u key\u exists
和一个
filter\u var
,但代码的可读性大大提高,这些方法可以在整个代码库中重用。

如果保证设置
$\u会话['userid']
,这似乎是一种干净的方法。否则,您必须对
$\u请求
$\u会话
执行必要的检查,以确保
$userId
设置正确:

if (isset($_REQUEST['userid']) && is_numeric($_REQUEST['userid']))
    $userId = $_REQUEST['userid'];
else if (isset($_SESSION['userid']) && is_numeric($_SESSION['userid']))
    $userId = $_SESSION['userid'];
else // no acceptable value for $userId in sight
{
    header("Location: contactdetails.php");
    exit;
}

您可能还需要重新考虑使用
is_numeric()
,因为它对任何格式的数字表示都验证为
true
,而不是像您预期的那样仅验证正整数。

如果
$\u会话['userid']
保证设置,那么这似乎是一种干净的方法。否则,您必须对
$\u请求
$\u会话
执行必要的检查,以确保
$userId
设置正确:

if (isset($_REQUEST['userid']) && is_numeric($_REQUEST['userid']))
    $userId = $_REQUEST['userid'];
else if (isset($_SESSION['userid']) && is_numeric($_SESSION['userid']))
    $userId = $_SESSION['userid'];
else // no acceptable value for $userId in sight
{
    header("Location: contactdetails.php");
    exit;
}
您可能还需要重新考虑使用
is\u numeric()
,因为它验证为
true