-1

我再次向你们精明的开发人员寻求帮助。这是我为我的网站开发的联系表格:

<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>

我想验证此表格,以确保我可以回复尝试与我联系的人。

有人知道验证此表单的好代码吗?我想确保在以下字段中有输入:姓名(仅文本,无特殊字符),电话(可选字段;如果填写:仅电话号码,允许“-”),电子邮件(有效的电子邮件地址),消息(纯文本,不允许使用代码)。

如果有人可以帮助我解决这个问题,我将不胜感激!非常感谢 !

4

5 回答 5

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 字段和每个 other 字段的值添加<?= $name; ?><?php echo $name; ?>。如果您报告了 php 的所有错误,则首先在页面顶部初始化变量,因此:

$name = ''; $email = ''; //and so on
于 2013-08-01T16:12:22.253 回答
0

另一个用于浏览器端验证的灵活 jQuery 插件是http://bassistance.de/上的“Validation Plugin”

我鼓励您始终为服务器端创建验证方法,因为您不能依赖浏览器端验证。用户可以随时控制在浏览器中运行的 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 月 ( http://www.phparch.com/magazine/2009-2/september/ ) 中的文章“使用 SPL 数组迭代器的表单解析器”:

$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',
    ),
);
于 2013-08-01T17:20:28.960 回答
0

我使用这个https://github.com/posabsolute/jQuery-Validation-Engine如果您不介意使用 jQuery,它非常棒。

在验证字段之前,它不会提交表单。它验证大多数类型的字段类型,包括电子邮件。您还可以使用此插件通过 ajax 验证字段,例如检查用户名是否已经存在以及不提交表单的情况。

于 2013-08-01T16:06:11.287 回答
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']数组中的所有错误。

但是上面的代码只会检查用户是否在框中输入了内容。

它不会做任何花哨的事情,比如确保电子邮件实际上是电子邮件或任何东西。就像我说的......有些图书馆可以更好地处理这些东西。而且精度更高。

但它是如何工作的基础知识在上面。

于 2013-08-01T16:13:22.767 回答
0

您可以使用Zend Validators来完成所有这些工作。

他们有一个简单的抽象验证器类,带有一个检查输入是否通过验证器的方法。您可以使用他们预制的验证器,也可以通过扩展摘要来定义自己的验证器。

不要按照 Pjack 的建议单独使用 jQuery 验证。精明的用户可以禁用 JavaScript 并提交未通过验证规则的数据。

于 2013-08-01T16:10:01.673 回答