2017-10-18 270 views
0

我有一個簡單的PHP表單,我想要改進驗證以幫助打擊機器人提交的空表單提交。檢查數組元素是否爲空

我有以下數組,其中包含來自另一頁的輸入名稱。

$expected = array('Project-Inquiry','Name','Company-Name','Phone-Number','Email'); 

我想驗證這些元素實際上是否包含內容,因爲它們已經在前一頁的JS中進行了驗證。 JS只有在啓用時纔有用,所以我想在此禁用時添加一個額外的驗證層。

我試過如下:

$expected = array_filter($expected); 

if (!empty($expected)) { 
// Do Something 
} 

而且我也試過如下:

$error = false; 
foreach($expected as $field) { 
    if (empty($_POST[$field])) { 
     $error = true; 
    } 
} 
if ($error) { 
    // Do Something 
} 

我似乎未能達到。有什麼建議麼?

+2

這是什麼問題? –

+3

由於您檢查您以前定義的數組是否爲空,所以先嚐試不起作用。第二個例子看起來不錯,那有什麼問題? – clemens321

+0

也許在第二個例子中,你期望'if($ error === false)'的行爲? – RToyo

回答

0

如果你想對機器人

  1. 創建一個隱藏的輸入,人類並沒有看到和機器人將填補它戰鬥。你需要在做任何事之前檢查輸入。如果該輸入填充,則表示bot發送的表單不是人類。

  2. 創建一個當前時間的會話,當你顯示錶單時,發佈後檢查時間差。如果它少於3秒,這是一個機器人。

  3. 使用驗證碼系統。

如果您想驗證輸入

不要做驗證像你這樣對你的問題是什麼。您應該嘗試使用適當的驗證方法來驗證它們中的每一個。例如,您應該如何驗證電子郵件與姓名完全不同。

例如做這個電子郵件:

$email = (isset($_POST['email']) && is_string($_POST['email']))? trim($_POST['email']) : ''; 
$email_error = (filter_var($email,FILTER_VALIDATE_EMAIL))? true : false; 

的名稱是不同的:

$name = (isset($_POST['name']) && is_string($_POST['name']))? trim($_POST['name']) : ''; 
$name_error = (strlen($name)>20 || strlen($name)<3)? true : false; 

你可以多個過濾器,以我的例子補充。

0

讓你預期的數據是數組是

$expected = ['name', 'email', 'mobile']; 

讓表單提交值是你能得到導致$ _ POST

foreach($_POST as $key => $value) { 
    if (empty($value) && in_array($key, $expected)) { 
     if ($value=='') { 
      echo $key. ' is should not be empty'."<br/>"; 
      } 
    } 
} 

預期

HTML表單

<form action="" method="post"> 
Name <input type="text" name="name"><br> 
email <input type="text" name="email"><br> 
mobile<input type="text" name="mobile"> 
    <input type="submit" value="Submit"> 
</form> 
+0

千萬別這樣做。只需根據您想要的密鑰獲取$ _POST。 – ICE