验证php表单 - 如何在表单上显示错误消息

时间:2012-01-21 19:01:48

标签: php css forms validation spam

我一直收到来自我表单的空白提交,我知道使用javascript验证(“必需”验证)并不总是有效,因为spambots可以关闭javascript。 所以我一直在寻找使用php验证我的PHP表单的方法。

经过一段时间的研究......我发现这会起作用:

    if (!$_POST['name'] )
{
die('Please fill in your name');
}

但是,在我点击提交按钮后,此消息“请填写您的姓名”会显示在其他页面上。理想情况下,我希望在表单所在的页面上显示该消息,尽管我很难找到一种方法来执行此操作。 (请原谅我对php的了解不足。)

我需要Ajax吗? 我假设我需要在表单页面上添加一个div,我希望显示错误消息?我如何要求php在表单页面上显示错误消息? IE:我需要在php流程表单中添加什么(以及上面的代码?)。

如果您需要我发布/添加更多详细信息,请询问,因为我感谢您的帮助!

=============================================== ======================= 更新

这是我的php流程表单:

<?
session_start();
include("verification_image.class.php");
$image = new verification_image();
if (($image->validate_code($_POST['validate']) ? "true" : "false") == "false") {
    header('Location: http://www.domain.com/fail.htm'); 
    exit;
}

if (!$_POST['rgerger'] )
{
die('You did not complete all of the required fields');
}


if(!empty($_POST['email'])){ die('Stop Spamming'); }

$to = "email@address.co.za";
$from = $_POST['ervberster']; 
$subject = "I Want to Advertise"; 
$sBodyNew = '<style type="text/css">
<!--
.style {
font-family: Arial;
font-size: 12px;
color: #4D241E;
}
body {
background-image: url();
background-color: #F1EAE4;
}
.style1 {font-size: 14px}
-->
</style>
<p>&nbsp;</p>
<table width="420" border="0" align="center" cellpadding="0" cellspacing="5">
 <tr>
<td><table width="100%"  border="0" cellpadding="8" cellspacing="0" bgcolor="#E7D3AF" 
class="style">
  <tr>
    <td colspan="2" valign="top"><div align="center"><strong><span class="style1">I 
Want to Advertise on AccommodationMozambique.co.za</span><br>
 &nbsp;.................................................</strong><br>
 &nbsp;</div></td>
    </tr>
  <tr>
    <td width="32%" valign="top"><div align="left"><strong>Date Submitted</strong>
 </div></td>
    <td width="68%" valign="top">'. date("F j, Y, g:i a") .'</td>
  </tr>
  <tr>
    <td valign="top"><div align="left"><strong>Name</strong></div></td>
    <td valign="top">'.$_POST['name'].'</td>
  </tr>
        <tr>
    <td valign="top"><div align="left"><strong>Email</strong></div></td>
    <td valign="top">'.$_POST['ervberster'].'</td>
  </tr>
  <tr>
    <td valign="top"><div align="left"><strong>Telephone</strong></div></td>
    <td valign="top">'.$_POST['werergrggef'].'</td>
  </tr>
  <tr>
    <td valign="top"><div align="left"><strong>Name of Lodge</strong></div></td>
    <td valign="top">'.$_POST['hneyjyttyh'].'</td>
  </tr>
  <tr>
    <td valign="top"><div align="left"><strong>Town / City</strong></div></td>
    <td valign="top">'.$_POST['gedghethth'].'</td>
  </tr>
  <tr>
    <td valign="top"><div align="left"><strong>Enquiry</strong></div></td>
    <td valign="top">'.$_POST['rervberer323'].'</td>
  </tr>
</table></td>
</tr>
</table>
';            
$headers  = "From: $from\r\n";
$headers .= "Content-type: text/html\r\n"; 
$success = mail($to, $subject, $sBodyNew, $headers);              
header('Location: http://www.domain.com/success.htm');  
?>

3 个答案:

答案 0 :(得分:4)

正如你所提到的,是的,JavaScript可以被关闭 - 不仅仅是垃圾邮件,任何人都可以。 JavaScript是一种客户端语言,因此验证发生在客户端。基于希望你的客户做你想做的事情的安全性是不好的。永远不要相信用户输入。

话虽如此,您在PHP验证的正确路径上,除了执行die()将导致您的页面在您打印表单之前停止执行。一种常见的方法是做这样的事情

$errors = array();

if (strlen($_POST['name']) < 5)
    $errors[] = "Username not long enough.";
if (usernameAvailable($_POST['name']))
    $errors[] = "Username already taken.";
if (otherValidationRule())
    $errors[] = "Something else isn't right.";

if (sizeof($errors) > 0) {
    foreach($errors as $error)
    {
        printf("<li>%s</li>", $error);
    }
}
else {
    print "Your data is OK!";
    // Do whatever you want with the data.
}

这将打印“您的数据正常!”如果用户输入没有任何问题,否则它将打印遇到的所有错误的列表。这可能是

  
      
  • 用户名不够长。
  •   
  • 其他事情不对。
  •   

一次只收到一个错误会给用户带来糟糕的体验,因为您最终可能需要提交5次表单,因为每次修复一件事都会出现新的错误。

答案 1 :(得分:1)

如果您对多个表单使用相同的页面,最好的方法是添加隐藏的输入:

<input type='hidden' name='action' value='sendMail' />

比PHP:

if( isset( $_POST['action'])){
    switch( $_POST['action'])){
        case 'sendMail':
            $msg = check_my_mail_form();
            if( $msg !== null){
                echo "Failed to send...";
            }
    }
}

function check_my_mail_form() {
    if( !isset( ...){
        return 'Please fill name';
    }
    return null;
}

当然,您应该使用不同的,更复杂的面向对象设计(例如使用validate()getError()等方法的类,但这应该是适合您的好地方。

答案 2 :(得分:1)

这取决于您提交表单的方式。假设您正在提交页面本身,那么在页面顶部添加如下内容:

<?php
$warnings = "";

if (isset($_POST)){ //if post variables have been sent then we validate
    if (!isset($_POST['name']) || trim($_POST['name'])==''){ //if the variable isn't set or if it's empty
       $warnings .= "<p>You must provide a name</p>";
    }
}

?>

然后,在页面的html中,您希望显示警告,您需要添加:

<?php
echo $warning;
?>

同样,请注意我的验证语法:if(!isset($ _ POST ['name']))...这将返回true,没有变量$ _POST ['name'],而if(!$ _ POST ['name])只会在某些时候设置$ _POST ['name'] = false;

让你记住![item]表示“item is false”,!isset([item])表示“变量不存在,[item] =='”表示该项存在,这是一个空字符串。这些都是不同的东西。