PHP Форма обратной связи Ошибка флажка - PullRequest
0 голосов
/ 09 декабря 2011

Хорошо, вот сокращенная версия php для моей контактной формы (флажки не отправляются правильно)

<?php
 //please fill this in at least!
$myemail = "";
$title = "Feedback Form"; 
if(isset($_POST['submit'])) { //form has been submitted
//set variables with filters
$cont_name = filter_var($_POST['cont_name'], FILTER_SANITIZE_STRING);
$email = filter_var($_POST['cont_email'], FILTER_SANITIZE_STRING);
$phone = filter_var($_POST['cont_phone'], FILTER_SANITIZE_STRING);
$first_time = filter_var($_POST['first_time'], FILTER_SANITIZE_STRING);
$hear_about = filter_var($_POST['hear_about'], FILTER_SANITIZE_STRING);

function valid_email($str){
    return ( ! preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $str)) ? FALSE : TRUE;} 

    $errors = 0; //by default there are no errors

    $trimcont_name = trim($cont_name);
    if(empty($trimcont_name)){
        //the name field is empty
        $errors = 1; //tips off the error messages below
        $errorcont_name = "The name field is empty"; //this error is displayed next to the label
    }
    if(!valid_email($email)) {
        //email is invalid or empty
        $errors = 1;
        $erroremail = "The email address was not valid";
    }
    $trimphone = trim($phone);
    if(empty($trimphone)){
        //the phone field is empty
        $errors = 1;
        $errorphone = "The phone field is empty";
    }
    $trimfirst_time = trim($first_time);
    if(empty($trimfirst_time)){
        //the first_time field is empty
        $errors = 1;
        $errorfirst_time = "This field is empty";
    }
    $trimhear_about = trim($hear_about);
    if(empty($trimhear_about)){
        //the hear_about field is empty
        $errors = 1;
        $errorhear_about = "This field is empty";
    }
    if($spam != "") {
        //spam was filled in
        $errors = 1;
        $errorspam = "The Spam box was filled in";
    }

    if($errors == 0) {
        $sendto = $myemail;
        $message = <<<DATA
DETAILS

Name: $cont_name 
Email: $email
Phone: $phone

Was this the first time you have been to us?
$first_time
How did you hear about us?
$hear_about

DATA;
        $headers = 'From: ' . $name . '<' . $email . '>';
           if(mail($sendto, $title, $message, $headers)) {
                //this is where it sends, using the php mail function
                $success = true;
                //set all the variables to blank to prevent re-submitting.
                $cont_name = "";
                $email = "";
                $phone = "";
                $hear_about = "";
                $first_time = "";
 } else {
                $success = false;
            }

    } else {
        $success = false;
    }
}

?>

И область, которая не функционирует правильно -

<fieldset>
    <legend>How did you hear about us? <span class="phpformerror"><?php echo $errorhear_about; ?></span></legend>
    <div><input type="checkbox" name="hear_about[]" value="Web" /> Web</div>
    <div><input type="checkbox" name="hear_about[]" value="Newspaper" /> Newspaper</div>
    <div><input type="checkbox" name="hear_about[]" value="Radio" /> Radio</div>
    <div><input type="checkbox" name="hear_about[]" value="Driving" /> Driving Past</div>
    <div><input type="checkbox" name="hear_about[]" value="Referal" /> Referal</div>
    <div><input type="checkbox" name="hear_about[]" value="Other" /> Other</div>
</fieldset>

В настоящее время будет отображаться только одна из переменных, если выбрано несколько переменных.

Ответы [ 2 ]

2 голосов
/ 09 декабря 2011

hear_about - это массив, а filter_var() неправильно обрабатывает массивы. Вместо этого используйте filter_var_array () :

$hear_about = filter_var_array($_POST['hear_about'], FILTER_SANITIZE_STRING);

Помните, что $hear_about - это массив, и его нужно рассматривать как единое целое в вашем коде (например, использование $hear_about не будет работать, оно должно быть $hear_about[0], $hear_about[1] и т. Д.).

Так, например, в вашей линии отделки вам понадобится что-то вроде:

foreach($hear_about as $key => $value) {
$trimhear_about[$key] = trim($value);
    if(empty($trimhear_about[$key])){
        //the hear_about field is empty
        $errors = 1;
        $errorhear_about[$key] = "This field is empty";
    }
}

Это сохранит преимущества работы с массивом.

0 голосов
/ 09 декабря 2011

$_POST['hear_about'] - массив значений. Вы обрабатываете это как простую строку!

Я думаю, что вы можете решить, просто заменив строку:

$hear_about = filter_var($_POST['hear_about'], FILTER_SANITIZE_STRING);

С:

$hear_about = filter_var(implode(', ', $_POST['hear_about']), FILTER_SANITIZE_STRING);

Функция взрыва ( doc ) "преобразует" массив в строку путем конкатенации значения массива с указанным клеем . Таким образом, вы можете просто объединить выбранный "Как вы узнали о нас?" варианты с запятой, а затем использовать полученную строку в качестве других данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...