2017-09-14 18 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);'なぜ単純に: 'empty empty($ password);'? – michaJlS

答えて

2

問題はここにあるようです:

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

あなたがそれを行うときは、実際に(foreachによる)の配列である$valueを渡しています。あなたが実際にあなたのコードによると、

ので、メールを渡していない、あなたのような何かにあなたの検証配列を変更する必要があります。その後、

$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'変数が' $ value'の代わりに '$ setup'と呼ばれていたら、あなたはそのようなものを簡単に捕まえることができます – Piyin

+0

私はいつも変数名に問題があります。ありがとう – cakeman