2013-07-11 2 views
0

У меня есть контактная форма на сайте, который я разрабатываю, и написал какой-то PHP, который вернет ошибки на страницу, если определенные поля не заполнены правильно, все работает нормально, письмо отправляется, если оно заполняется правильно, и если это неправильные сообщения об ошибках отправляются и отображаются.Дилемма заголовка и эха

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

Я провел некоторое исследование и увидел, что могу использовать id-привязки и заголовок, но если я это сделаю, страница загружается там, где я говорю, но сообщение об ошибке не отображается. Я попытался использовать цикл if с переменной _GET, чтобы проверить, соответствует ли это что-то в сообщении об ошибке, но, похоже, не работает нормально.

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

Я только начал изучать PHP, поэтому я был бы признателен за помощь в разрешении этого. Заранее благодарим за помощь и предложения.

Вот некоторые скриншоты сайта:
http://imgur.com/a/Hv5OW

Вот код этой страницы:

<?php 
if ($_SERVER["REQUEST_METHOD"] == "POST") { 
    $name = trim($_POST["name"]); 
    $email = trim($_POST["email"]); 
    $message = trim($_POST["message"]); 

    if ($name == "" OR $email == "" OR $message == "") { 
     $error_message = "You must enter a name, email address and message"; 
    } 

    if (!isset($error_message)) { 
     foreach ($_POST as $value) { 
      if (stripos($value, 'Content-Type:') !== false) { 
       $error_message = "There was a problem with the information you submitted"; 
      } 
     } 
    } 

    if (!isset($error_message) && $_POST["address"] != "") { 
     $error_message = "Your contact form submission has an error"; 
    } 

    require_once("inc/phpmailer/class.phpmailer.php"); 
    $mail = new PHPMailer(); 

    if (!isset($error_message) && !$mail->ValidateAddress($email)) { 
     $error_message = "You must specify a valid email address"; 
    } 

    if (!isset($error_message)) { 
     $email_body = ""; 
     $email_body = $email_body . "Name: " . $name . "<br>"; 
     $email_body = $email_body . "Email: " . $email . "<br>"; 
     $email_body = $email_body . "Message: " . $message; 

     $mail->SetFrom($email, $name); 
     $address = "[email protected]"; 
     $mail->AddAddress($address, "Corwen Forestry Timber Products Ltd."); 
     $mail->Subject = "Website Contact Form Submission | " . $name; 
     $mail->MsgHTML($email_body); 

     if ($mail->Send()) { 
      header("Location: contact.html?status=thanks"); 
      exit; 
     } 
     else { 
      $error_message = "There was a problem sending the email: " . $mail->ErrorInfo; 
     } 
    } 
} 
; 
?> 

<?php 
$title = "Corwen Forestry Online | Contact Us"; 
$active = "contact"; 
include("inc/header.php"); 
?> 
    <img class="banner" src="images/contact-us.jpg" alt="Contact us background image."> 

    <article class="band content-wrap clearfix"> 

     <?php if (isset($_GET["status"]) && $_GET["status"] == "thanks") { ?> 
      <section> 
       <p class="contact-thanks">Thanks for getting in touch, we'll get back to you as soon as we can.</p> 
      </section> 
     <?php } 
     else { ?> 

      <header> 
       <h2>Contact Us</h2> 
      </header> 

      <section class="contact-intro"> 
       <p> 
        Lorizzle hizzle dolor fizzle amizzle, consectetuer adipiscing elizzle. Crackalackin sapien velizzle, 
        my shizz volutpizzle, suscipit quis, its fo rizzle vel, arcu. Pellentesque fizzle tortizzle. Izzle 
        mammasay mammasa mamma oo sa. Fusce izzle dolor dapibus turpis tempizzle tellivizzle. Crunk 
        pellentesque nibh izzle turpizzle. Fo shizzle my nizzle funky fresh crackalackin. Pellentesque 
        eleifend rhoncizzle nisi. In for sure habitasse platea dictumst. Donec dapibizzle. Curabitur gangsta 
        urna, pretizzle eu, pizzle ac, my shizz vitae, nunc. Da bomb suscipizzle. Integer break it down 
        pimpin' shiznit fo shizzle my nizzle. 
       </p> 
      </section> 

      <section id="error-anchor" class="contact-third first"> 
       <img src="images/contact-icon-email.png" alt="email icon"> 

       <h3><a href="mailto:[email protected]">[email protected]</a></h3> 
      </section> 

      <section class="contact-third"> 
       <img src="images/contact-icon-address.png" alt="address icon"> 

       <h3> 
        Ty&rsquo;n Llidiart Industrial Estate<br> 
        Corwen<br> 
        Denbighshire<br> 
        LL21 9RZ 
       </h3> 
      </section> 

      <section class="contact-third"> 
       <img src="images/contact-icon-phone.png" alt="phone icon"> 

       <h3>01490 412 146</h3> 
      </section> 

      <?php 
      if (isset($error_message)) { 
       header("Location: contact.html#error-anchor"); 
       echo '<p class="error-message">' . $error_message . '</p>'; 
      } 
     ; 
      ?> 

      <form class="clearfix" method="post" action="contact.html"> 
       <table class="contact-us"> 
        <tr> 
         <th> 
          <label for="name">Name</label> 
         </th> 
         <td> 
          <input type="text" name="name" id="name"> 
         </td> 
        </tr> 
        <tr> 
         <th> 
          <label for="email">Email</label> 
         </th> 
         <td> 
          <input type="text" name="email" id="email"> 
         </td> 
        </tr> 
        <tr> 
         <th> 
          <label for="message">Message</label> 
         </th> 
         <td> 
          <textarea name="message" id="message"></textarea> 
         </td> 
        </tr> 
        <tr style="display: none;"> 
         <th> 
          <label for="address">Address</label> 
         </th> 
         <td> 
          <p>Please leave the address field blank, it's an anti-spam measure.</p> 
          <input type="text" name="address" id="address"> 
         </td> 
        </tr> 
       </table> 
       <input type="submit" value="Send Message"> 
      </form> 

      <section class="map"> 
       <iframe width="47.7%" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" 
         src="https://maps.google.co.uk/maps/ms?msa=0&amp;msid=208085933608816427574.0004e1242973ccf3517ee&amp;ie=UTF8&amp;t=m&amp;ll=52.977589,-3.414001&amp;spn=0.144707,0.291824&amp;z=11&amp;output=embed"></iframe> 
       <br/> 
       <small>View <a target="_blank" 
           href="https://maps.google.co.uk/maps/ms?msa=0&amp;msid=208085933608816427574.0004e1242973ccf3517ee&amp;ie=UTF8&amp;t=m&amp;ll=52.977589,-3.414001&amp;spn=0.144707,0.291824&amp;z=11&amp;source=embed" 
           style="color:#0000FF;text-align:left">CFTP HQ and Mills</a> in a larger map 
       </small> 
      </section> 

      <section class="map-key"> 
       <ul> 
        <li> 
         <img src="images/a-sml.png" alt="Head Office map icon key."> 
         Head Office &amp; Shop 
        </li> 
        <li> 
         <img src="images/b-sml.png" alt="Gwyddelwern Sawmill map icon key."> 
         Gwyddelwern Sawmill 
        </li> 
        <li> 
         <img src="images/c-sml.png" alt="Llandrillo Sawmill map icon key."> 
         Llandrillo Sawmill 
        </li> 
       </ul> 
      </section> 

     <?php } ?> 
    </article><!-- end band content-wrap --> 

<?php include("inc/footer.php"); ?> 
+0

Вы говорите, что перенаправляетесь к определенному якорю, если форма неверна. Но это не показано из вашего кода выше. Не могли бы вы обновить свой код? –

+0

@claarman Я добавил строку заголовка («Location: contact.html # error-anchor»); где у меня было это, когда я пытался заставить его работать. – number8pie

+0

проверить мой ответ, который должен работать (с небольшим количеством настроек) –

ответ

2

Как я получить от вашего вопроса, вы можете использовать следующие подход:

Идея заключается в том, чтобы «привязать» форму onSubmit - это позволяет нам спуститься до формы, несмотря на то, что форма valiadtion прошла успешно или нет, сразу после нажатия кнопки отправки.

1) Настройка "якорь" -действие так:

<form class="clearfix" method="post" action="contact.html#myAnchor"> 

2) Настройка "фальшивый" URL прямо над формой, как это:

<a href="#myAnchor"></a> 
<form class="clearfix" method="post" action="contact.html#myAnchor"> 

вы можете стиль это вам нравится, или используйте id = "myAnchor" в теге формы, если он не сломает ничего.

3) Используйте свой текущий код, на первый взгляд, это выглядит отлично:

if (!isset($error_message)) { 
    // Send mail 
} else { 
    // do everything you want with error variable. 
} 

4) Печатает ошибку прямо над формой

<a href="#myAnchor"></a> 
<?= $sFormattedErrorVariable ?> 
<form class="clearfix" method="post" action="contact.html#myAnchor"> 

Надежда это помогает. Ура!

+0

Я использовал это, и он работает, спасибо. Я попытался немного изменить его, я хочу, чтобы условное выражение в теге формы отображалось echo action = "contact.html", когда переменная $ error_message не установлена ​​и action = "contact.html # error_anchor", когда она установлена. Дело в том, что я настроил его, и он работает только во втором ошибочном представлении, а не в первом. Вот код, который я использую в теге формы number8pie

+0

Ой, подождите, я вижу, почему сейчас, когда он изначально отправлен методом формы, даже если он получил ошибки, по-прежнему остается contact.html, только когда передается второй submit, он имеет правильное действие. – number8pie

+0

Да. Подход, который я предложил, заставляет вас работать с кодом. Form Submit -> Error (?) -> Если да - действие acnhor сводилось к форме -> Если нет -> get out oh here by your header ("Location: contact.html? Status = thanks"); ' , создавая новую «четкую» страницу. Для более продвинутой техники читайте об AJAX - это позволяет вам создавать сайт с лучшей производительностью, более гибким и симпатичным;). Ура! –

-1

Вы должны создать более умные отлавливать ошибки. Возможно, создайте массив ошибок и добавьте новые. джаз:

$error_message = array(); 
... 
// $error_message[ID_MSG] 
$error_message[2] = "text of msg"; 
... 
<td> 
<input <?php 
    if(isset($error_message[2])) { 
    echo 'value="' . $email . '" class="errorStyle"'; 
    } 
?> type="text" name="email" id="email"> 
</td> 
... 

Для подсчета ошибок использовать некоторые, как:

count($error_message) > 0 
+1

Я не понимаю, как это относится к вопросу и ситуации, о которых я говорил выше. – number8pie

2

Я считаю, что вы хотите что-то вроде этого.Если вы размещаете форму неправильного он должен перенаправить пользователя на ссылку, как:

Header('Location: contact.html?error=' . $error . '#error-anchor'); 

Чтобы получить эту работу, вам придется изменить пару вещей;

Ваша форма должна идентификатор

<form class="clearfix" method="post" action="contact.html" id="error-anchor"> 

Чтобы сохранить ваш URL очистки вы можете захотеть изменить обработку вашей ошибки, например, изменения:

if ($name == "" OR $email == "" OR $message == "") { 
    $error_message = "You must enter a name, email address and message"; 
} 

в

if ($name == "" OR $email == "" OR $message == "") { 
    $error = 1; //to use in your redirect url 
} 

Путь на вершине вас странице вам нужно будет проверить, если $_GET['error], как было установлено (использовать после редиректа) и установить соответствующее сообщение:

if ($_GET['error']) { 
    switch ($_GET['error']) { 
     case 1: 
      $error_message = "You must enter a name, email address and message"; 
      break; 
     case 2: 
      $error_message = "Other error"; 
      break; 
    } 
} else if ($_POST) { 
    //form post handling 
} 
+0

Я очень благодарен за ответ, спасибо, но это немного запутанно для новичка, подобного мне. Я мог бы повторно посетить это позже, чтобы понять это и, возможно, применить его. – number8pie

Смежные вопросы