Передача формы php подтвердите сообщение об ошибке назад, чтобы отправить форму

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

function saveComment(){
    $validate = array();
    $id = isset($_POST["articleId"]) ? $_POST["articleId"] : '';

    if ( isset( $_POST['saveChanges'] ) ) {

    if ( $_POST['name'] == "" ){
         $validate['errorMessage'] = "Please fill out your name.";
      header( "Location:".HOME_PATH."/.?action=viewArticle&articleId=".$_POST['articleID']."");
    }

Я пытаюсь передать это назад

if ( isset( $validate['errorMessage'] ) ) {
    echo $validate['errorMessage'];
} 

When I remove the if on the display function I get the error unidentified index

Что мне нужно сделать, чтобы получить форму для отображения сообщения об ошибке. Мне нужно передать массив функции, которая обрабатывает отображение статьи?

<Сильный> ОБРАТНОЙ

Для тех, кто может найти это полезным, я использовал метод @OliverBS post практически без изменений.

Также благодарю вас @ lethal-guitar, поскольку он объяснил мне, почему я поступил не так, и различные методы, которые могут быть использованы для решения этой проблемы. +1

0
Эй, если это работает, просто убедитесь, что вы пишете, как вы его заработали, чтобы кто-то еще мог использовать этот вопрос, и вы не забудете в будущем.
добавлено автор Oliver Bayes-Shelton, источник
@BogdanBurim, если вы собираетесь беспокоиться о комментировании, сделайте что-то полезное не совершенно бессмысленным утверждением
добавлено автор user1711576, источник

5 ответы

Вы устанавливаете переменную $ validate для исполняемого вами скрипта. После этого вы отправляете заголовок перенаправления. Это приведет к тому, что ваш браузер выдает новый запрос, тем самым заканчивая текущий исполняемый скрипт и заменяя переменную. Новый запрос вызовет другой вызов сценария, где переменная неизвестна больше, поскольку она существовала только на время первого запроса.

HTTP не имеет статуса, поэтому каждая переменная, установленная на стороне сервера, будет существовать только до тех пор, пока вы не закончите свой текущий запрос и не ответите клиенту. Вам нужен способ передать эту переменную скрипту, обрабатывающему второй запрос. Существует несколько способов сделать это:

  • Pass a GET parameter. You could append something like "&validationError=" . $validate['errorMessage'] to the URL you're passing to the Location header, and then in the display page access it via $_GET.
  • Save the validation status in the $_SESSION. The PHP manual contains a lot of information about sessions (maybe you're already using them?)
  • Restructure your code in a way that you don't redirect on error, but on success.

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

3
добавлено
Хорошая точка с передачей номера ошибки, которая может помочь с сокращением длины параметра запроса.
добавлено автор Oliver Bayes-Shelton, источник
Спасибо за помощь. Я на самом деле понимаю проблему сейчас и khow справиться с ней для будущей справки
добавлено автор user1711576, источник

С быстрым взглядом попробуйте это

Сессионный путь

Обязательно запустите сеанс, выполнив session_start (); в верхней части файла, где сохраняется saveComment, и проверяется значение isset.

function saveComment(){

    $id = isset($_POST["articleId"]) ? $_POST["articleId"] : '';

    if ( isset( $_POST['saveChanges'] ) ) {

    if ( $_POST['name'] == "" ){
         $_SESSION['errorMessage'] = "Please fill out your name.";
         header( "Location:".HOME_PATH."/.?action=viewArticle&articleId=".$_POST['articleID']."");
    }

if ( isset( $_SESSION['errorMessage'] ) ) {
    echo $_SESSION['errorMessage'];
}

или вы можете попробовать

POST путь

function saveComment(){

        $id = isset($_POST["articleId"]) ? $_POST["articleId"] : '';

        if ( isset( $_POST['saveChanges'] ) ) {

        if ( $_POST['name'] == "" ){
             $error = urlencode('Please fill out your name');
             header( "Location:".HOME_PATH."/.?action=viewArticle&articleId=".$_POST['articleID']. "&error=" . $error);
        }

    if ( isset( $_GET['error'] ) ) {
        echo urldecode($_GET['error']);
    }

Я не тестировал это, но вы должны получить основную идею о том, что делать.

1
добавлено

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

1
добавлено
Или реструктурируйте код для перенаправления на успех, а не на ошибку.
добавлено автор lethal-guitar, источник

Я бы предложил сделать все это в одном файле, т. Е. В форме и в качестве одного файла.

Тогда вы можете сделать это:

<?php
    //set success to 0
    $success = 0;
    $errormsgs = array();

    //check for post
    if(isset($_POST['submit'])){

        //get the data from the form post and validate it
        $valid = validateFuntion($_POST['data'])
            //the is function will validate the data. If it is not valid, it will add a message to $errormsgs

        //check for errors
        if(!$errormsgs){
            //data validation was successful, do stuff

        }
    }//if validation fails, it will fall out of the this code block and move on
?>


<html>
<body>
<?php
//check for errors
if($errormsgs){
    $content .= '
    '; foreach($errormsgs as $error){ $content .= "
  • " . $error . "
  • "; } $content .= "
"; echo $content; } ?> <form name="name" action="" method="post"> <input name="name" value="<?= (isset($_POST['data']) ? $_POST['data'] : '') ?>" type="text"> </form> </body> </html>
1
добавлено

Вы перенаправляете пользователя на страницу «ошибка» с помощью инструкции header . Проблема, конечно же, в том, что это совершенно новая страница, не осталось никакого состояния, поэтому ни одна из ваших переменных не существует.

There's two ways to do it, either pass it on the query string (so add &error=...) and parse that in your template, or save it to the session.

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

0
добавлено
phpGeeks
phpGeeks
3 620 участник(ов)

Best PHP chat Еще: @dbGeeks - базы данных @phpGeeksJunior - новичкам @moscowProgers - IT Москва @ebanoePhp - весёлый канал о PHP @laravel_pro - Laravel @jobGeeks - вакансии @jsChat - JS Правила: https://t.me/phpGeeks/764859 ДР - 28.03.2016

PHP
PHP
1 309 участник(ов)

Группа про современный PHP. Обсуждаем ООП, TDD, BDD, DDD, SOLID, GRASP и прочие крутые базворды Для ознакомления: https://gist.github.com/mkusher/711bd46f0b62fbae851182e6fb3b1839 Группа PHP для новичков @phpGeeksJunior Вакансии: https://t.me/fordev

PHP — вакансии, поиск работы и аналитика
PHP — вакансии, поиск работы и аналитика
1 251 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению PHP, Laravel, Symfony, Yii и т.д. Здесь всё: full-time, part-time, remote и разовые подработки. См. также: @qa_jobs, @devops_jobs, @javascript_jobs, @nodejs_jobs, @uiux_jobs, @products_jobs

phpGeeksJunior
phpGeeksJunior
980 участник(ов)

Группа для новичков. Не стесняйтесь задавать вопросы по php. Не флудить!!!! Правила и полезные ссылки https://gist.github.com/exileed/a53dd0617b35a705ff44b38c8028e6a5 Бест от пхпгикс https://t.me/best_of_phpgeeks

phpclub.ru
phpclub.ru
872 участник(ов)

Официальный чат phpclub.ru - остерегайтесь подделок #rules Правила группы - уважайте друг друга. Скриншоты -> ссылками. Код -> pastebin.com. Вакансии строго -> https://goo.gl/4bNxym, в чат ссылку. За рекламу и мат - БАН!

Devall | PHP
Devall | PHP
272 участник(ов)

Пристанище для восходящих звёзд разработки, которые перейдут на более адекватные языки. http://combot.org/chat/-1001014863761 Инвайт: j.mp/devallphp