检查用户输入

时间:2011-03-09 19:00:28

标签: php

我正在创建一个应该以这种方式调用的编辑页面:

users.php?action=edit&id=5

这是我的代码:

} elseif (isset($_GET['action']) && $_GET['action'] == 'edit' && isset($_GET['id']) && is_numeric($_GET['id']) && $_GET['id'] > 0) {

如你所见,它很长。首先需要使用isset进行检查。我知道你可以把它排除在外,但是当错误报告设置为'E_ALL'时,我会收到PHP通知。

我可以创建一个函数来缩短它,但是这样我需要创建太多函数,因为我在脚本中的不同位置都有这样的代码,每个函数都需要不同的信息。

有没有办法缩短这段代码?

谢谢!

3 个答案:

答案 0 :(得分:4)

因为可能会使用action和id,所以也可以将它们设置在脚本的顶部:

$action = !empty($_GET['action'])?$_GET['action']:false;
$id = !empty($_GET['id'])?$_GET['id']:false;

switch ($action) {
    case 'edit':
          if ($id !== false) {
               //processing here
          }
    break;
    default:
          echo 'No known action was passed through';
}

初始变量声明使用ternary运算符作为fyi缩短if/else


额外信息

我更喜欢这种方法,因为它更容易阅读,而且你不必考虑你的逻辑,所以它会更容易出错。

答案 1 :(得分:0)

您可以编写一个带有一组键的函数:

function check_get_params($keys) {
   foreach ($keys as $key) {
     if (! isset($_GET[$key]) ) {
       return false;
     }
   }
   return true;
}

然后您的上一行将是:

} elseif (check_get_params(array('action', 'id')) && $_GET['action'] == 'edit' && is_numeric($_GET['id'])) {

这将更清洁:

} elseif (check_get_params(array('action', 'id'))) {
  if ($_GET['action'] == 'edit' && is_numeric($_GET['id'])) {

答案 2 :(得分:0)

我会先检查参数:

$action = (isset($_GET['action']) && !empty($_GET['action'])) ? $_GET['action'] : false;
$id = (isset($_GET['id']) && !empty($_GET['id'])) ? $_GET['id'] : false;
settype($id, 'int'); // "123" became 123(int)

然后继续:

} elseif ($action && $id && $action == 'edit' && $id > 0) {
    // here we are
}