Проверка контактной формы PHP не работает

У меня есть контактная форма по адресу http://www.kaimeramedia.com/derek/Website/contact.php. Я проверил свой код PHP на PHPcodechecker.com, и он говорит, что синтаксических ошибок нет. Я думаю, что начальный код работает в каком-то поместье, потому что каждый раз, когда я нажимаю «Отправить», он переходит к следующей проверке, где я остаюсь с: «Обнаружен неправильный адрес электронной почты. Пожалуйста, нажмите кнопку «Назад» в браузере и повторите попытку».

Я просто хочу знать, должен ли я писать код по-другому, чтобы убедиться, что проверка электронной почты прошла и разрешила отправку сообщения. Я не уверен, что у меня что-то закодировано наоборот. Я перепробовал много комбинаций, но в нынешнем виде это самая дальняя из тех, что мне удалось пройти без ошибки mailform.php. Код для файла mailform.php:

 <?php 
     session_start();
     $dontsendemail = 0;
     $possiblespam = FALSE;
     $strlenmessage = "";
     $email = $_REQUEST['email']; 
     $name = $_REQUEST['name']; 
     $message = $_REQUEST['message']; 
     $subject = "Regarding Your Portfolio";$emailaddress = "[email protected]"; 

     // checks if name field is empty
     function checkname() {
if (empty($name)) {
    die ("You did not enter your name.  Please hit your browser back button and try again.");
return 1;
            }
        }

// checks if the captcha is input correctly
function checkcaptcha() {
            if ($_SESSION["pass"] != $_POST["userpass"]) {
                die("Sorry, you failed the CAPTCHA. Note that the CAPTCHA is case-sensitive. Please hit your browser back button and try again.");
                return 1;
            }
        }

// checks proper syntax 
function checkemail() {
    if(preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $email));
    else{
        die("Improper email address detected. Please hit your browser back button and try again."); 
        return 1;
    }
}


function spamcheck($field) {
    if(eregi("to:",$field) || eregi("cc:",$field) || eregi("\r",$field) || eregi("\n",$field) || eregi("%0A",$field)){ 
        $possiblespam = TRUE;
    }else $possiblespam = FALSE;
    if ($possiblespam) {
        die("Possible spam attempt detected. If this is not the case, please edit the content of the contact form and try again.");
        return 1;
    }
}
function strlencheck($field,$minlength,$whichfieldresponse) {
    if (strlen($field) < $minlength){
        die($whichfieldresponse); 
        return 1;
    }



}

        if ($dontsendemail == 0) $dontsendemail = checkcaptcha($email);

if ($dontsendemail == 0) $dontsendemail = checkemail($email);
if ($dontsendemail == 0) $dontsendemail = spamcheck($email);
if ($dontsendemail == 0) $dontsendemail = spamcheck($name);
if ($dontsendemail == 0) $dontsendemail = strlencheck($email,10,"The email address field is too short. Please hit your browser back button and check your entry.<br />");
if ($dontsendemail == 0) $dontsendemail = strlencheck($message,10,"The message field is too short. Please hit your browser back button and check your entry.<br />");
if ($dontsendemail == 0) $dontsendemail = strlencheck($emailaddress,8,"You have not selected a recipient of your message. Please hit your browser back button and check your entry.<br />");
if ($dontsendemail == 0) $dontsendemail = strlencheck($name,3,"The Name field is too short. Please hit your browser back button and check your entry.<br />");
if ($dontsendemail == 0) {mail($emailaddress,"Subject: $subject",$message,"From: $name,$email" ); include "thankyou.php";}
?> 

Я поместил фиктивный адрес электронной почты в этот код, но настоящий находится в файле mailform.php. Если кто-нибудь увидит, где я ошибся, буду очень признателен.


person Derek Holliday    schedule 25.02.2012    source источник
comment
Можете ли вы загрузить адрес электронной почты, с которым вы тестируете?   -  person MichaelH    schedule 25.02.2012
comment
@giorgio Я думал, что это может быть проблема с регулярным выражением.   -  person MichaelH    schedule 25.02.2012
comment
Это на странице php, если вы посмотрите на исходный код на www.kaimeramedia.com/derek/Website/mailform.php   -  person Derek Holliday    schedule 25.02.2012


Ответы (2)


Основываясь на своем предыдущем ответе, я сделал все возможное и очистил ваш сценарий. У меня явно слишком много свободного времени. Не проверял, работает ли. Удачи!

<?PHP
session_start();
try{
    $check = new check();
    if(!isset($_REQUEST['Email']))
        throw new exception('You did not enter an email address.');

    if(!isset($_REQUEST['message']))
        throw new exception('You did not enter a message.');

    if(!isset($_REQUEST['Name']))
        throw new exception('You did not enter a name');

    $sender = $_REQUEST['Email'];
    $message = $_REQUEST['message'];
    $name = $_REQUEST['Name'];
    $recipient = '[email protected]';

    $subject = 'Regarding Your Portfolio';

    if($check->captcha('userpass') == FALSE)
        throw new exception('Your captcha is incorrect.');

    if($check->spam($sender) == FALSE)
        throw new exception('Your email field contains spam.');

    if($check->spam($name) == FALSE)
        throw new exception('Your name field contains spam.');

    if($check->length($sender, 10) == FALSE)
        throw new exception('Your email field does not satisfy the minimum character count.');

    if($check->length($message, 8) == FALSE)
        throw new exception('Your message field does not satisfy the minimum character count.');

    if($check->length($name, 3) == FALSE)
        throw new exception('Your name field does not satisfy the minimum character count.');

    mail($recipient, $subject, $message, "From: $name <$sender>" );
    include "thankyou.php";
}catch (Exception $E){
    die($E->getMessage());
}




class check{

    function captcha($field){
        if(isset($_REQUEST[$field])==FALSE){ return false; }
        if($_SESSION['pass'] != $_REQUEST[$field]){ return false; }
        return true;
    }

    function email($email){
        if(!filter_var($email, FILTER_VALIDATE_EMAIL)){ return false;}
        return true;
    }

    function spam($field){
        if(eregi("to:",$field) || eregi("cc:",$field) || eregi("\r",$field) || eregi("\n",$field) || eregi("%0A",$field)){ return false; }
        return true;
    }

    function length($field, $min){
        if(strlen($field) < $min){ return false; }
        return true;
    }
}
person MichaelH    schedule 25.02.2012
comment
Я попробовал ваш приведенный выше код как на phpcodechecker.com, так и на странице mailform_test.php, расположенной по адресу www.kaimeramedia.com/derek/Website/mailform_test.php, и программа проверки кода не обнаружила ошибок. - person Derek Holliday; 25.02.2012
comment
Однако, когда вы загрузите страницу contact.php и правильно заполните все поля и нажмете «Отправить», вы останетесь с результирующей страницей и текстом: Я попробовал ваш приведенный выше код как на phpcodechecker.com, так и создал страницу mailform_test.php, расположенную по адресу www. .kaimeramedia.com/derek/Website/mailform_test.php и программа проверки кода ошибок не обнаружили. Однако, когда вы загружаете страницу, вы автоматически перенаправляетесь на новую страницу с результирующим текстом: Вы не ввели адрес электронной почты. - person Derek Holliday; 25.02.2012
comment
Я отправил вас не туда... www.kaimeramedia.com/derek/Website/contact_testnew.php - person Derek Holliday; 25.02.2012
comment
Это потому, что ваше имя поля «Электронная почта», а не «электронная почта». То же самое с полем имени. Я исправил код. - person MichaelH; 26.02.2012
comment
Спасибо, Майкл. И последнее, если вы можете помочь. Как сделать так, чтобы страница Thankyou.php загружалась в том же окне контента. Мое меню настроено таким образом, чтобы обеспечить это: <a href="javascript:loadContent('#content', 'cgi_new.php'), loadContent('#footer', 'footer_cgi.php');"> но я не уверен, как адаптировать код для страницы почтовой формы. Кстати, я только что сделал все в нижнем регистре ... так странно, что я не видел, чтобы имя и адрес электронной почты были написаны с большой буквы. Если вы можете помочь, дайте мне знать - person Derek Holliday; 26.02.2012
comment
Да, и еще одна вещь: я получаю электронные письма в порядке, но имя и адрес электронной почты отправителя не публикуются в нем, поэтому я не могу на них ответить. - person Derek Holliday; 26.02.2012
comment
С помощью этой формы вы будете публиковать сообщения на другой странице. Чтобы она загружалась в том же окне, вам нужно будет использовать AJAX, или вы можете опубликовать сообщение на той же странице и поместить php-код там, где вы хотите. Что касается проблемы с ответом, я думаю, что ваши почтовые заголовки были неправильными, и код снова обновлен. - person MichaelH; 26.02.2012
comment
Спасибо за быстрый ответ и исправление. Я попытаюсь выяснить, как перезагрузить благодарность в текущем слое div. - person Derek Holliday; 26.02.2012
comment
Если вы хотите, чтобы он перезагрузил текущий слой div, вместо div вы можете использовать iframe. - person MichaelH; 27.02.2012

В вашем скрипте две проблемы.

  1. Вы не анализируете параметр $email. Вы забыли включить его.
  2. Регулярные выражения для электронной почты очень разборчивы и не всегда включают все стандарты.

Решение: Начиная с PHP5, вы можете использовать следующее для проверки электронной почты или, если вы хотите использовать регулярное выражение, просто добавьте параметр $email.

function checkemail($email) {
    if(filter_var($email, FILTER_VALIDATE_EMAIL)){
    }else{
        die("Improper email address detected. Please hit your browser back button and try again."); 
        return 1;
    }
}
person MichaelH    schedule 25.02.2012
comment
Я попытался просто ввести этот код на исходную страницу mailform.php, но все равно получаю те же результаты в отношении электронной почты. Попробуйте его на www.kaimeramedia.com/derek/Website/contact.php. Эта проверка электронной почты - проклятие на моей стороне! - person Derek Holliday; 25.02.2012