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