在我的一个项目中,我使用一系列页面,每个页面都提供下一个项目使用的信息,包括POST和会话变量。简单示例:
第1页:输入名称->第2页显示名称;询问出生日期->第3页显示姓名和出生日期。
如果用户直接转到第3页,我想显示一条消息,说明他/她没有输入姓名和/或出生日期,应该再试一次。目前我仍然这样做。在第2页:
if (isset($_POST['name'])) $_SESSION['name'] = $_POST['name'];
和第3页:
if (isset($_SESSION['name'])) $name = $_SESSION['name'];
if (isset($_POST['bday'])) $_SESSION['bday'] = $_POST['bday'];
作为声明,并在正文中使用类似的if子句
if (isset($name) && isset($_SESSION['bday'])) {
// do main stuff
else {
// display error message
}
这个例子很简单,但在现实世界中,我的代码有更多来自表单的变量和数据,把所有这些先放在变量赋值中,然后放在if子句中很累,对我来说似乎效率不高。有更好、更直接的方法来检查这样的事情吗?还是我发布的内容是最好、最常用的方式?
您可以使用对isset的一次调用来检查多个变量。
isset($_SESSION['name'], $_SESSION['bday'], ...)
或者你可以像一样编写自己的函数
if (variablesFilled(['name', 'bday', ...])) { }
function variablesFilled($array) {
foreach ($array as $entry) {
if (!isset($_SESSION[$entry])) {
return false;
}
}
return true;
}
我认为您只需要编写一些辅助方法。一个是将$_POST
数据重写为$_SESSION
,如下所示:
function copyPostToSession(array $fields) {
foreach($fields as $field) {
if(isset($_POST[$field])) {
$_SESSION[$field] = $_POST[$field];
}
}
}
所以不用if
森林,而是使用
copyPostToSession(array('name','bday'));
(此外,您可以计算有多少字段存在,如果不匹配,则返回true
或false
),另一个(非常相似)用于检查您是否在$_SESSION
中获得了所有所需的数据。
PHP的isset()函数是一个可变函数。你可以提出任意多的论点:
isset($a, $b, $c)
翻译过来就是:
isset($a) && isset($b) && isset($c)
希望它能有所帮助!
在每台服务器的情况下,分离函数往往会有所不同。你可以尝试多次计算执行一个函数的时间,然后比较哪个更快。
但是,是的,这看起来是相当快的代码。
也许值得尝试切换案例语句作为替代方案?