情况如下:
我正在使用jquery.validate.js来验证我的表单,但我需要添加一个服务器端验证层。 jQuery Validate使用form-elements中的类名来确定它应该做什么 - 我想将这些类名称提取到PHP中,以便我可以在服务器端执行相同的验证。
我希望能做到这样的事情:
foreach($_POST as $key=>$value) {
$class=array(...// get this #key element class name list with jQuery
$error=...// based on the class names, perform specific PHP validations
if($error=="")
return true;
else
return false;
}
问题是,我可以这样做吗?我可以获取带有jQuery的元素类名并将它们传递给PHP吗?
答案 0 :(得分:2)
你可以让jQuery发送类名和表单 - 但这会导致严重的安全问题。看到发布到您服务器的所有内容都是由您的用户浏览器完成的,您的用户将能够更改您的验证规则并因此绕过它们,这将使您的整个目标无用。我建议如下。
在php中创建一个函数,以获取表单元素的名称并返回适当的类名。在为表单生成每个表单元素时,调用此函数以获取类名(然后应用jQuery验证)。当您在PHP代码中阅读表单时 - 使用相同的函数获取类名,然后您知道在服务器端php代码中应用哪些验证规则。
希望它有意义。
答案 1 :(得分:2)
永远不要相信客户端(浏览器)!
您永远不应允许客户端上的任何内容指示服务器如何测试发布信息的有效性。
这是一个非常糟糕的主意。
答案 2 :(得分:1)
客户端:
function validate()
{
var params = {
var1: {key:$('#field1').get(0).className, value:$('#field1').get(0).value},
var2: {key:$('#field2').get(0).className, value:$('#field2').get(0).value},
...
}
$.post('http://host/validate_script.php', params, onValidate);
}
function onValidate(data)
{
alert(data);
}
希望这会有所帮助......确定这是一种简单的方法,你可以做得更正规化。
答案 3 :(得分:0)
serializeArray会将您的表单数据转换为JSON:
var json = $('#formid').serializeArray();
通常,您可以将整个JSON字符串发送到可以从那里获取的服务器。
答案 4 :(得分:0)
如上所述,您可以使用AJAX和JSON将值传递给PHP。但是,这不会提供比常规JS验证更安全的验证(因为您的PHP仍然依赖于您的JS)
如果您选择使用此方法,以下是Evgeniy Savichev先前提供的脚本的一些改进
<script type="text/javascript">
params = {
elementName : {
className : $('elementId').attr('class'),
elementValue : $('elemenetId').val()
},
anotherElement : {
//etc
}
}
$.post('http://host/validate_script.php', params, onValidate);
function onValidate(data)
{
alert(data);
}
</script>
然而,更好的解决方案是自动生成和验证表单元素。 Zend Framework有一个很好的课程。我已经包含了一个简化版本的内容,以便在您决定编写自己的脚本时可以查看。
我希望这对你有所帮助
维姆
$elements = array(
'email-field' => array('email', 'required'),
'integer' => array('integer')
);
if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) {
$error = false;
foreach($elements as $elementName => $validators) {
if (array_key_exists($elementName, $_POST)) {
foreach ($elements[$elementName] as $validator ) {
switch($validator) {
case 'email':
if (filter_input(FILTER_VALIDATE_EMAIL, $elementValue)) {
$error = true;
}
break;
case 'integer':
// etc
break;
default :
break;
}
}
} else {
if ( in_array('required', $validators) ) {
$error = true;
}
}
}
if ( $error ) {
// etc
}
}
?>