Алгоритм обработки PHP форм

В качестве частичного объяснения, мой образ мыслей строго процедурный, поскольку я программировал таким образом с 60-х годов.

Я работаю в PHP и пытаюсь разобраться в обработке форм, начиная с интерактивной формы ошибки 404. В минимальном псевдокоде я хочу:

do {

    OK = true;

    display_form;
        ask for optional name
        ask for optional email address
        ask for optional comments
    on – submit{
        sanitise input 
        validate input (which could be no input since all is optional)
        if one or more inputs invalid  set OK = false
    }
} while (OK == false)

собрать электронное письмо для веб-мастера, используя суперглобальные переменные $ _SERVER, а также ввод отправить с помощью функции почты Кто-то «услужливо» добавил фигурные скобки через некоторое время И в конце - они на самом деле не принадлежат им - идея заключалась в том, что я хотел, чтобы выполнение «переходило» к этим двум операторам Только после завершения DO - WHILE

Сборка почты могла быть в отдельном файле или нет

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

Мне кажется, что весь мой концептуальный алгоритм неверен, и пока я не разберусь, я никуда. Я бьюсь об этом пару дней - Google указал здесь на несколько полуактуальных ответов, поэтому я попробую. Примеры W3C ясно показывают, что код ответа работает, даже если есть проблемы с вводом, а это не то, что мне нужно.

Не могли бы вы показать нам код, с которым вы работаете, может быть, тогда кто-нибудь сможет вам помочь.

kellymandem 31.10.2018 05:53

Привет, добро пожаловать на переполнение стека. Пожалуйста, перейдите по ссылке Как спросить, чтобы узнать больше о том, как задать вопрос, и обновите свой вопрос соответствующим образом.

Jeroen Heier 31.10.2018 05:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
93
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Главный переход, который вам здесь нужно сделать, это, вероятно, переход на модель исполнения запрос-ответ. Вы не можете сделать буквальный do..while, так как вам нужно будет отправить ответ клиенту. Следующая итерация будет инициирована новым запросом к PHP, который начинается снова с самого начала и не запоминает никакого предыдущего состояния.

Итак, в псевдокоде это работает так:

if is POST request:
  validate input, populate error variables

  if input is valid:
    send email with data
    redirect to different page or display "thanks"

form start
for $field in fields:
  output HTML for $field
    maybe highlight if error
    maybe set value to POSTed value to retain data
form end

Таким образом, при первом посещении страницы это не будет запрос POST, а сразу перейдет к части формы. Не будет никаких ошибок или существующих данных, поэтому будет выведена простая форма. Когда форма отправлена, тот же код запускается снова и теперь входит в ветку if is POST. Если какие-либо значения недопустимы, они снова попадут в форму, которая теперь также может выводить любые сообщения об ошибках и существующие отправленные значения. Только когда все значения допустимы, сервер отправит электронное письмо и выйдет из этого «цикла», перенаправив его на другую страницу или, возможно, просто выведя сообщение «Спасибо».

Если вы правильно разделите это на архитектуру MVC, у вас будут следующие компоненты:

  • Model
    • проверка данных
    • отправка электронной почты
  • View
    • выводит форму HTML
  • RR_13_RРонтроллер

    • один для обработки запросов GET, просто вызывая представление
    • один для обработки запросов POST, по сути, выполняя:

      errors = model.validate(data)
      if no errors:
        model.send_email(data)
        redirect()
      else:
        view.display_form(data, errors)
      
    • некоторая форма маршрутизатора, вызывающего правильный контроллер на основе URL-адреса запроса и метода

Все это могут быть отдельные функции, классы, методы или просто файлы.

На самом деле проблема заключалась в визуализации. На самом деле мне нужно было лучше карта того, что происходит. Основная реализация заключается в том, что код PHP вызывается более одного раза с начала файла php Один раз, когда форма снова отображается снова при поступлении данных POST (что может произойти более одного раза, если в первый раз возникает одна или несколько ошибок) Во время этого обхода кода второй происходит проверка и решение либо отобразить ошибку, либо «сделать что-то другое». Большая часть документации предполагает, что люди видят многопроходный

DEG 31.10.2018 07:19
Лилу Даллас, Multipass.
deceze 31.10.2018 07:31

Ниже приведен окончательный код страницы. Это основная страница с ошибкой 404, которая может быть кому-то полезна. И он должен отвечать на запросы, которые я предоставляю код, с которым я работал.

Он включает три файла, которые я не предоставил:

top.php и footer.php и functions.php

top создает операторы заголовка HTML, включая метакоды, а также баннеры и меню верхнего уровня, а также устанавливает базовый формат страницы.

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

functions.php предоставляет множество повторно используемых функций. В этом коде используется пара небольших (довольно очевидных) функций:

spacer выводит код для создания пустой ячейки в таблице.

spanCol создает в таблице ячейку, охватывающую столбец, с указанным текстом и указанный тег открыть и закрыть

Полная страница находится по адресу http://www.vfmc.org.au/notfound.php - пожалуйста, не присылайте мне слишком много нежелательной почты.

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

<?php
$pageTitle = "File Not Found";
$authorName = "Don Gingrich";
$styleSheet = "./css/mainstyle.css";
include_once 'top.php';

require_once "functions.php";
$indicesServer = array(
    'PHP_SELF',
    'HTTP_REFERER',
    'SCRIPT_FILENAME',
    'SCRIPT_NAME',
    'REQUEST_URI',
    'ORIG_PATH_INFO'
);


if (isset($_SERVER['HTTP_REFERER'])) {
    $refering = $_SERVER['HTTP_REFERER'];
} else {
    $refering = NULL;
}
$requested = $_SERVER['REQUEST_URI'];
// $refering = $_SERVER['HTTP_REFERER'];
if ($refering == NULL || $refering == " ") {
    $refering = "referrer field was blank\n - may be due to mis-typing address\n";
}

/* basic "sanitise input" function */
function test_input($data)
{
    $data = trim($data);
    $data = stripslashes($data);
    $data = htmlspecialchars($data);
    return $data;
}

function send_webmaster_email($name, $email, $comment, $requested, $refering)
{
    global $sent;
    $subject = "File not Found: $requested";
    $txt = "Trying to access  $requested from $refering\n" . "Visitor comments follow:\n" . $comment;
    if ($name != "") {
        $txt .= "\n\tReporting person's name is: $name\n";
    }
    if ($email != "") {
        $txt .= "\n\tReporting person's email is: $email\n";
    }
    $to = "[email protected]";
    $additional_headers = "From: [email protected]\r\n";
    mail($to, $subject, $txt, $additional_headers);
    $sent = true;
}

// define variables and set to empty values
$nameErr = $emailErr = "";
$name = $email = $comment = "";
$myError = false;
global $sent;
$sent = false;

/********************************************************
 * Processing code follows -- Only executed after POST
 *
 *******************************************************/

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $requested = $_POST['requested'];
    $refering = $_POST['refering'];
    $requested = test_input($requested);
    $refering = test_input($refering);
    $myError = false;
    if ($_POST["button"] == "Submit") {
        if (empty($_POST["name"])) {
            $name = "";
        } else {
            $name = test_input($_POST["name"]);
            // check if name only contains letters and whitespace
            if (!preg_match("/^[a-zA-Z -]*$/", $name)) {
                $myError = true;
                $nameErr = "Only letters, hyphen, and white space allowed";
            } 
        }

        if (empty($_POST["email"])) {
            $email = "";
        } else {
            $email = test_input($_POST["email"]);
            // check if e-mail address is well-formed
            if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
                $myError = true;
                $emailErr = "Invalid email format";
            } 
        }

        if (empty($_POST["comments"])) {
            $comment = "";
        } else {
            $comment = test_input($_POST["comments"]);
        }

        if ($myError == false) {
            send_webmaster_email($name, $email, $comment, $requested, $refering);
        } 
    }
}

echo "\n";
echo "<h2>File Not Found</h2>\n";
echo "<br>\n";
echo "<br>\n";
if ($sent == true ){
    echo "<h5>Email sent to Webmaster, Thank you</h5>\n";
    echo "<br>Use the menu to the left or the back button<br>\n";
    echo "to return to the VFMC site<br>\n";
} else {

    echo "   Unfortunately the file that you have asked for is unavailable.\n";
    echo "<br>\n";
    echo "<br>\n";
    echo "This may mean that the Webmaster has forgotten to load it or the link to it is broken in some way.<br>\n";
    echo "Or, if you typed a page in the browser address bar, you may have mis-typed, remember that everything<br>\n";
    echo "after the <b>www.vfmc.org.au/</b> is CaSeSensitive -- FiresideFiddlers, is spelled as written.<br>\n";
    echo "      <br>\n";
    echo "      <br>\n";
    echo "<h6>Please tell the webmaster by sending a message:</h6>\n";
    echo "      <br>\n";
    echo "      <br>\n";
    $myFile = htmlspecialchars($_SERVER['PHP_SELF']);
    echo "      <form action= \"$myFile\" method=\"post\">\n";
    echo "<input type=\"hidden\" name=\"refering\" value=\"$refering\" />\n";
    echo "<input type=\"hidden\" name=\"requested\" value=\"$requested\" />\n";    
    echo "      <table border=\"0\" cellpadding=\"8\" cellspacing=\"8\">\n";
    echo "      <colgroup>\n";
    echo "         <col width = auto>\n";
    echo "         <col width = auto>\n";
    echo "         <col width = auto>\n";
    echo "      </colgroup>\n";
    echo " <tr>\n";
    spanCol("3", "Your name and email address are optional,<br> but the  webmaster will be unable to respond <br>directly without them", "h5");
    echo "      <tr>\n";
    echo "         <td><label for=\"tswname\">Name</label>:</td>\n";
    echo "         <td><input type=\"text\" name=\"name\" id=\"tswname\" size=\"25\" /></td>\n";
    echo "         <td>\t";
    if ($nameErr == "") {
        echo "(Optional)\n";
    } else {
        echo "<span class=\"error\">*" . $nameErr . "</span>\n";
    }
    echo "</td></tr>\n";
    echo "      <tr>\n";
    echo "        <td>\n";
    echo "           <label for=\"tswemail\">Email address</label>:</td>\n";
    echo "        <td>\n";
    echo "           <input type=\"text\" id=\"tswemail\" name=\"email\" size=\"25\" />\n";
    echo "        </td>\n";
    echo "        <td>\n";
    if ($emailErr == "") {
        echo "(Optional)\n";
    } else {
        echo "<span class=\"error\">*" . $emailErr . "</span>\n";
    }
    echo "</td></tr>\n";
    echo "      <tr>\n";
    echo "      <td>\n";
    echo "      <label for=\"tswcomments\">Comments</label></td>\n";
    echo "      <td colspan=\"2\">\n";
    echo "      <textarea rows=\"15\" cols=\"45\" name=\"comments\" id=\"tswcomments\"></textarea>\n";
    echo "      </td>\n";
    echo "      </tr>\n";
    echo "      <tr>\n";
    echo "      <td align=\"center\" colspan=\"2\">\n";
    echo "      <input type=\"submit\" name=\"button\" value=\"Submit\" /><br>\n";
    echo "      </td>\n";
    echo "      </tr>\n";
    echo "      </table>\n";
    echo "      </form>\n";

}

echo "      <br>\n";
echo "      <br>\n";
echo "      <br>\n";
echo "      <br>\n";
echo "</td>\n";
echo "</tr>\n";

                $filename = $_SERVER['SCRIPT_NAME'];
                require_once "footer-code.php";             
?>

</tbody>
</table> <!--PWK-EDIT END FOOTER-->
</body>
</html>

Пожалуйста, избавьтесь от этой функции test_input. Это ужасный мем, распространяющийся среди новичков в PHP. Он ничего не «проверяет», а только делает бесполезные вещи. Прочтите Великий эскапизм (или: что нужно знать для работы с текстом внутри текста).

deceze 01.11.2018 02:33

Другие вопросы по теме