0

我正在为我的朋友和我自己设计一个网站的小项目。我目前正在构建用户注册系统,并且想知道我检查用户条目的方式是否是最好的。

嗯,忽略 api 的东西,它是前夕的,可能无关紧要。

我有elses计划。

从本质上讲,我想知道这在……一切方面是否可以接受。如果没有,我能做些什么来改善这一点。

我是 PHP 新手,请善待 :)

所以,这就是我目前正在使用的:

if (!empty($_POST['username'])
&& !empty($_POST['password1'])
&& !empty($_POST['password2'])
&& !empty($_POST['email1'])
&& !empty($_POST['email2'])
&& !empty($_POST['keyID'])
&& !empty($_POST['vCode'])
){
 $api = new EVEAPI();
 if ($api->getCharacterID($_POST['username']) != 0){

     //The username is valid.

     if ($_POST['password1'] == $_POST['password2']){

         //Passwords match.

         if ($_POST['email1'] == $_POST['email2']
             && filter_var($_POST['email1'], FILTER_VALIDATE_EMAIL)
             ){

             //Emails match and are in valid format.

             if ($api->isValidAPI($_POST['keyID'], $_POST['vCode'])){

                 //If the API returns something that is not an error, continue.

                 $xml = $api->getAPIKeyInfo($_POST['keyID'], $_POST['vCode']);
                 if ($xml->result->key->attributes()->type == 'Account'){

                     //If the 'type' of the returned API info is 'Account', continue.

                     foreach ($xml->result->key->rowset->row as $apiRow){
                         $charID = (int) $apiRow->attributes()->characterID;
                         if ($charID == $api->getCharacterID($_POST['username'])){

                             //DO SOMETHING WITH INFO

                         }
                         else{
                         }
                     }
                 }
                 else{
                 }
             }
             else{
             }
         }
         else{
         }
     }
     else{
     }
 }
 else{
 }
4

4 回答 4

1

效率方面,这并不重要,但为了可维护性,它会。

与其嵌套这么多 if,不如在 if 中尝试早期失败。像这样的东西:

if ($api->getCharacterID($_POST['username']) == 0) {
    // Fail early.  Throw an exception, die, or whatever
}

// Continue along as normal, not in an else.

if ($_POST['email1'] != $_POST['email2']) {
    // Fail early.  Throw an exception, die, or whatever
}

// Etc.

除非有充分的理由不使用它,否则这种策略通常会为您服务。

于 2012-11-03T07:37:19.710 回答
0

通常在大多数验证模式中,它们都有这个错误数组,您可以在其中检查所有条件并将错误消息添加到数组中,如果数组最后为空,则仅表示没有错误。

对我来说,我不希望我的代码看起来像这样嵌套太多,我会使用变量来指示每个步骤。

从那里您可以决定是否只显示第一个错误。一次验证所有内容并没有什么坏处,因为除非您有 5000 个表单字段,否则处理不应该那么广泛。我认为没关系。

当您编写代码时,您必须记住,因为代码是为人类编写的,您会希望对您的眼睛或阅读您的代码的人友善。基本上嵌套是可以的。它节省了一些进一步的处理,它还取决于您需要的逻辑。

是的,节省时间很好,但有时你做得太好了,以尽量减少处理,如果你做得很好,你必须权衡需求,但最后你节省的时间是如此之多,那么它就没有意义了。编译器是无论如何都不会拍拍你的背说好工作..

$errors = array();

$usernameValid = $api->getCharacterID($_POST['username']) != 0;
if (!$usernameValid) $errors[] = 'Username is not valid';
//If you want to store which attribute caused the error you can use the attribute name as array key
//if (!$usernameValid) $errors['username'] = 'Username is not valid';

$passwordMatches = $_POST['password1'] == $_POST['password2'];
if (!$passwordMatches) $errors[] = 'Password does not match';

if ($usernameValid && $passwordMatches)
{
  //What to do if user name and password passes validation. wooo hoo~
}

//Etc etc..
于 2012-11-03T07:59:45.753 回答
0

它很难阅读,也不是很干净。我这样做的方式是使用否定的 if 语句。我的意思是:

if ($api->getCharacterID($_POST['username']) == 0){
    // Username is not valid, so stop execution
}

if ($_POST['password1'] != $_POST['password2']) {
    // Send error to user and stop execution
}

// ...etc.

现在如何停止执行?那么你有几个选择

  1. 抛出异常
  2. 使用 die 语句
  3. 每次输入 if 块时都会更改一个参数,然后检查是否应该继续。
  4. 其他一些解决方案

但关键是,这种方法使您的代码更干净。

干杯。

于 2012-11-03T07:40:10.707 回答
0

这些天大多数程序员使用 jquery / Javascript 进行表单验证,但是如果您使用纯 PHP,请尝试下面的代码,希望它显然是好的和安全的 :)

$username = mysql_real_escape_string($_POST['username']);
  if($username == "")
  {
    $username_required = '<div>Please enter your username</div>';
    } else {
    $username_ok = true;
  }
于 2012-11-03T07:43:08.877 回答