联系表格php验证

时间:2013-08-01 16:00:42

标签: php forms validation contact

我再一次向那些精明的开发者寻求帮助。 这是我为我的网站开发的联系表格:

<div id="contactForm">
  <h2>Escr&iacute;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&eacute;fono:</label>
      <p> Por favor ingrese su n&uacute;mero de tel&eacute;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(可选字段;如果填写:仅电话号码,“ - ”允许),电子邮件(有效电子邮件地址),消息(纯文本,不允许代码)。

如果有人能帮我解决这个问题,我将非常感激! 非常感谢!

5 个答案:

答案 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&iacute;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',
    ),
);