Проверка формы PHP - Как показать сообщение об ошибке в форме - PullRequest
1 голос
/ 21 января 2012

Я получаю пустые сообщения от моей формы, и я знаю, что проверка («обязательная» проверка) с использованием 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 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 ]

4 голосов
/ 21 января 2012

Как вы упомянули, да, 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 голос
/ 21 января 2012

Это зависит от того, как вы отправляете форму. Предполагая, что вы отправляете саму страницу, затем в верхней части страницы добавьте что-то вроде этого:

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

Также , обратите внимание на мой синтаксис проверки: если (! Isset ($ _ POST ['name'])) ... это вернет true, если переменная $ _POST ['name'] отсутствует, тогда как if (! $ _ POST ['name]) вернет true, только если в какой-то момент вы установили $ _POST [' name '] = false;

Помните, что! [Item] означает «item is false»,! Isset ([item]) означает «переменная не существует, а [item] == '» означает, что элемент существует и что это пустая строка. Все это разные вещи.

1 голос
/ 21 января 2012

Если вы используете одну и ту же страницу для нескольких форм, лучшим способом было бы добавить скрытый ввод:

<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()), но это должно быть хорошим началом для вас.

...