我再一次向那些精明的开发者寻求帮助。 这是我为我的网站开发的联系表格:
<div id="contactForm">
<h2>Escríbanos</h2>
<div class="sepContainer"></div>
<form action="process.php" method="post" id="contact_form">
<div class="name">
<label for="name">Su nombre:</label>
<p> Por favor ingrese su nombre</p>
<input id=name name=name type=text required />
</div>
<div class="empresa">
<label for="empresa">Su empresa:</label>
<p> Por favor ingrese el nombre de la empresa a la cual pertenece (opcional):</p>
<input id=empresa name=empresa type=email required />
</div>
<div class="telefono">
<label for="telefono">Su teléfono:</label>
<p> Por favor ingrese su número de teléfono (opcional):</p>
<input id=telefono name=telefono />
</div>
<div class="email">
<label for="email">Su E-Mail:</label>
<p> Por favor ingrese su E-Mail</p>
<input id=email name=email type=email required />
</div>
<div class="message">
<label for="message">Su mensaje:</label>
<p> Por favor ingrese su consulta</p>
<textarea id=message name=message rows=6 cols=10 required></textarea>
</div>
<div id="loader">
<input name="submitted" type="submit" value="Enviar" />
</div>
</form>
</div>
我想验证此表单,以便确保我可以回复尝试与我联系的人。
有人知道验证此表单的好代码吗? 我想确保以下字段中有输入:名称(仅文本,无特殊字符),telefono(可选字段;如果填写:仅电话号码,“ - ”允许),电子邮件(有效电子邮件地址),消息(纯文本,不允许代码)。
如果有人能帮我解决这个问题,我将非常感激! 非常感谢!
答案 0 :(得分:2)
我同意弗雷德。但是,以为我会帮忙。将表单发送到其他页面有一些问题。
如果您的表单在提交到process.php之前已使用Javascript验证,那么它就可以了,因为您可以提供简单的完成消息。但是如果你想在process.php上验证它,那么用户将不得不返回包含表单的页面并丢失一些放入表单的数据。
更好的方法是(如果你想通过php验证)是将操作字段留空<form action=""
然后使用以下代码段验证表单
<?php
if(isset($_POST['name'])){
$required_fields = array('name', 'email', 'telefono');
$error = '';
foreach($_POST as $k=>$v){
$$k = $v;
if(in_array($k, $required_fields)){
$error .= "$k is required<br />";
}
}
if(!$error){
//do whatever you want with the results here
}
else{
echo $error; //print error
}
}
?>
此外,您可能希望为名称字段和其他字段的值添加<?= $name; ?>
或<?php echo $name; ?>
。如果您已经报告了php的所有错误,那么首先在页面顶部初始化变量:
$name = ''; $email = ''; //and so on
答案 1 :(得分:0)
我使用这个https://github.com/posabsolute/jQuery-Validation-Engine,如果你不介意使用jQuery,它非常棒。
在字段验证之前,它不会提交表单。它验证了大多数类型的字段类型,包括电子邮件。您还可以使用此插件通过ajax验证字段,例如检查用户名是否已存在以及未提交表单的情况。
答案 2 :(得分:0)
您可以使用Zend Validators来完成所有这些。
它们有一个简单的抽象验证器类,其中有一个方法可以检查输入是否通过验证器。您可以使用预先制作的验证器或通过扩展摘要来定义自己的验证器。
不要像Pjack所建议的那样单独使用jQuery验证。精明的用户可以禁用JavaScript并提交未通过验证规则的数据。
答案 3 :(得分:0)
这些方面的东西,但有些库会做得更好。
即Jquery等......
<?php
session_start();
session_unset();
if(isset($_POST['name'])&&(!empty($_POST['name']))){
//do stuff with name
} else {
$_SESSION['errors']['name'] = "Please enter a name";
}
if(isset($_POST['email'])&&(!empty($_POST['email']))){
//do stuff with email
} else {
$_SESSION['errors']['email'] = "Please enter an email";
}
//repeat for all other fields
Then....
if(!empty($_SESSION['errors'])){
header("location: form.php"); //back to form
} else {
header("location: success.php");
}
然后在你的HTML中,保存为php文件,并添加错误.... 在一个跨度......
<div id="contactForm">
<h2>Escríbanos</h2>
<div class="sepContainer"></div>
<form action="process.php" method="post" id="contact_form">
<div class="name">
<label for="name">Su nombre:</label>
<p> Por favor ingrese su nombre</p>
<?php if(isset($_SESSION['errors']['name'])){echo "<span class='error'>".$_SESSION['errors']['name']."</span>";}?>
<input id=name name=name type=text required />
</div>
<div class="empresa">
<label for="empresa">Su empresa:</label>
<p> Por favor ingrese el nombre de la empresa a la cual pertenece (opcional):</p>
<?php if(isset($_SESSION['errors']['email'])){echo "<span class='error'>".$_SESSION['errors']['email']."</span>";}?>
<input id=empresa name=empresa type=email required />
</div>
这样您就可以访问$_SESSION['errors']
数组中的所有错误。
但上面的代码只会检查用户是否在框中输入了内容。
它不会做任何花哨的事情,比如确保电子邮件实际上是电子邮件或任何东西。就像我说.....有些库可以更好地处理这些东西。并且更精确。
但是它的工作原理如上所述。
答案 4 :(得分:0)
另一个用于浏览器端验证的灵活jQuery插件是http://bassistance.de/
上的“验证插件”我建议您始终为服务器端创建一个验证方法,因为您不能依赖浏览器端验证。用户可以随时控制在浏览器中运行的JavaScript。
我总是开始编写服务器端验证并编写浏览器端,这样用户就可以在此过程中获得一些反馈。
我经常做像Onimusha写的那样简单的必需控件:
<?php
//Globals!!
$required_fields = array('f1', 'f2', 'f3'); // to 'fn'
///// "OR":
//$field_tests = array('field_name' => 'validation_test');
$field_tests = array('field1' => 'required', 'field2' => 'tel', 'field3' => 'email', 'field4' => 'radio');
//For use when there are errors
$restore_array = array();
//Depending on how you want to inform your users, this can be much more sofisticated..
//this method does not give you any way to indicate whitch field that did not validate correctly
//$error_message = '';
$error_array = array();
$error_dictonary = array('field1' => 'explanation', 'field2' => 'other explanaiton');
function basic_server_side_validation(){
global $error_array, $restore_array, $error_dictonary;
//REMEMBER TO DO APPROPRIATE trim () AND addslashes() WHERE APPLICABLE!!
//-- note:
//if you have checkboxes then implemented like <input type="checkbox" name="somename[]" />
// Then this shoud be done recursively
foreach($_POST as $k => $v){
$_POST[trim(addslashes($k))] = trim(addslashes($v));
}
//You could do this only on errors... (you could alsow combine this whith the previous loop)
foreach($_POST as $k => $v){
$restore_array[$k] = $v;
}
//if you just have required fields
//-- note:
//if you have checkboxes then implemented like <input type="checkbox" name="somename[]" />
// Then this test need to check if that field is an array and so on (not shown here)
foreach($required_fields as $f){
//if you use empty, note that empty("0") is true! (in some (most) cases thats what we want..)
if(!isset($_POST[$f]) || $_POST[$f] == '') // if(!isset($_POST[$f]) || emtpy($_POST[$f]))
$error_array[] = $f;
}
// "OR" :
foreach($field_tests as $field => $test){
if(!isset($_POST[$f])){
$error_array[] = $f;
continue;
}
if(! call_user_func('validate_'.$test, $_POST[$f]) ){ // or if(! 'validate_'.$test($_POST[$f]))
$error_array[] = $f;
}
}
if(!empty($error_array)){
//Do somthing and show the form to the user agin
//The easiest way to do this is to hawe this code in a function and return at this time!
//NOT GLOBAL
//if $error_array and $restore_array and $error_dictonary IS NOT global
//return array('errors' => $error_array, 'restore' => $restore_array, 'mesages' => $error_dictonary);
//Whth globals:
return false;
}
///Insert into DB?? (Here or in a nother function or in calling function when returning true)
return true;
}
//Define validation rules functions:
function validate_required($field){
if(isset($field))
return true;
//default return false
return false;
}
function validate_telephone($field){
//some code
}
if(isset($_POST['submit_button_name'])){
if(!basic_server_side_validation()){
show_form();
//if show_form returns then we opt out here..
return;
}
$db_status = do_db_stuff();
if($db_status === false){
//some error handler
}
//and so on
}else{
show_form();
}
?>
在你的html表单中,你可以做类似的事情(将action =“#”替换为适当的位置或“”):
function show_from(){
echo '<form action="#" method="post">';
if(isset($error_array['field_name']))
echo '<p>', $error_dictonary['field_name'], '</p>';
echo '
<label>Some text:
<input type="text" name="field_name" value="',(isset($restore_array['field_name']) ? $restore_array['field_name'] : '' ),'" />
</label>';
echo '</form>';
}
请注意,有很多方法可以进行表单验证,如果需要大量测试,那么创建“定义”可能是一个很好的方法。 phparch.com 2009年9月文章“使用SPL ARRAY ITERATOR的FORM PARSER”中的示例(http://www.phparch.com/magazine/2009-2/september/):
$definition = array(
'first_name' => array(
'validate' => 1,
'validation_type' => 'alphanumeric',
'reg_exp' => '',
'error_message' => 'Only use alphanumeric characters',
'sanitize' => 1,
'sanitize_type' => 'safe',
),
'last_name' => array(
'validate' => 1,
'validation_type' => 'alphanumeric',
'reg_exp' => '',
'error_message' => 'Only use alphanumeric characters',
'sanitize' => 1,
'sanitize_type' => 'safe',
),
);