【问题标题】:PDO: How to make checksPDO:如何进行检查
【发布时间】:2014-10-23 14:34:35
【问题描述】:

我创建了这个类,但我是 PHP OOP 和 PDO 的新手,我不知道我必须如何以及在哪里检查用户名是否有效、电子邮件是否有效等等。

这是我的代码

Class Users {
    private $db;

        public function __construct(Database $datebase) {
            if (!$database instanceOf Database) {
                throw new Exeption();
            }
            $this->db = $datebase;
        }

        public function userRegistration($username, $password, $email) {
            $username = $_POST['username'];
            $password = $_POST['password'];
            $email    = $_POST['email'];
            $regdate  = date('d.m.Y');

                $query = $this->db->prepare("INSERT INTO `users` (`username`, `password`, `email`, `regdate`) VALUES (?, ?, ?, ?) ");
                $query->bindValue(1, $username);
                $query->bindValue(2, $password);
                $query->bindValue(3, $email);
                $query->bindValue(4, $regdate);

            return ($query->execute()) ? true : false ;
        }

}

【问题讨论】:

  • “有效”是什么意思?另外,为什么要用$_POST 值替换参数值?
  • 像“正确”一样有效。我的意思是例如“用户名很短。最小符号 4”是这样的。
  • 您为每个字段设置的规则是什么?
  • 我提供的代码是我拥有的一切和注册 html 表单
  • 你必须知道你的应用程序中什么是“有效的”。

标签: php mysql pdo


【解决方案1】:

如果您想检查某些内容,请使用Respect/Validation。例如:

$usernameValidator = v::alnum()->noWhitespace()->length(1,15);
$usernameValidator->validate($_POST['username']); //true or false

$passwordValidator = v::alnum()->length(10, null);
$passwordValidator->validate($_POST['password']); //true or false

v::email()->validate($_POST['email']); //true or false

【讨论】:

    【解决方案2】:

    要检查您的数据库中是否存在用户名或电子邮件,您可以使用 SQL 搜索电子邮件或用户名。

      $query = $this->db->prepare("SELECT * FROM users WHERE email = ? ");
                    $query->bindValue(1, $email);
    

    如果查询返回的值比您的数据库中已经存在的电子邮件或用户名。从那里你可以显示你自己的验证。

    【讨论】:

      【解决方案3】:

      要检查用户或电子邮件是否存在,您不需要另一个类,只需添加另一个名为 userExist 或 emailExist 的方法并运行查询,然后检查是否得到结果。

        public function emailExist($email){
             $query = $this->db->prepare("SELECT * FROM users WHERE email = ? ");
             $query->bindValue(1, $email);
             try{
                 $query->execute();
                 //use the if statement and $query->rowCount() to check if there is a result
                  $rows = $query->rowCount();
                  if($rows === 1){
                        return true;
                  } else {
                        return false;
                  } 
             }catch (PDOException $e) {
                  die($e->getMessage());
             }
        }
      

      【讨论】:

      • 所以不要做任何验证。查询甚至两次发送到数据库。 if ($users->userExists($_POST['username']) === true) { $errors[] = 'Exists'; }也有这个错误-SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '0' for key 'PRIMARY'
      • 是的。无需验证。只需确保新用户不使用数据库中已有的电子邮件即可。你用另一种方法验证
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2012-08-12
      • 2020-03-26
      • 2021-12-01
      • 1970-01-01
      • 2019-04-14
      相关资源
      最近更新 更多