2017-04-12 15 views
2

我創建了一個類'validate'來驗證兩個字段,即'firstname'和'lastname'。它不能正常工作,當字段爲空時顯示錯誤,但當我使用非空字段提交表單時,錯誤仍然存​​在。如何在表單提交上執行此操作?如何使用面向對象技術在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

如果我要做一個驗證類,我不會把所有的檢查都放在一個方法中。相反,我會針對不同規則的不同驗證制定不同的方法。我會像CodeIgniter一樣編寫我自己的validation.php庫(基於我自己的偏好),或者我會使用CI的庫(這也很棒)。它使驗證更容易和可重用。 – mzcoxfde

+1

你應該刪除''if($ _ SERVER [「REQUEST_METHOD」] ==「POST」){''檢查你的類,並將它包裹在實例化對象的地方。 – alistaircol

+0

謝謝alistaircol。我是PHP和OOP的新手。我刪除了構造函數,而是編寫了一個設置函數。有用。 –

回答

2

大家總是讓 「數據庫類」 和 「驗證類」。呃.... whaaaaay?

不要做驗證類。它從來沒有工作。最.. EMM ...可持續的驗證用戶輸入的選項有:

隨着使用實體驗證,這是很簡單的。在你的情況下,你會有類Profile,你有方法setFirstName(string $name)。然後在這種方法中,你做驗證和錯誤拋出一個自定義的exception,如InvalidFirstName ..或類似的東西。

使用值對象有點棘手,但它可以防止代碼重複。例如,您需要驗證電子郵件地址。所以,這樣你會想用它看起來是這樣的:

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; 
    } 
} 

這種方法是更具表現力,但在與持久層進行交互時,它往往會變得非常粗糙。

在實踐中,最好的選擇是使用這些兩種解決方案的組合:

  • 保持驗證的實體,規則,特有
  • 使用價值對象爲經常重複的約束