Ошибки контактной формы Php

Я создаю контактную форму php, которая проверяет, заполнены ли некоторые поля или нет (без ajax). Форма не работает на 100%. Я попытаюсь объяснить. Когда я отправляю форму, пользователь переходит на http://mydomain.com/send.php. получать мои сообщения об ошибках (если они есть). Когда я обновляю страницу send.php, я получаю следующие ошибки: Notice: Undefined index: name in /Library/WebServer/Documents/~aledvertising/send.php

Вот мой код

html-форма

<form method="post" action="send.php">
    <div id="form-top">

    </div>
    <div id="form-left">  
<label>Naam:<span class="star">*</span></label>
    <input name="name" placeholder="Uw naam">


    <label>Email:<span class="star">*</span></label>
    <input name="email" type="email" placeholder="Uw email">

    <label>Hoeveel is 2+2? (Anti-spam)<span class="star">*</span></label>
<input name="human" placeholder="Uw antwoord">

    </div>
    <div id="form-right">
    <label>Uw bericht:<span class="star">*</span></label>
    <textarea name="message" placeholder="Uw bericht"></textarea>
    </div>
        <input id="submit" name="submit" type="submit" value="Verzenden">
</form>

ОТПРАВИТЬ.PHP

<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: ' . $_POST['email']; 
    $to  = '[email protected]' . ', '; 
    $to .= $_POST['email'];
    $subject = 'Uw vraag op www.aledvertising.be';
    $human = $_POST['human'];

    $body = "From: $name\n E-Mail: $email\nMessage:\n $message";
 ?>
 <?php
if ($_POST['submit']) {
    if ($name != '' && $email != '' && $message != '') {
        if ($human == '4') {                 
            if (mail ($to, $subject, $body, $from)) { 
            echo '<p class="green">Uw bericht is succesvol verzonden.</p>';
        } else { 
            echo '<p>Er iets misgelopen, probeer opnieuw aub.</p>'; 
        } 
    } else if ($_POST['submit'] && $human != '4') {
        echo '<p>2+2 is niet gelijk aan het getal dat u hebt ingevoerd.</p>';
    }
    } else {
        echo '<p>Alle velden met een * zijn verplicht in te vullen.</p>';
    }
}
    ?>

Может ли кто-нибудь помочь мне получить полную рабочую форму? Спасибо


person Niels    schedule 30.04.2013    source источник
comment
Прочитайте php.net/manual/en/function.isset.php.   -  person j08691    schedule 30.04.2013
comment
В вашей форме возможна инъекция заголовка почты. Никогда не доверяйте этим $_POST переменным. А разве ты не должен сегодня отмечать День королевы? ;-)   -  person Marcel Korpel    schedule 30.04.2013
comment
Похоже, он не установлен и просто уведомляет вас   -  person Biotox    schedule 30.04.2013


Ответы (2)


Вы должны увидеть метод isset из php.

<?php
if(isset($_POST["name"]))
{
//code here

}
?>

Проблема в том, что когда вы перезагружаете страницу, серверный код ищет индекс name и не находит его, потому что name еще не имеет никакого значения. Значение будет получено после отправки страницы. Вот поэтому и ошибка.

обновить

Ошибка заключается в том, что когда вы отправляете форму, некоторые поля могут быть отправлены пустыми, поэтому, как только значения сообщения отправляются в send.php, есть $_POST, которые будут ожидать значений. если некоторые из них не получают значений do, он скажет вам: «Эй, у меня нет значений, поэтому я нулевой». Вот почему вы должны проверить, что все поля заполнены или сделать проверку на стороне сервера.

<?php
if(isset($_POST["name"],$_POST["last_name"],etc,etc))
{
//if everything ok, ill go on.
}
else{
//if there are empty field, go back
}

?>

ОБНОВЛЕНИЕ 2

if (isset($_POST['name'],$_POST['email'],$_POST['message'])){

    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: ' . $_POST['email']; 
    $to  = '[email protected]' . ', '; 
    $to .= $_POST['email'];
    $subject = 'Uw vraag op www.aledvertising.be';
    $human = $_POST['human'];

    $body = "From: $name\n E-Mail: $email\nMessage:\n $message";
    if ($name != '' && $email != '' && $message != '') {
        if ($human == '4') {                 
            if (mail ($to, $subject, $body, $from)) { 
            echo '<p class="green">Uw bericht is succesvol verzonden.</p>';
        } else { 
            echo '<p>Er iets misgelopen, probeer opnieuw aub.</p>'; 
        } 
    } else if ($_POST['submit'] && $human != '4') {
        echo '<p>2+2 is niet gelijk aan het getal dat u hebt ingevoerd.</p>';
    }
    } else {
        echo '<p>Alle velden met een * zijn verplicht in te vullen.</p>';
    }
}
person Community    schedule 30.04.2013
comment
Спасибо EinerS, но действие (send.php) правильно на странице html-формы? Мне просто нужно отредактировать мой send.php? - person Niels; 30.04.2013
comment
Может быть Да или нет. Почему? Хорошо, когда send.php находится в том же каталоге, да. Если нет, то нет. См. [см. здесь](webdesign.about.com/od/beginningtutorials/a/ aa040502a.htm) для получения дополнительной информации об относительном и абсолютном пути. - person ; 30.04.2013
comment
EinerS, я понимаю относительный, абсолютный путь. Send.php находится в том же каталоге. Просто чтобы быть уверенным, что я должен сделать: - person Niels; 30.04.2013
comment
Ваша ссылка не работает. Используйте [this form](http://example.com) для создания гиперссылки. - person Marcel Korpel; 30.04.2013
comment
Простите за это. Сделанный. Вы можете проверить сейчас. - person ; 30.04.2013
comment
Из этой строки if ($_POST['submit']) { ... я должен использовать функцию isset? - person Niels; 30.04.2013
comment
@NielsJansen: уже в первой строке что-то идет не так. Вы должны проверить все $_POST переменные. Отправляет ли форма электронное письмо при первой отправке? - person Marcel Korpel; 30.04.2013
comment
Да, форма работает хорошо, она просто вылетает, когда я обновляю send.php - person Niels; 30.04.2013
comment
@NielsJansen: И вас не просят повторно отправить форму? Если это так, если вы нажмете «отмена», никакие переменные не будут отправлены, поэтому $_POST['name'] просто не будет установлено. - person Marcel Korpel; 30.04.2013
comment
Я понимаю, что делает функция isset (проверяет, не является ли переменная нулевой), но здесь я немного запутался. Я действительно не знаю, что мне нужно изменить, чтобы не получать ошибок. - person Niels; 30.04.2013
comment
@NielsJansen проверьте, не пусты ли все $_POST, и это сработает. - person ; 30.04.2013
comment
Сообщение @NielsJansen сохраняется в кеше, что означает, что после перезагрузки страницы значение отправляется снова. вот почему предупреждающее сообщение. Марсель Корпель прав, если нажать кнопку отмены, переменная не будет отправлена. - person ; 30.04.2013
comment
EinerS смотрите пост дигитайзера ниже. Это правильный путь? - person Niels; 30.04.2013
comment
Также проверьте наличие $_POST['human'] и $_POST['submit'] перед их использованием. - person Marcel Korpel; 30.04.2013

<?php
if (isset($_POST['submit'])) {
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: ' . $_POST['email']; 
    $to  = '[email protected]' . ', '; 
    $to .= $_POST['email'];
    $subject = 'Uw vraag op www.aledvertising.be';
    $human = $_POST['human'];

    $body = "From: $name\n E-Mail: $email\nMessage:\n $message";
    if ($name != '' && $email != '' && $message != '') {
        if ($human == '4') {                 
            if (mail ($to, $subject, $body, $from)) { 
            echo '<p class="green">Uw bericht is succesvol verzonden.</p>';
        } else { 
            echo '<p>Er iets misgelopen, probeer opnieuw aub.</p>'; 
        } 
    } else if ($_POST['submit'] && $human != '4') {
        echo '<p>2+2 is niet gelijk aan het getal dat u hebt ingevoerd.</p>';
    }
    } else {
        echo '<p>Alle velden met een * zijn verplicht in te vullen.</p>';
    }
}
?>

установка функции isset(), а затем объявление переменных сработало для меня, протестировано на моем сервере, не выдавая никаких ошибок, и форма успешно отправлена ​​​​...

пожалуйста, проверьте это один раз...

person Community    schedule 30.04.2013
comment
Это работает для меня! Спасибо дигитайзер! НО один вопрос, это правильный способ работы с формами? - person Niels; 30.04.2013
comment
@NielsJansen: Нет, вы не можете предположить, что, поскольку $_POST['submit'] присутствует, все остальные также присутствуют. - person Marcel Korpel; 30.04.2013
comment
Я действительно больше этого не понимаю. Я не получаю ошибок с кодом от дигитайзера, но я больше не получаю электронное письмо. Я просто не знаю, как изменить свой код. Я не знаю, что писать после if(isset($_POST[name],$_POST[last_name],etc,etc)) - person Niels; 30.04.2013
comment
электронное письмо, которое вы говорите, это значение поля формы электронной почты или фактическое электронное письмо не отправлено? также я видел, что вы используете адрес электронной почты [email protected].?? - person ; 30.04.2013
comment
Спасибо ЭйнерС. Сейчас форма работает на 100%. Это тоже 100% сохранение. (прочитайте что-нибудь о внедрении заголовков). Вопрос 2. Электронное письмо, которое я получаю, представляет собой обычный текст без какой-либо разметки. Могу ли я изменить это? - person Niels; 30.04.2013
comment
@NielsJansen: Нет, это все еще небезопасно, вы должны проверить, содержит ли $_POST['email'] действующий адрес электронной почты, иначе легко ввести \r\nBcc: [email protected] в вашу форму. - person Marcel Korpel; 30.04.2013
comment
@NielsJansen, если это сработало, отметьте мой ответ как выбранный, чтобы другие, у кого такая же проблема, сразу увидели, что с ними происходит. - person ; 30.04.2013
comment
@EinerS, согласно первой строке вашего решения, строка if ($name != '' && $email != '' && $message != '') { из OP становится ненужной.... - person ; 30.04.2013
comment
@digitiZer знаете ли вы, что когда вы нажимаете пробел, это считается значением? Попробуйте этот код ‹html›‹input type=text onkeyup=value(this)› ‹script›function value(object){alert(object.value.length);} ‹/script›‹/html› и нажмите пробел и посмотри сам, почему это небезопасно :D - person ; 30.04.2013
comment
@digitiZer: Нет, это неправда: есть разница между установленной переменной и пустой переменной. - person Marcel Korpel; 30.04.2013