PHP проверить на той же странице, а затем обработать через другой PHP - PullRequest
0 голосов
/ 02 июня 2018

Я очень новичок в PHP и мне удалось немного научиться самостоятельно, но я зацикливаюсь на этом.У меня есть форма, которая будет проверять себя и показывать ошибки на той же странице.После того, как информация заполнена и проверена, мне нужно обработать ее с помощью отдельного сценария PHP, который отправит мне электронное письмо, опубликует информацию в CSV-файле и отобразит страницу подтверждения.В настоящее время у меня есть обе эти работы, но не вместе.Другими словами, моя форма будет подтверждена для себя, но информация никуда не денется.Это явно бесполезно.Отдельно я могу заставить форму выполнять все остальные функции, установив действие для моего PHP-скрипта, но не имеет значения, заполнены ли поля или нет, он отправляет что-либо.Я перепробовал все, начиная от сессий, функций, включения, и я даже не могу вспомнить, что еще заставило это работатьЯ даже пытался установить свои ошибки в массив, а затем вызвать функцию TRUE / FALSE для результатов, чтобы заставить ее проверить и затем перенаправить.У меня были результаты проверки на той же странице, но я все равно отправлял всю информацию, ничего не делая, кроме появления на пустой странице.

Пожалуйста, не отвечайте, что это повторение.Это проблема, над которой я работаю и исследую по крайней мере неделю.Я прочитал много тем на этом и других сайтах и ​​не нашел рабочего ответа.
Я не хочу проверять на стороне клиента, а затем отправлять через PHP.Мне также необходимо проверить ту же страницу и убедиться, что все ранее введенные ответы a сохранены (что в настоящее время используется в моей форме), поскольку существует много полей, которые необходимо заполнить.

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

Это часть проверки:

    if ($_SERVER["REQUEST_METHOD"] == "POST") {
  if (empty($_POST["childsfirstname"])) {
    $childsfirstnameErr = "Child's first name is required.";
  } else {
    $childsfirstname = test_input($_POST["childsfirstname"]);
    // check if name only contains letters and whitespace
    if (!preg_match("/^[a-zA-Z ]*$/",$childsfirstname)) {
      $childsfirstnameErr = "Only letters and white space allowed";
      die;  
    }
  }

  if (empty($_POST["childslastname"])) {
    $childslastnameErr = "Child's last name is required.";
  } else {
    $childslastname = test_input($_POST["childslastname"]);
    // check if name only contains letters and whitespace
    if (!preg_match("/^[a-zA-Z ]*$/",$childslastname)) {
      $childslastnameErr = "Only letters and white space allowed";
      die;  
    }
  }

   if (empty($_POST["month"])) {
    $monthErr = "Child's birthday is required.";
  } else {
    $month = test_input($_POST["month"]);
    // check if name only contains letters and whitespace
    if (!preg_match("/^[0-9]*$/",$month)) {
      $monthErr = "Only numbers allowed";
      die; 
    }
  }
function test_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}

Этоявляется частью формы:

<div id="Field" style="left: 0px; top: 0px"><strong>Youth's:</strong> 
        First Name: 
            <input type="text" name="childsfirstname" style="width: 220px" value="<?php echo $childsfirstname;?>"/>
            &nbsp;&nbsp;&nbsp; 
        Last Name: 
            <input type="text" name="childslastname" style="width: 300px" value="<?php echo $childslastname;?>"/>
    </div>
    <div id="parent" class="error"> 
        <div id="error1a" style="right: 561px"> <?php echo $childsfirstnameErr;?></div>
        <div id="error1b"> <?php echo $childslastnameErr;?></div> 
    </div>

Хотя я понимаю, что здесь нет кода, показывающего, что я пытаюсь перенаправить для отправки информации, пожалуйста, поверьте, что я сделал более несколькихпопытки и что все, что я ищу, - это лучший способ сделать это, и некоторые ФАКТИЧЕСКИЕ рекомендации о том, как это сделать.Пока это работает, для меня не имеет значения, включены ли они или требуются, сеансы или иным образом, если это PHP и Validates для себя, а затем отправка другому сценарию PHP после завершения проверки и безошибочной формы.

Любая помощь очень ценится, особенно когда я делаю это на добровольной основе.Заранее благодарю всех и каждого, кто может протянуть руку помощи.

Это начало и конец моего PHP-скрипта - я оставлю середину, поскольку существует 16 по существу идентично работающих письменных проверок ввсе.
if ($ _SERVER ["REQUEST_METHOD"] == "POST") {

if (empty($_POST["childsfirstname"])) {
  $Err[1] = "Child's first name is required.";
 }else {
  $childsfirstname = test_input($_POST["childsfirstname"]);
    if (!preg_match("/^[a-zA-Z ]*$/",$childsfirstname)) {
    $Err[1] = "Only letters and white space allowed";
  }
}

  if (empty($_POST["childslastname"])) {
  $Err[2] = "Child's last name is required.";
  } else {
  $childslastname = test_input($_POST["childslastname"]);
    if (!preg_match("/^[a-zA-Z ]*$/",$childslastname)) {
    $Err[2] = "Only letters and white space allowed";
  }
}

.,.

if (empty($_POST["date"])) {
$Err[15] = "Date required.";
}else {
$date = test_input($_POST["date"]);
// check if name only contains letters and whitespace
if (!preg_match("/^[0-9]*$/",$date)) {
  $Err[15] = "Letters are not allowed"; 
 }
}

if (empty($_POST["checkbox"])) {
$Err[16] = "VALIDATION REQUIRED";
}else {
$checkbox = test_input($_POST["checkbox"]);
 }
}  

function test_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}


?>

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

Ответы [ 5 ]

0 голосов
/ 11 июня 2018

Спасибо всем, кто пытался помочь!Некоторая информация помогла мне найти решение.Я был в состоянии использовать информацию от @dcromley и @Joseph_J.Я установил все свои ошибки в виде массива, а затем использовал настройку true / false, предложенную @ dcromley.

     `$Error = "false";
      if ($_SERVER["REQUEST_METHOD"] == "POST") {
      $Error = "true";
      if (empty($_POST["childsfirstname"])) {
    $Error = "false";
      $Err[1] = "Child's first name is required.";    
    }else {
    $childsfirstname = test_input($_POST["childsfirstname"]);
     if (!preg_match("/^[a-zA-Z ]*$/",$childsfirstname)) {
    $Error = "false";
    $Err[1] = "Only letters and white space allowed";
    }
  }

Затем я поместил скрытое текстовое поле в html, чтобы собрать $ Error = "true "или $ Error =" false "и установите функцию для включения моего следующего php, если $ Error =" true ".

<input name="Err" type="hidden" value="<?php echo $Error ?>" style="width: 945px"/>
    <div id="submit">
<label>&nbsp;<strong><input id="submit" name="Submit" type="submit" value="Submit" style="left: 0px; top: 0px" /></strong>
</label>
    </div>
&nbsp;</div>
</form>

 <?php 
 if(isset($_POST['Submit']) && ($Error === "true")){ 
 enter();
 }
 ?>

Поскольку я не мог (по неизвестной причине) заставить заголовок работать,Вот почему я использовал включить.Чтобы скрыть форму после появления подтверждения, я сделал это перед формой и в начале формы:

    $style = "";
    if($Error === "true"){
     $style = "style='display:none;'";
    }

?>
<div id="wrap">
<form id="RegForm" method="post" action= "<?php echo htmlspecialchars  ($_SERVER["PHP_SELF"]);?>">
0 голосов
/ 02 июня 2018

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

<?php // php1.php
  $torf = "false";
  $firstname = "donald";
  $lastname = "trump";
  $firstnameErr = "";
  $lastnameErr = "";
  if (isset($_POST["firstname"])) { // if submitted, validate
    $torf = "true";
    $firstname = $_POST["firstname"];
    $lastname = $_POST["lastname"];
    if ($firstname != "george") {
      $torf = "false"; 
      $firstnameErr = "firstname must be george"; }
    if ($lastname != "washington") {
      $torf = "false"; 
      $lastnameErr = "lastname must be washington"; }
  }    
  echo <<<EOD
<!DOCTYPE html>
<html>
<head>
<script>
  "use strict";
window.onload = function() {
  if (${torf}) { // true if php OKs it
    var elt = document.getElementsByName("myform")[0];
    elt.action = "php2.php"; // go to 2nd php
    elt.submit(); }
}
</script>
</head>
<body>
  <form name="myform" action="" method="post">
  First Name:
  <input type="text" name="firstname" value="${firstname}"/><br />
  Last Name: 
  <input type="text" name="lastname" value="${lastname}"/><br />
  ${firstnameErr}<br />
  ${lastnameErr}<br /> 
  <input type="submit" value="Submit" />
  </form>
</body>
</html>
EOD;
?>

<?php // php2.php
  echo "Am in php2.php; \$_POST data is:<br />\n";
  echo json_encode($_POST);
?>

РЕДАКТИРОВАТЬ: (Вместо вашего "представить", я хотел спросить вас о вашем "форме" заявление. Ничего страшного.) Я чувствую, что весь мир, но я этонеправильно, и я единственный, кто прав.Я ищу все, что опровергает это.Вот инструкции для вас, чтобы «заставить его работать».

// #1 change this:
  if ($_SERVER["REQUEST_METHOD"] == "POST") {
// to this:
  $torf = "false";
  if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $torf = "true";
// end

// #2 in your php code, every place that you find a validation error, insert this:
  $torf = "false";
// end

// #3 add id="formid" to your <form statement:
  <form id="formid" ..
// end

// #4 change this:
  </head>
// to this:
  <script>
  "use strict";
window.onload = function() (
  if ( <?php echo $torf; ?> ) { // true if php OKs it
    var elt = document.getElementById("formid");
    elt.action = "sendemail_script.php"; // go to email, etc.
    elt.submit(); }
}
  </script>  
  </head>
// end

// guaranteed to work! :)

РЕДАКТИРОВАТЬ 2:

// I've numbered the changes #1 to #4.  I assume you've checked them.
// > Where exactly do I put "$torf" ?
// $torf appears in changes #1, #2, and #4. Which one is unclear?

// Look at the page source in your browser
// (In chrome, I right-click and hit "view page source").
// I assume the line after "use strict"; is
  if (false) {
// correct?

//In your form, change
        First Name:
// to
        First Name: X <?php echo $torf; ?> X
// I assume that "X false X" will result, correct?

// For change # 2, your changes are like this, correct? :
// before change
  if (empty($_POST["childsfirstname"])) {
    $childsfirstnameErr = "Child's first name is required.";
// after change
  if (empty($_POST["childsfirstname"])) {
    $torf = "false";
    $childsfirstnameErr = "Child's first name is required.";

// $torf should be "true" if there are no validation errors.
// It must be getting set to "false" somewhere where it shouldn't be.
// Look for that.

// Why is it that you "die"?
// Doesn't that prevent validating the rest of the fields?
// Do you find validation errors one at a time?

// Please check for unintended "false" and I'll think about it.
0 голосов
/ 02 июня 2018

1) Запомните функцию isset().Кто-то может обойти / отредактировать вашу HTML-форму.

2) Никогда не используйте die / exit, но только для целей тестирования - или в некоторых редких случаях у вас не будет другого выхода.

3) Чтобы ответить на ваш вопрос, ваша форма должна предоставить данные (атрибут действия формы) на той же странице.Там вы будете делать все свои проверки, если вы обнаружите, что форма отправлена, и вы увидите соответствующие ошибки в форме и, возможно, даже заполните данные.Некоторые говорят, что это плохо для безопасности, я говорю, что это плохо для пользователя, чтобы не заполнять их.

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

header('Location: /success-script.php');
exit;

Когда вы используете header(), вы ДОЛЖНЫ использовать exit сразу после этого, потому что вы перенаправляете, поэтому вам не нужно запускать остальную часть кода.Простой пользователь никогда не узнает разницу, если вы этого не сделаете.Ребенок-хакер может легко увидеть результаты остальной части кода, и иногда это реальная угроза.

Надеюсь, это поможет!

0 голосов
/ 02 июня 2018

Структура:

IS FORM POSTED?

    YES

        IS FORM VALID?

            YES

                Process data

                HTTP redirect and exit

            NO

                Render form with errors
    NO

        Render blank form

В конце проверок вы можете передать свои данные другим функциям, а затем перенаправить что-то вроде:

if(
    empty($childsfirstnameErr) &&
    empty($childslastnameErr)  &&
    empty($monthErr)
)
{
    email_the_data($data);
    store_to_csv($data);
    // Redirect and exit here.
}

Я добавилпример слегка адаптированной версии вашего кода с двумя полями формы здесь:

https://hastebin.com/abekobuyux.xml

А вот слегка измененная версия:

https://hastebin.com/agomosikim.xml

Последний стиль облегчит тестирование каждого компонента.

0 голосов
/ 02 июня 2018

Есть два метода, которые вы можете сделать.

Первый - использовать header () для перенаправления вашего скрипта на нужную страницу.

if(have_valid_data){    
header('Location: email.php');
}

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

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

https://jqueryvalidation.org/

Дополнительный пример

Это всего лишь пример того, как можно проверить форму.Вы выполняете все ваши условия, и если они генерируют ошибку, вы добавляете эту ошибку в массив, скажем, $ errors.

Если после завершения и массив $ errors пуст, у вас не было ошибок, и вы можете считать, что ваша форма проверена.Затем вы делаете любой дополнительный код, который вы хотите.В вашем случае вы будете использовать функцию заголовка, чтобы указать php-скрипту перейти на другую страницу и выполнить там скрипт.

Вы также можете использовать include / require и включить скрипт с этой страницы в код текущих страниц.,Я бы выбрал эту опцию.

Если в массиве $ errors есть ошибки, вы отображаете ошибки.

//I would use one variable(an array) for your errors.
if (empty($_POST["childsfirstname"])) {

  $errors[] = "Child's first name is required.";

}

if (empty($_POST["month"])) {

  $errors[] = "Child's birthday is required.";

}

if(!isset($errors) && empty($errors)){  //<---This means you have no errors.

    //Since you have no errors you can do what you want to do with the info.
  header('Location: your_email_page.php'); 

  //OR

  //include 'your_email_page.php';  //<-- I prefer this way but sometimes header() has a purpose too.

  exit();  //End the script.

}else {

  echo '<ul><li>' . implode('</li><li>', $errors) . '</li></ul>'; //<--Display your errors.

}

Просто найдите время и изучите этот пример, а затем примените его к своему собственному коду.

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