2016-10-06 34 views
1

考慮這兩個簡化的場景:在同一頁面或不同頁面上進行表單驗證?

Script Name: script1.php 

Validate form fields and if validated; redirect user to another page... 

<form action=script1.php> 
form fields..... 
</form> 

第二場景:

Script Name: script1.php 

<form action=script2.php> 
Form fields..... 
</form> 

Form fields are posted to script2.php and validated there and then the user is redirected to the next page... 

是表單驗證的第一方法(相同的腳本內)比第二方法(形式數據發送到更好「中間頁面「進行驗證/數據庫輸入,然後重定向),或者比第一個更好,爲什麼?

+0

都沒有。驗證客戶端。 https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Forms/Data_form_validation這裏有很好的polyfills。 (顯然,這並不意味着盲目地信任用戶輸入。但是,至少這意味着如果你得到了垃圾數據,而不是試圖弄清楚它出了什麼問題,並在用戶頁面重新加載後浪費用戶的時間返回一個友好的錯誤,那麼你可以拋出一個異常,讓它冒泡因爲無論錯誤是否合理(如果沒有其他內容,可能是500內部服務器錯誤)並繼續。) – Brad

+0

僅僅依靠客戶端驗證是很危險的,因爲用戶可以很容易地禁用它。除了客戶端的服務器端驗證是必需的。 – Nikster2014

+0

您是否閱讀了我的評論的其餘部分?關鍵是,任何友好的驗證都應該在客戶端完成。任何實際的數據完整性安全要求都應在服務器上。通常如果您的數據模型設置正確,則會自動進行。 – Brad

回答

0

從個人角度來看,我發現它有更清晰的文件。這使我可以在以後擴展系統,並允許其他服務提交驗證請求,而不會過於混亂。 (關於事情,比如稍後的應用程序)。

如果你想讓它自己提交,你可以要求驗證腳本,允許兩個腳本分開清潔&。

Script Name: script1.php 

require 'script2.php'; 
/* Script 2 performs all validations */ 

<form action=script1.php> 
form fields..... 
</form> 
0

自動操作腳本不是問題。更重要的是區分顧慮。如果您的html在同一個文件中呈現,您將得到大的if「意大利麪代碼」塊。

如果您有條件地同時包含表單呈現和驗證,那麼解釋器將不會解析它不需要的代碼。

if ($_SERVER['REQUEST_METHOD'] === 'POST') { 
    include 'submit_form.php'; 
} 

include 'display_form.html.php'; 

只有發送了無效表單(表單應該使用POST方法提交),這兩個腳本纔會被加載。重定向頭後,當然有效格式以exit;結尾。

這個「前臺腳本」很小,但它可能不僅僅包含這兩個文件。在結構化代碼中,它通常會加載一些常用的函數,過程或模板(頁眉/頁腳)。您可以在這裏添加一些頁面特定的認證和授權邏輯:

  • 用戶需要登錄? - 如果會話說,否則重定向(也許與當前url返回),
  • 用戶需要成爲一個管理員? - 顯示錯誤或「找不到頁面」將其隱藏(對於未登錄的用戶應該這樣做)

此外,「顯示」和「提交」可能會分成更小的操作,也取決於簡單的邏輯。例如表單可能已經充滿了數據,因爲你編輯的是已保存的內容(所以它幾乎就像已發送表單一樣,但不會因爲驗證錯誤而顯示)。該文件可能會快速增長,如果它僅控制數據流並加載它所需的腳本,則會更好。

在面向對象編程中,主應用程序工廠的職責是使用類似的邏輯來構建所需的對象組合。它通常以不同的方式處理,但有些與框架開發人員合作會感到驚訝。

相關問題