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

Posted

技术标签:

【中文标题】验证 php 表单 - 如何在表单上显示错误消息【英文标题】:Validating php form - How to show error message on the form 【发布时间】:2012-02-15 20:48:11 【问题描述】:

我一直收到来自我的表单的空白提交,我知道使用 javascript 进行验证(“必需”验证)并不总是有效的,因为垃圾邮件机器人可以关闭 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  border="0" align="center" cellpadding="0" cellspacing="5">
 <tr>
<td><table   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  valign="top"><div align="left"><strong>Date Submitted</strong>
 </div></td>
    <td  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');  
?>

【问题讨论】:

你不用死。如果你犯了一个错误,你不会死,所以你的网站也不会死。 【参考方案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 时返回 true;

请记住,![item] 表示“项目为假”,!isset([item]) 表示“变量不存在,[item]=='' 表示项目存在, 并且它是一个空字符串。这些都是不同的东西。

【讨论】:

【参考方案2】:

正如您所提到的,是的,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.

如果用户输入没有问题,这将打印 "Your data is OK!",否则它将打印遇到的所有错误的列表。可能是这样的

用户名不够长。 还有什么不对劲的地方。

一次只得到一个错误会带来糟糕的用户体验,因为您最终可能不得不提交 5 次表单,因为每次修复一个问题时,都会出现一个新错误。

【讨论】:

解释清楚,谢谢!请在我上面的帖子中查看我的更新。我已经添加了我的过程 php 表单。当我的表单被提交时,你可以看到它进入了我的 success.htm 页面。现在根据您上面的代码,我假设我需要告诉 else print "Your data is OK!"; 去那个 success.htm 页面?? 我假设您想先对数据一些事情,比如将其插入数据库或类似的东西。之后,您可以使用header() 将用户重定向到success.htm,就像您在代码中所做的那样。 我不会说我会将任何信息插入数据库。除非我理解不正确,否则我只想按照上面的流程表格将表格发送给收件人。所以我的问题是,我还需要根据上面的代码在 ELSE 语句中添加任何内容吗? 为什么要验证用户数据?您需要用户数据做什么? 我想验证用户数据,因为我收到了很多垃圾邮件机器人发送的空提交。因此,如果我在字段不能留空的情况下进行了 php 验证,那么这将阻止进一步的空表单提交(因为目前 javascript 并没有阻止这一点)。【参考方案3】:

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

<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() 方法的类),但这应该是您开始的好地方。

【讨论】:

以上是关于验证 php 表单 - 如何在表单上显示错误消息的主要内容,如果未能解决你的问题,请参考以下文章

异步提交表单时如何显示 php 错误消息?

如何为表单验证生成错误消息

在输入字段下显示表单错误消息 Phalcon php

在联系表单 7 上隐藏验证错误或成功消息框

表单验证错误消息以角度提交时显示

查找验证错误的错误号