2012-01-07 50 views
0

當我開發需要PHP處理的表單時,我傾向於將表單和PHP放入單個文件,例如signup.php並使用$ _GET方法來確定我需要使用表單。jQuery/Ajax和PHP表單處理設計

例如,如果/site/signup.php被請求,那麼我知道我需要顯示HTML表單,但是如果/site/signup.php?action=newsignup被請求(通過html表單提交),那麼我知道我需要處理它。

我一直很滿意這種方法,因爲它意味着我需要維護更少的文件,並且所有相互作用的內容都放在一個文件中,這使得跟蹤問題更加容易(另外我討厭在處理數據時不斷重定向頁面的站點。)

什麼,我會做一個粗略的例子是:

<?php 

if (isset($_GET['action'] && $_GET['action'] == "newsignup") 
{ 

    $name = cleanInput($_POST['name']; 
    $email = cleanInput($_POST['email']; 


    if(validUserName($name)== TRUE) 
    { 
     // do processing here 

    } else { 

     // fail processing here 
    } 

    if(validEmail($email)== TRUE) 
    { 
     // do processing here 

    } else { 

     // fail processing here 
    } 

    // Do database stuff etc 

    // Display success message 

} else { 

    // Not $_GET so must be a new sign-up. Display html form 


    <form id="signup" action="signup.php?action=newsignup" method="post"> 
     <input type="text" name="name" id="name" /> 
     <input type="text" name="email" id="email" /> 
     <input type="submit" id="submit" value="Submit" /> 
    </form> 

} 

現在,我開始使用jQuery/AJAX做驗證客戶端提供反饋當用戶填寫表格,當數據輸入到表單中的文本框中時,使用keyup事件實時驗證數據以發佈該t extbox轉換爲.php腳本進行驗證。要做到這一點,我使用jQuery帖子:

function name_check(){ 

var username = $('name').val(); 

    if(name == "" || name.length < 4){ 

     $('#name').css('border', '3px #CCC solid'); 
     $('#text').text(''); 

    }else{ 

      $.post('jquerysignup.php', { name: $('#name').val()}, function(response) { 
       $('#phpout').html(response['message']); // return an error string if exists 

       if(response['returnval'] == 0){ 
        $('#name').css('border', '3px green solid'); 
        $('#submit').fadeIn('slow') 

       } else if (response['returnval'] == 2){ 
        $('#name').css('border', '3px red solid'); 
        $('#submit').fadeOut('slow') 
       } else { 
        $('#name').css('border', '3px red solid'); 
        $('#submit').fadeOut('slow')  
       } 

      }, 'json'); 
    } // 
} 

文件jquerysignup.php是隻包含PHP函數validUserName和validEmail。

我現在是在有有兩個PHP文件,一個是服務器端驗證,現在一個是客戶端的位置。我想保留客戶端和服務器端驗證,但我不想保留包含重複功能的多個文件。

我一直在努力尋找或想出了一個集成的解決方案,我知道必須有一個更好的辦法做到做到這一點,但我無法找到任何的例子來處理這個特定的問題。

我會很感激的最佳實踐/解決這一一些指導。

回答

1

我同意你不依賴於JavaScript驗證comapletely的決定,因爲黑客可以操縱始終作爲其他的瀏覽器的屬性...

需要服務器端工作的唯一驗證是唯一的驗證.. 。而對於您必須使用Ajax ..

爲什麼不能在同一個文件..

會做什麼Ajax請求是請求發送到服務器腳本數據,並從數據庫中檢查確認後,該腳本答覆你的結果..

您還可以從javascript..why不一樣的文件..

只需設置

if(isset($_POST['ajax_variable_name'])) 
{ 
    your validation logic goes here and echo corresponding result.. 
} 

現在你已經驗證使用jQuery用戶憑據,他已經提交表單..

然後還讓用戶進入同一頁面..

只要給您的提交按鈕的名稱讓說名字=「提交」

並在您的這個頁面

做頂部爲u在做早期

if(isset($_PoST['submit'])) 
{ 
if correct validation make changes in database and redirect him to success page... 
} 

還是那句話:

if(check if ajax request is made here) 
{ 
---echo result... 
} 
else 
{ 
--whole page-- 
First form submit check if success then redirect 

Then normal form 
} 

這樣,它會檢查你的jQuery腳本如果它們被設置,並且只處理它們... 如果不是,那麼它將檢查是否提交表單,如果一切正常,則它將重定向而不顯示錶單,否則只顯示錯誤。 如果表單未提交或者是因爲錯誤的,我們沒有重定向,它會顯示形式..

一件事休息jQuery的驗證腳本,你可以把標籤在同一頁上的..

+0

感謝您的反饋,我有想到你所描述的方法,但提出這個問題的理由是看看這種情況是否存在「最佳實踐」,而不是技術解決方案。 我想這一切都取決於你想從服務器端分離出多少客戶端代碼。 我仍然關心如何解決這個問題,但目前我已決定表單流程代碼應該保持原樣,並將jQuery事件發佈到單獨的.php文件中,該文件包含函數validUserName和validPassword 。 – amer 2012-01-09 17:24:42