BG Development


Страници: (4) [1] 2 3 ... последна »  ( Първото ново мнение ) Reply to this topicStart new topicStart Poll

> Да направим контактна форма за сайт по стандартите, Семпла и работеща форма на HTML5 и PHP
Бай Аз
Публикувано на: 02-02-2024, 14:03
Quote Post



Име:
Група: Потребител
Ранг: Активен

Мнения: 275
Регистриран на: 04.02.21



Здравейте!

Искам да направя проста и семпла работеща контактна форма за сайт, която да съответства на стандартите!

Но да е оптимална: нито прекалено сложна, с излишни неща, нито пък да липсва нещо, което е необходимо!

Ще сложа за начало една, която работи и съм я ползвал, за да я преработим нея:
(Няма да пиша подробни CSS стилове, само базови, и главно HTML и PHP код)

Ето кода на първоначалната ми страница contacts.html

CODE
<!DOCTYPE html>
<html lang="bg">
       <head>
            <title>Страница за контакти</title>
            <meta charset="utf-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <style>
                  * {
                        margin: 0;
                        padding: 0;
                        box-sizing: border-box;
                  }
                  #container {
                        display: flex;
                        width: 90%;
                        min-height: 500px;
                        margin: 0 auto;
                        align-items: center;
                        justify-content: center;
                  }
                  form {
                        background-color: #ffefbf;
                        border: 1px solid  #a8a8b7;
                        display: flex;
                        flex-direction: column;
                        height: 400px;
                        width: 300px;
                        padding: 3%;                                    
                  }
            </style>
      </head>
  <body>
            <div id="container">
                  <form id="contacts" action="sendmail.php" method="POST">
                        <label for="name">Име:</label>
                        <input type="text" id="name" name="name" required><br>      
                        <label for="subject">Тема:</label>
                        <input type="text" id="subject" name="subject" required><br>      
                        <label for="email">E-mail:</label>
                        <input type="email" id="email" name="email" required><br>            
                        <label for="message">Съобщение:</label>
                        <textarea id="textarea-message" name="message" rows="8" required></textarea><br>
                        <input type="submit" id="input-submit" value="Изпрати">
                  </form>
            </div>      
      </body>
</html>


Ето и кода ми в php файла sendmail.php:
CODE

<?php
      $name = $_POST["name"];
      $email = $_POST["email"];
      $subject = $_POST["subject"];
      $message = "Име: ".$_POST["name"]."\r\n";
      $message = wordwrap($message, 70);
      $message .= "E-mail: ".$_POST["email"]."\r\n";
      $message .= "Съобщение: ".$_POST["message"]."\r\n";
      $headers .= "Content-Type: text/plain; charset=utf-8";
      mail("mymail@mysite.com", $subject, $message, $headers);
?>
<html>
      <head>
            <meta charset="utf-8">
            <title>Успешно изпратено съобщение</title>
            <style>
                  h2 {
                        color: #00698c;
                        font-family: Arial, sans-serif;
                        font-size: 2em;
                        font-weight: bold;
                        text-align: center;
                  }
            </style>
      </head>
      <body>
            <br><br><h2>Вашето съобщение бе изпратено успешно!</h2><br><br>
            <h2>За да се върнете обратно - натиснете <a style="color: #59b300;" href="contacts.html"> тук</a>!</h2>
      </body>
</html>


Идеята ми е да бъде без JavaScript и затова съм я направил потребителят да се върне по този начин на предишната страница.

Ще очаквам предложения за промени!


Това мнение е било редактирано от Бай Аз на 02-02-2024, 14:06
PMEmail Poster
Top
Бай Аз
Публикувано на: 02-02-2024, 15:48
Quote Post



Име:
Група: Потребител
Ранг: Активен

Мнения: 275
Регистриран на: 04.02.21




Основно имам предвид какви подобрения могат да се направят в php кода на файла sendmail.php?

Този код:
CODE
<?php
     $name = $_POST["name"];
     $email = $_POST["email"];
     $subject = $_POST["subject"];
     $message = "Име: ".$_POST["name"]."\r\n";
     $message = wordwrap($message, 70);
     $message .= "E-mail: ".$_POST["email"]."\r\n";
     $message .= "Съобщение: ".$_POST["message"]."\r\n";
     $headers .= "Content-Type: text/plain; charset=utf-8";
     mail("mymail@mysite.com", $subject, $message, $headers);
?>


Това мнение е било редактирано от Бай Аз на 02-02-2024, 15:48
PMEmail Poster
Top
thrawn
Публикувано на: 02-02-2024, 17:42
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 3616
Регистриран на: 17.01.17



При POST заявки, обикновено се ползва PRG патерн (post/redirect/get) за да се избегне повторно изпращане на същите данни при рефреш.

Щом ти харесва с две страници правиш страницата с формата -> POST заявка към сървърът които връща 302 (да речем), което кара клиентът да пусне GET заявка към страницата със статусът (нова страница с това което връщаш в момента след изпращане на съобщението).

Трябва да предвидиш и защита от флуд или направо да му изтряскаш една капча с която да отрежеш ботовете (това е редно да го има и при коментарите).

Освен това, не проверяваш дали функцията mail е извикана успешно.

Това мнение е било редактирано от thrawn на 02-02-2024, 17:43
PMEmail Poster
Top
ici
Публикувано на: 02-02-2024, 19:09
Quote Post


Group Icon
Име: Ивайло Илчев
Група: VIP
Ранг: Почетен член

Мнения: 18502
Регистриран на: 06.06.04





--------------------
Ние не сме в една лодка, ние сме в една буря. Лодките са различни.

Следващият път когато се почувстваш ненужен, грозен и недооценен, помни че освен това си и тъп.
PMEmail PosterUsers Website
Top
Бай Аз
Публикувано на: 05-02-2024, 08:40
Quote Post



Име:
Група: Потребител
Ранг: Активен

Мнения: 275
Регистриран на: 04.02.21



ici,

Измисленият бот, няма как да ми отговори на този въпрос - пробвах го, той ми дава стандартно решение, което дори не е решение и е по-зле от моето.

Нямаш представа, като го сглобявах моя код - колко уж стандартни решения - не работят добре и правилно! Примерно - не ти показват получателя, писмото идва на шльокавица, писмото не се разделя на отделни редове и т.н.т.

Така, че идеята ми тук е хора, които имат контактни форми на сайтовете си, да кажат какво може да се добави в моя код?

Иначе, аз съм си изтеглил около 20-тина примерни контактни форми, и сега ще анализирам, за да видя кое да променя в моя код.
PMEmail Poster
Top
Бай Аз
Публикувано на: 07-02-2024, 09:18
Quote Post



Име:
Група: Потребител
Ранг: Активен

Мнения: 275
Регистриран на: 04.02.21




ОК , остана ми малко време и за този въпрос.

Сега, разбрах, че трябва целия този код да бъде с условие за проверка, и накрая също трябва да има такова условие за проверка - дали съобщението е изпратено успешно?

Значи, кодът трябва да бъде примерно такъв:
CODE
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
   $name = $_POST["name"];
   $email = $_POST["email"];
   $subject = $_POST["subject"];
   $message = $_POST["message"]; // ТОЗИ РЕД ТРЯБВА ЛИ ДА ГО ИМА?

    $message = "Име: ".$_POST["name"]."\r\n";
    $message = wordwrap($message, 70, "\r\n");
    $message .= "E-mail: ".$_POST["email"]."\r\n";
    $message .= "Съобщение: ".$_POST["message"]."\r\n";

    $headers .= "Content-Type: text/plain; charset=utf-8";
   
   // Изпращаме имейла
   $success = mail("mymail@mysite.com", $subject, $message, $headers);

   if ($success) {
       echo "Вашето съобщение е изпратено успешно!";
   } else {
       echo "Грешка при изпращане на съобщението! Моля, опитайте отново!";
   }
}
?>

Да питам следното по този код:
CODE
$message = $_POST["message"]; // ТОЗИ РЕД ТРЯБВА ЛИ ДА ГО ИМА?

Има и варианти, при които в $message има по-малко неща, примерно само
CODE
$message = wordwrap($message, 70, "\r\n");

А повечето данни са в хедърите:
CODE
$headers = "From: $email\r\n"; // От кой е имейла
   $headers .= "Reply-To: $email\r\n"; // За отговор
   $headers .= "Content-Type: text/plain; charset=UTF-8\r\n"; // Кодиране на съобщението

Аз в началото го бях направил така, но не ми изписваше нищо в самото съобщение и по съвет на php програмист изместих тези данни:
CODE
$message = "Име: ".$_POST["name"]."\r\n";
    $message .= "E-mail: ".$_POST["email"]."\r\n";
    $message .= "Съобщение: ".$_POST["message"]."\r\n";

в съобщението.

Но кажете и вие, според вас как е по-правилно?

-----------------------------------------------------------------------------

Въпроси към thrawn

QUOTE
При POST заявки, обикновено се ползва PRG патерн (post/redirect/get) за да се избегне повторно изпращане на същите данни при рефреш.

Щом ти харесва с две страници правиш страницата с формата -> POST заявка към сървърът които връща 302 (да речем), което кара клиентът да пусне GET заявка към страницата със статусът (нова страница с това което връщаш в момента след изпращане на съобщението).

thrawn,
с какъв код точно се прави това?

QUOTE
Трябва да предвидиш и защита от флуд или направо да му изтряскаш една капча с която да отрежеш ботовете (това е редно да го има и при коментарите).

Капча не ми се слага, но такава защита от флуд(да има ограничение по време за изпращане на следващ коментар) ще е добре да се направи, а също и за системата за коментарите!

И как точно се прави тази защита от флуд?

Това мнение е било редактирано от Бай Аз на 07-02-2024, 09:24
PMEmail Poster
Top
thrawn
Публикувано на: 07-02-2024, 09:42
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 3616
Регистриран на: 17.01.17



PRG просто значи, че кодът които обработва POST заявките не връща директно html а праща http отговор с код 3ХХ. Което кара барузерът да направи GET заявка за ресурсът описан в location хедърът.

Относно защитите - темата е разтеглива. Сесия + timestamp ще даде добри резултати за UX-a но това не е реална защита, затова се почват магарии със следене на ip адреси и т.н. Но като цяло, всичко може да се заобиколи, ако някой е решил да го направи. Затова, вместо да се опитваш сам да откриваш топлата вода е удачно да ползваш "стандартни" услуги за това. Капча се поставя лесно и новите (версия 3 на гугъл да речем) дори не искат взаимодействие с потребителя. Та за няколко реда код получаваш едно много добро ниво на защита.
PMEmail Poster
Top
Бай Аз
Публикувано на: 07-02-2024, 09:52
Quote Post



Име:
Група: Потребител
Ранг: Активен

Мнения: 275
Регистриран на: 04.02.21



QUOTE (Бай Аз @ 07-02-2024, 09:18)

Да питам следното по този код:
CODE
$message = $_POST["message"]; // ТОЗИ РЕД ТРЯБВА ЛИ ДА ГО ИМА?

Има и варианти, при които в  $message има по-малко неща, примерно само
CODE
$message = wordwrap($message, 70, "\r\n");

А повечето данни са в хедърите:
   
CODE
$headers = "From: $email\r\n"; // От кой е имейла
   $headers .= "Reply-To: $email\r\n"; // За отговор
   $headers .= "Content-Type: text/plain; charset=UTF-8\r\n"; // Кодиране на съобщението

Аз в началото го бях направил така, но не ми изписваше нищо в самото съобщение и по съвет на php програмист изместих тези данни:
    
CODE
$message = "Име: ".$_POST["name"]."\r\n";
    $message .= "E-mail: ".$_POST["email"]."\r\n";
    $message .= "Съобщение: ".$_POST["message"]."\r\n";

в съобщението.

Но кажете и вие, според вас как е по-правилно?

thrawn,

А по тези въпроси какво ти е мнението?

Това мнение е било редактирано от Бай Аз на 07-02-2024, 09:52
PMEmail Poster
Top
thrawn
Публикувано на: 07-02-2024, 10:02
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 3616
Регистриран на: 17.01.17



Дали ще използваш локална променлива или не е все тая. С IDE е много по-удобно да се работи с променливи отколкото с асоциативни масиви, защото то може да следи за грешки които се допускат лесно а се виждат трудно (например $_POST["msesage"]);

Имай в предвид, че ако ползваш данни подадени от клиент за изграждане на хедър то те трябва задължително да минават през филтриране. Затова там ограничи до минимум нещата които пипаш.

Останалото е все тая как го правиш (докато използваш text/plain)

Това мнение е било редактирано от thrawn на 07-02-2024, 10:09
PMEmail Poster
Top
Бай Аз
Публикувано на: 07-02-2024, 11:39
Quote Post



Име:
Група: Потребител
Ранг: Активен

Мнения: 275
Регистриран на: 04.02.21



QUOTE (thrawn @ 07-02-2024, 10:02)

Останалото е все тая как го правиш (докато използваш text/plain)

Аз в началото го бях написал така:
CODE
$headers .= "Content-Type: text/html; charset=utf-8";

Но правеше друг проблем(както този, който имах в системата за коментарите) - всичко се поместваше на един ред.

И ми обясниха, че за да работят "\r\n"
трябва да се ползва "Content-Type: text/plain"

И затова го направих с text/plain и така работи правилно!

Казаха ми още, че за да бъде кодът ми изцяло коректен трябва:
1. Когато имам Content-Type, трябва да има и MIME-Version: 1.0.
2. Когато имам utf-8, трябва да има и Content-Transfer-Encoding: 8bit и поддържащ това "транспорт", или трябва да се използва кодиране (base64, etc.)

Но не ми обясниха как точно трябва да направя това - с конкретен код!

Това мнение е било редактирано от Бай Аз на 07-02-2024, 11:44
PMEmail Poster
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Страници: (4) [1] 2 3 ... последна » Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0