【问题标题】:PHP check for errors in input, if no errors execute and uploadPHP 检查输入中的错误,如果没有错误执行并上传
【发布时间】:2014-12-06 21:15:34
【问题描述】:

我目前正在开发一个注册系统,但遇到了一些问题。
我先粘贴之前的简化版代码:

session_start();

if (isset($_SESSION['logged_in'])) {

header('Location: #notLoggedIn');
exit;
} else {
if ($_SERVER["REQUEST_METHOD"] == "POST") {

        if //if field is empty {
            //display error
        } else if //check if any unallowed characters {
            //display another error
        } else {
            //give the checked input a string/variable, ex: $name= ($_POST["name"]);
        }

        // Like 4-5 other checks running in the same way as above

    }

    $query = $pdo->prepare('INSERT INTO table (a, b, c, d, e) VALUES (?,?,?,?,?)');

    $query->bindValue(1, $1);
    $query->bindValue(2, $2);
    $query->bindValue(3, $3);
    $query->bindValue(4, $4);
    $query->bindValue(5, $5);

    $query->execute();

    header('Location: index.php');
    exit;
    }

问题在于它一次运行所有内容,只是将我重定向到 index.php。
我如何确保它首先在运行之前检查表单是否已提交。
之后,我希望它检查所有字段中的任何错误。如果有错误,请停止。
但如果没有错误,请继续并上传到我的数据库。

我确实认为我走上了正轨,但目前非常困难,任何帮助或朝着正确的方向前进都会很棒!
谢谢!

【问题讨论】:

  • 这取决于您的错误检查条件中的内容。至少你应该确保出现错误时不执行数据库插入和重定向。
  • @jeroen 我稍微更新了上面的“检查”。但它也取决于它是什么输入字段,例如,如果它是用户名,它首先确保它不为空,然后检查是否有任何不允许的字符。但如果它只是一个普通的名字,不是“必需”注册的,它只会检查不允许的字符。
  • 终极目标是什么?创建新用户或登录或...?
  • @gloomy.penguin 我真的没有最终目标,如果我觉得需要的话,我只是向前扩​​展。这只是一个学习 PHP 的个人项目。我已经有一个有效的登录功能,目前想要一个有效的注册功能:)

标签: php upload


【解决方案1】:

您的问题并不完全清楚,您的代码也不完整(表格在哪里?)。
您似乎处于学习表单处理的早期阶段,并且可能会在您提出具体问题之前从进一步阅读和测试中受益。

这里有一些初学者:
http://en.wikipedia.org/wiki/Post/Redirect/Get
What's the best method for sanitizing user input with PHP?
The definitive guide to form-based website authentication

我还是会提供一些信息,因为有一些空闲时间。

例如,您的第一个 if 检查是否设置了会话,如果 TRUE 则重定向到 notLoggedIn。你确定这是故意的吗?他们要么登录,要么回显消息以适应,要么不显示注册页面(大多数网站在同一页面上显示登录和注册,以方便所有场景)。

由于这是一个注册表单,您的意思是如果 IS 已登录然后重定向到 YouAreAlreadyLoggedIn?
事实上,我只是退出一条消息“您已经登录”然后停止脚本。

问题在于它一次运行所有内容并将我重定向到 index.php。

这是因为它没有其他选项,因为在 XYZ 之后的脚本末尾,它会重定向到 index.php。
如果您不希望它这样做,请更改它。要么不重定向,更有建设性地处理整个过程,要么在你需要的某个时候退出(比如表单错误)。

我如何确保它首先在运行之前检查表单是否已提交。

我没有看到表格,所以不知道你在做什么建议。

理想情况下,您会使用 PRG(后重定向获取)。
http://en.wikipedia.org/wiki/Post/Redirect/Get

你的脚本

我已经编辑了您的脚本以使其成为问题的答案,并对其进行了一些整理。

例如在您的脚本中,特别是在顶部,您不需要else,因为if 中有一个exit()。当if 返回true 时,脚本将停止,否则(有或没有else)它将继续。

代码:

session_start();


if (isset($_SESSION['logged_in']))
  {
    exit('You are already logged in');
  }



if ($_SERVER["REQUEST_METHOD"] == "POST")
  {

    if ( strlen($POST['field_name']) < 4 )
      {
        exit('Minimum 4 chars required');
      }
    elseif ( strlen($POST['field_name']) > 20 )
      {
        exit('Max of 20 chars allowed');
      }
    elseif ( preg_match("/^[A-z0-9]+$/", $POST['field_name']) != 1 )
      {
        exit('Invalid chars - allowed A-z and 0-9 only');
      }
     else
      {
        // Not sure what you want here
        // If all ok (no errors above)
        // then sanatise the data and insert into DB
      }

  }

至于进入数据库,您需要对整个过程进行更多检查和处理,然后才允许数据库运行。

不确定为什么要重定向到 index.php。然后,您需要在 index.php 中处理表单提交结果,以告知用户您已注册。 在表单页面上,告诉他们他们在字段中遇到的错误,或者回显成功消息以及接下来会发生什么(即转到您的帐户页面,或者(希望)在登录之前确认您发送的电子邮件)。

至于 POSTed 表单数据中的验证检查,完全取决于您的需求。但是我已经给了你一些非常基本的内容。确保您在表格中设置的最大值与数据库列允许值匹配,或者如果(例如)DB varchar 设置为 15 并且您允许用户输入 20,则他们输入的数据将被截断,他们将注册,但永远不会能够登录(或其他一些数据将被破坏,他们的姓名/用户名等)。

【讨论】:

  • 我确实有一个
    已经有几个 字段和所有设置,但我虽然留下所有“简单”代码会更多地尝试帮助我,我猜它变成了反了,呵呵。感谢您提供非常详细的帖子,以上所有三个帖子都明确地帮助了我并使我走上了正确的道路,我现在应该能够管理这个! :)
【解决方案2】:

无聊了。这不适用于互联网积分。

<?php  
// create table user (userid int auto_increment primary key, username varchar(60), password varchar(60)); 
// alter table user add constraint uc_user_username unique (username); 

var_dump($_POST); 

$user   = isset($_POST['username'])    ? trim($_POST['username'])  : ''; 
$pass   = isset($_POST['password'])    ? trim($_POST['password'])  : ''; 
$pass2  = isset($_POST['confirm'])     ? trim($_POST['password2']) : ''; 
$action = isset($_POST['action_type']) ? $_POST['action_type']     : ''; 


if (empty($_POST)) {
   // nothing posted 
}
else {
   if (empty($user)) {
      error('you did not provide a username');
   }
   elseif (empty($pass)) {
      error('you did not provide a password');
   }
   else {
      $mysqli = mysqli_connect('localhost','root','','test')
                  or die('Error ' . mysqli_error($link));   

      if ($action=='new_user') {  
         $userdata = get_user_info($mysqli,$user);  
         if ($userdata) {  
            error('user already exists');  
         }
         else { 
            $validpass = validate_password($pass);  
            if ($validpass && $pass==$pass2){ 
               if (make_new_user($mysqli,$user,$pass)) {
                  print "<br/>new user created<br/><br/>"; 
               }   
            }
            else error('passwords did not match');
         } 
      }
      elseif ($action=='login_user') {  
         $verified  = verify_credentials($mysqli,$user,$pass);
         if ($verified) {
            print "<br/>user logged in<br/><br/>"; 
         } 
      }   
      elseif ($action=='update_pass') {
         $verified  = verify_credentials($mysqli,$user,$pass);
         $validpass = validate_password($pass); 
         if ($verified && $validpass && $pass!=$pass2) { 
            if (update_password($mysqli,$user,$pass,$pass2)) {
               print "<br/>new user created<br/><br/>"; 
            }  
         } 
         else error('cannot update to same password'); 
      } 
      $mysqli->close(); 
   } 
}

function error($message) {
   print "<br/>$message<br/><br/>";
}

function update_password($mysqli,$user,$pass,$pass2) { 
   $hash = password_hash($pass, PASSWORD_BCRYPT);     
   $stmt = $mysqli->prepare('update user set password = ? where username = ?');
   $stmt->bind_param('ss',$user,$hash);
   $stmt->execute(); 
   $msql_error = $mysqli->error; 
   $updated = !(empty($msql_error));

   error($msql_error);  // for debugging only

   return $updated;  
}

function make_new_user($mysqli,$user,$pass) {
   $userid = false;   
   $hash = password_hash($pass, PASSWORD_BCRYPT);   
   $stmt = $mysqli->prepare('insert into user (username,password) values (?,?)');
   $stmt->bind_param('ss',$user,$hash);
   $stmt->execute(); 
   $msql_error = $mysqli->error; 
   if (empty($msql_error)) {
      $userid = $mysqli->insert_id;
   } 
   else error($msql_error);  // for debugging only
   return $userid; 
}

// really, this should be done with javascript instantaneously 
function validate_password($pass) { 
   $error = false; 
   if (strlen($pass) < 8) {
      error('please enter a password with at least 8 characters');
   }
   elseif (!preg_match('`[A-Z]`', $pass)) {
      error('please enter at least 1 capital letter');
   } 
   else $error = true; 
   return $error;
}

function verify_credentials($mysqli,$user,$pass) {   
   $row = get_user_info($mysqli,$user);  
   $verified = false; 
   if ($row) { 
      if (password_verify($pass, $row['pass'])) {   
         $verified = true; 
      } 
   }   
   else error('username and password did not match'); 
   return $verified; 
} 

function get_user_info($mysqli,$user) {
   $row = array();  
   $stmt = $mysqli->prepare('select userid, username, password 
                             from   user 
                             where  username = ?');
   $stmt->bind_param('s',$user);
   $stmt->execute();
   $stmt->bind_result($row['userid'],$row['user'],$row['pass']);
   if (!$stmt->fetch()) $row = false;  
   $stmt->close();  
   return $row;  
}
?>

<body>
   <form action='?' method='post'>
      <table id='input_table'>  
         <tr><td><span>username </span></td><td><input id='username' name='username' type='text' value='<?php echo $user ?>'></td></tr>
         <tr><td><span>password </span></td><td><input id='password' name='password' type='text' value='<?php echo $pass ?>'></td></tr>
         <tr><td><span>password2</span></td><td><input id='password2' name='password2' type='text' value='<?php echo $pass2 ?>'></td></tr>
         <tr><td>&nbsp;</td><td>&nbsp;</td></tr>
         <tr><td colspan=2>this just picks the action for testing... you wouldn't keep it around</td></tr>
         <tr><td><input type='radio' name='action_type' value='new_user'    <?php echo $action=='new_user'?'checked':'' ?>>New User</td></tr>
         <tr><td><input type='radio' name='action_type' value='login_user'  <?php echo $action=='login_user'?'checked':'' ?>>Logging In</td></tr>
         <tr><td><input type='radio' name='action_type' value='update_pass' <?php echo $action=='update_pass'?'checked':'' ?>>New Password</td></tr>
         <tr><td>&nbsp;</td><td>&nbsp;</td></tr>
         <tr><td colspan=2><input id='submit' name='submit' type='submit'/></td></tr>
   </form>
</body>

【讨论】:

    【解决方案3】:
    // error = 0  means no error found you can continue to upload...
    if ($_FILES['file']['error'] == 0) {
    
    }
    

    以下是所有错误的解释:http://php.net/manual/en/features.file-upload.errors.php

    UPLOAD_ERR_OK 值:0;没有错误,文件上传成功。

    UPLOAD_ERR_INI_SIZE 值:1;上传的文件超过 upload_max_filesize php.ini 中的指令。

    UPLOAD_ERR_FORM_SIZE 值:2;上传的文件超过 在 HTML 表单中指定的 MAX_FILE_SIZE 指令。

    UPLOAD_ERR_PARTIAL 值:3;上传的文件只上传了一部分。

    UPLOAD_ERR_NO_FILE 值:4;没有上传文件。

    UPLOAD_ERR_NO_TMP_DIR 值:6;缺少一个临时文件夹。在 PHP 5.0.3 中引入。

    UPLOAD_ERR_CANT_WRITE 值:7;无法将文件写入磁盘。在 PHP 5.1.0 中引入。

    UPLOAD_ERR_EXTENSION 值:8; PHP 扩展停止了文件 上传。 PHP 没有提供一种方法来确定是哪个扩展导致 文件上传停止;检查加载的扩展列表 phpinfo() 可能会有所帮助。在 PHP 5.2.0 中引入。

    验证输入字段

    if(empty($_POST['name'])&&empty($_POST['password'])){
     //fields empty show error here
    }else if (is_numeric($username[0])){
        echo 'First character must be a letter';
    }
    else if (!preg_match('/^[a-zA-Z0-9]+$/', $username)) {
         echo 'Only letters and numbers are allowed';
    }else if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
         echo 'Invalid email address.'; 
    }else if(!preg_match("/^[\pL\s,.'-]+$/u", $name)) {
         echo 'Invalid name.'; 
    }
    

    【讨论】:

    • 这仅适用于您上传的文件,还是我遗漏了什么?我希望用户使用 将他们的信息输入注册表并检查输入是否有错误。
    • 好的,您是说要验证所有输入字段而不是文件上传?
    • 是的,正确!我有一个注册表单,我正在尝试验证用户输入的数据,如果结果正确且没有错误,则转到 $query 部分。
    • 嗯,这是一种方法(我尝试过并得到了一个工作示例)但如果有几个错误(例如:没有用户名和密码不匹配)它只会显示第一个一,在这种情况下“没有用户名错误”。我认为我可以将错误存储在一个数组中,然后将它们打印出来,或者可能不会,因为代码在“else if”语句之后停止。关于显示所有错误的任何进一步提示?如果没有,无论如何,谢谢你,你让我走上了正确的轨道!
    • 如果你是新手,你可以在这里观看教程:youtube.com/playlist?list=PLE134D877783367C7如果你喜欢这个答案,请接受
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    相关资源
    最近更新 更多