2017-09-14 73 views
2

基本上我试图创建一个登录,电子邮件验证似乎没有通过。我一直在寻找一个例子,但我真的不知道,静态地做这件事似乎很容易,但我隐约怀疑使用静态方法将作为登录方法使用不正确(也许我是在想它)麻烦数组和foreach php oop

<?php 

    require ("Database.class.php"); 

    class Login 
    { 
     private 
     $email, 
     $password, 
     $database, 
     $db = null; 

     public function __construct() 
     { 
      $this->db = new Database; 
     } 

     public function validEmail($email) 
     { 
      return (filter_var($email, FILTER_VALIDATE_EMAIL) !== FALSE); 
     } 

     public function emptyPassword($password) 
     { 
      return(empty($password) !== TRUE); 
     } 
     public function validPassword($password) 
     { 
      $query = $this->db->prepare("select * from username"); 
      return $query->fetch(PDO::FETCH_ASSOC); 
     } 
    } 


<?php 

require "classes/Login.class.php"; 
require "loadclasses.php"; 

if ($_SERVER['REQUEST_METHOD'] == 'POST') 
{ 
    $email = $pass = ""; 
    $post = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);  

    $email = $post['email-login']; 
    $pass = $post['password-login'];   
    $errors = array(); 

    $fields = array(
    'email-login' => array(  
     'validate' => 'validEmail', 
     'message' => 'Enter a valid email address' 
     ), 
     'password-login' => array(   
     'validate' => 'emptyPassword', 
     'message' => 'Password required' 
     ) 
    ); 

    $login = new Login(); 
    foreach($fields as $key => $value) 
    { 
     $validation_result = $login->$value['validate']($value); 

     if(!$validation_result) 
     { 
      $errors[] = ['name' => $key, 'error' => $value['message']]; 
     } 
    } 

    if(empty($errors)) 
    { 
     $success = ['response' => 'true']; 
     session_start(); 
    } 

} 


header('Content-Type: application/json'); 
if (empty($errors)) 
{ 
    echo json_encode($success); 
} 
else 
{ 
    echo json_encode(["errors" => $errors]); 
}   

如前所述我知道我可以做一些类似的:

$errors = array(); 

$fields = array( 
    'username' => array( 
    'validator' => 'validateUsername', 
    'message' => 'Username must be between three and fourteen alphanumeric characters' 
), 
    'email' => array( 
    'validator' => 'validateEmail', 
    'message' => 'Please enter a valid email', 
), 
    'password' => array( 
    'validator' => 'validatePassword', 
    'message' => 'Password must be a minimum of seven characters' 
) 
); 

if(!Validation::validateRepeatPassword($password, $repeatPassword)) 
{ 
    $errors[] = ["name" => "repeatPassword", "error" => "Passwords must match"]; 
} 
foreach($post as $key => $value) 
{ 
    if(isset($fields[$key])) 
    { 
     if(!Validation::{$fields[$key]['validator']}($value)) 
     { 
      $errors[] = ['name' => $key, 'error' => $fields[$key]['message']]; 
     } 
    } 
} 

主要问题,因为我提到的是我相当肯定这将是解决这个问题的错误的方式

+0

btw,'return(empty($ password)!== TRUE);'为什么不简单地说:'return empty($ password);'? – michaJlS

回答

2

问题似乎在这里:

$validation_result = $login->$value['validate']($value); 

执行该操作时,实际上是通过$value,它是(根据foreach)的阵列。你不是真正通过电子邮件

因此,根据你的代码,你应该将验证阵列更改为类似:

$fields = array(
    'email-login' => array(  
    'validate' => 'validEmail', 
    'message' => 'Enter a valid email address', 
    'value' => $email, 
), 
    'password-login' => array(   
    'validate' => 'emptyPassword', 
    'message' => 'Password required', 
    'value' => $pass, 
) 
); 

,然后改变你的验证行:

$validation_result = $login->$value['validate']($value['value']); 
+0

啊我看到了,谢谢 – cakeman

+1

没问题。另外,我建议你使用更好的变量名称。例如,如果'foreach'变量被称为'$ setup'而不是'$ value',那么你很可能会很容易地捕获这样的东西 – Piyin

+0

有意义,我总是遇到变量名称的问题,谢谢 – cakeman