2012-01-07 92 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