2017-04-12 9 views
2

'validate'クラスを作成して、 'firstname'と 'lastname'の2つのフィールドを検証しました。それは正常に動作していない、それはフィールドが空であるときにエラーを表示していますが、私は空ではないフィールドでフォームを送信すると、エラーはまだそこにあります。フォームの提出時にこれを実行する方法は?オブジェクト指向テクニックを使用してPHPでフォームフィールドを検証する方法

<?php 

    class validation { 

    public $firstName, $lastName, $errorFirstName = '', $errorLastName = ''; 

    function __constructor($fName, $lName){ 
    $this->firstName = $fName; 
    $this->lastName = $lName; 
    } 

    function check(){ 

     if($_SERVER["REQUEST_METHOD"] == "POST"){ 
     if(empty($this->firstName)){ 
     $this->errorFirstName = 'First name is required'; 
     } else { 
     $this->errorFirstName = 'Input is okay'; 
     } 

    if(empty($this->lastName)){ 
     $this->errorLastName = 'Last name is required'; 
     } else { 
     $this->errorLastName = 'Input is okay'; 
     } 
    } 
    } 
    } 

$obj = new validation($_POST['firstname'], $_POST['lastname']); 
$obj->check(); 
$errorF = $obj->errorFirstName; 
$errorL = $obj->errorLastName; 

?> 

    <!DOCTYPE html> 
    <html lang = "en-US" dir = "ltr"> 
    <head> 
    <title>Home</title> 
    <meta charset = "UTF-8"/> 
    </head> 
    <body> 
    <form method = "POST" action="<?php echo $_SERVER["PHP_SELF"]?>"> 
    <label>First Name: </label> 
    <input type = "text" name = "firstname" placeholder = "John"/> 
    <p class = "error"><?php echo $errorF;?></p> 
    <label>Last Name: </label> 
    <input type = "text" name = "lastname" placeholder = "Doe"/> 
    <p class = "error"><?php echo $errorL;?></p> 
    <input type="submit"> 
    </form> 
    </body> 
</html> 
+0

検証クラスを作成する場合、すべてのチェックを1つのメソッドに入れるわけではありません。代わりに、私は違う規則で異なるバリデーションのための異なるメソッドを作るでしょう。私はCodeIgniter(自分の好みに基づいて)のように独自のvalidation.phpライブラリを作成するか、CIのライブラリ(これも素晴らしい)を使用します。これにより、検証がより簡単になり、再利用可能になります。 – mzcoxfde

+1

if($ _ SERVER ["REQUEST_METHOD"] == "POST"){class}クラスをチェックインし、オブジェクトをインスタンス化する場所を囲むようにしてください。 – alistaircol

+0

ありがとうございました。私はPHPとOOPの初心者です。私はコンストラクタを削除し、代わりにset関数を書きました。できます。 –

答えて

2

誰もが常に "データベースクラス" と "バリデーションクラス" を作ります。ええ...うわぁ?

検証クラスを作成しないでください。それは決してうまくいかない。ユーザー入力を検証するための最も.. EMM ...持続可能なオプションは次のとおりです。

  • は、ドメインエンティティに検証を行い、検証のためのエンティティを使用して
  • 使用value objects

は、それは非常に簡単です。あなたの場合、方法setFirstName(string $name)を持っているクラスProfileがあります。その後、このメソッド内で検証を行い、エラーの場合InvalidFirstNameなどのようなカスタムexceptionを投げます。

値オブジェクトを使用すると、コードの重複が防止されます。たとえば、電子メールアドレスを検証する必要があります。だから、あなたはそれのようなものになります使用したいような方法:

したがって
try { 
    $profile = new Profile; 
    $profile->setEmail(new EmailAddress($_POST['email'])); 
} catch (InvalidArgumentException $e){ 
    // validation failed 
} 

は、この動作を取得するには、クラスは次のようにちょっと定義されています:

class EmailAddress 
{ 
    private $email; 


    public function __construct(int $emailId = null, string $email = null) 
    { 
     if (!$this->isValid($email)) { 
      throw new InvalidArgumentException('Not valid email address'); 
     } 
     $this->email = $email; 
    } 


    private function isValid($email) 
    { 
     return filter_var($email, FILTER_VALIDATE_EMAIL) !== false; 
    } 


    public function __toString() 
    { 
     return $this->email; 
    } 
} 

このアプローチは、Aでありますより表現力がありますが、パーシスタンスレイヤーとやりとりすると、大きなぎこちなくなりがちです。多くの場合、制約 を繰り返すためのユニークな

  • 利用価値のオブジェクトであること、ルールのため、エンティティに検証を保つ

    • :実際には

      、最良のオプションは、これらのソリューションの両方の組み合わせを使用することです

  • 関連する問題