我正在开发一个 PHP 应用程序。它包含在 html 表单中。
我的问题是如何以一种简单的方式实现表单验证,而不需要在服务器(使用 PHP)和浏览器(使用 Javascript)上复制验证代码。
我设计了一种使用 ajax 的方法。当输入失去焦点(onblur 事件)时,它会使用它包含的数据对服务器进行 ajax 调用。如果值无效或为空字符串,则响应将是错误消息。但是代码在服务器和浏览器上都非常臃肿,并且可能非常错误。你能指出我正确的方向吗?输入验证总是那么复杂还是我应该使用不同的方法?非常感谢那些花时间阅读我的帖子的人,并感谢那些回答的人。
6 回答
我强烈推荐你Bassistance jQuery Validation 插件。
始终与此一起实施强大的服务器端验证。
我只是将数据发布到通过 ajax 验证所有内容的 php 中。然后我在一个 json 字符串中返回错误,每个错误都有失败的输入的名称和一个错误字符串。使用 jQuery,我循环遍历 json 对象,并将输入读取并列出错误字符串。您可以让表单提交给这个脚本,这样如果关闭了 javascript,表单就会被检查相同的 php 脚本。
function submitForm() {
$.ajax({
type: 'post',
url: 'cgi-bin/s_contact.php',
data: $("#contact").serialize(),
dataType: 'json',
success: function(data) {
if(data.answer == 'true') {
$("#showErrors").removeClass("progressbar");
$("#showErrors").html('<h2>Message Has Been Sent!</h2>');
setTimeout(function() {
window.location = $("#zsite").val();
},2000);
}
else {
se = $("#showErrors");
se.removeClass("progressbar");
se.html('');
se.append('<ul id="showeror"></ul>');
$.each(data,function(index,val) {
$('input[name='+index+']').css('background-color','#ff9');
$('#showeror').append('<li>'+val+'</li>');
});
}
},
error: function(msg) {
alert('Error: '+msg.error);
}
});
}
您总是需要服务器端验证。但是,您可以通过依赖第三方库在客户端让您的生活更轻松。
进行基本验证的最简单方法是使用 HTML5。这包括必填字段、数字范围和正则表达式检查等内容。不需要第三方库,不支持 HTML5 的浏览器只会忽略验证。这没问题,因为输入将在服务器上进行验证。
另一种方法是使用jQuery 验证扩展。使用这个库,您只需在表单字段中输出一些类。
如果您正在使用Zend_Form库来生成表单并进行验证,您可能已经看过这篇文章:http ://codeutopia.net/blog/2008/04/04/client-side-validation-with-zend_form/
如果您使用一个好的 javascript 验证插件,您会发现它们非常适合您的服务器端验证。我可能需要进一步解释这一点,所以请耐心等待。我会参考http://rickharrison.github.com/validate.js/来帮助我,但还有很多其他的。
就个人而言,我使用 Symfony 表单框架进行验证,但您可以使用其他框架或自行尝试。重要的是,您只需定义一组验证规则,这些规则又可用于驱动客户端验证。
这样您就不会在两个单独的验证过程之间出现任何不一致,从而确保您的应用程序是 DRY。此外,您的客户端验证可以与页面一起加载,因为这些规则已在您的服务器端代码中预定义,您不需要所有这些 ajax 请求。
如果您不熟悉任何 PHP 表单框架或我定义您的验证规则的意思,我可以让事情变得更清楚一些。
下面的数组可用于在服务器端循环两个 $_POST 字段,电子邮件和号码。这些信息也可以很容易地传递给客户端验证器(例如 json_encode($validators))。您可能需要稍微修改一下,这取决于客户端期望其规则的格式。但更重要的是,您的验证逻辑存储在一个地方。
$validators = array(
'email' => array(
'rules' => array(
'blank' => false,
'invalid' => '/^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i',
),
'messages' => array(
'blank' => 'Missing email',
'invalid' => 'Invalid email',
),
),
'number' => array(
'rules' => array(
'blank' => false,
'invalid' => '/\d/',
),
'messages' => array(
'blank' => 'Missing number',
'invalid' => 'Not a number'
),
......
输入验证非常复杂。您需要确保输入对您的数据类型完全有效。这通常包括每个项目的自定义验证。客户端和服务器端验证都没有替代品。
客户端验证提供了一个简洁的 ui。用户输入的每一件事都可以并且应该在客户端进行验证,这样就不必向服务器发出请求(减少延迟)。这并不意味着它可以替代服务器端验证,因为任何人都可以看到通过诸如 firebug 之类的工具发出的请求并将他们想要的任何数据提交到您的服务器。
在服务器端,您必须确保数据属于预期类型,否则您可能会面临 sql 注入或许多其他恶意攻击。
这实际上是一个很好的理由来查看许多 php mvc 框架中的任何一个。大多数包含表单助手,这将显着减少您为验证而编写的代码。
始终使用服务器端脚本来检查输入,因为如果您为此使用客户端(javascript),那么任何人都可以通过使用各种技术(如禁用 javascript 等)来愚弄您。