php在同一页面上验证,然后通过不同的php进行处理

时间:2018-06-02 00:00:37

标签: php forms validation send

我对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和 验证为self,然后在验证完成后提交到另一个PHP脚本,表单没有错误。

非常感谢任何和所有的帮助,特别是因为我在志愿者的基础上这样做。提前感谢能够伸出援助之手的所有人。

这是我的PHP脚本的开始和结束 - 因为总共有16个基本相同的书面验证,所以我将中间区分开来。
     if($ _SERVER [&#34; REQUEST_METHOD&#34;] ==&#34; POST&#34;){

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 :(得分:0)

您可以使用两种方法。

第一个使用header()将脚本重定向到所需的页面。

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

第二种方法是使用jQuery validation Plugin来验证你的表单。然后,在验证成功后,使用表单标记上的action属性重定向到所需的页面。这是jQuery插件的链接。

我用它来验证我的所有表格。它非常易于使用,并且具有许多功能,可以自定义以执行您想要的任何操作。

https://jqueryvalidation.org/

其他示例

这只是一个人如何验证表单的示例。您将完成所有条件,如果它们生成错误,那么您将该错误添加到数组中,例如$ errors。

如果你完成了并且$ errors数组为空,那么你没有任何错误,你可以假设你的表单已经过验证。然后你做任何你想要的其他代码。在您的情况下,您将使用header函数告诉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.

}

花点时间研究这个例子,然后将它应用到你自己的代码中。

答案 1 :(得分:0)

1)记住isset()功能。有人可以绕过/编辑您的html表单。

2)永远不要使用die / exit,但仅用于测试目的 - 或者在极少数情况下,您将无其他方法。

3)要回答您的问题,您的表单应将数据(表单操作属性)提交到同一页面。如果您发现表单已提交,您将在那里进行所有检查,您将在表单中显示适当的错误,甚至可能重新填充输入。有人说这对安全性有害,我说用户不给它们补充体验是不好的。

如果您发现表单已正确提交,则可以使用

将用户重定向到其他页面
header('Location: /success-script.php');
exit;

使用header()时,您必须立即使用exit,因为您正在重定向,因此您不需要运行其余的代码。如果不这样做,简单的用户永远不会知道差异。儿童黑客可以很容易地看到其余代码的结果,有时这是一个真正的威胁。

希望这有帮助!

答案 2 :(得分:0)

概要

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

后一种风格可以更容易地测试每个组件。

答案 3 :(得分:0)

这个模型对我来说我为你修改过。我希望它有所帮助。

<?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);
?>
编辑:(而不是你的#34;提交&#34;,我的意思是问你的#34;形式&#34;声明。没什么大不了的。)我觉得整个世界,但我错了而我是唯一一个正确的人。我正在寻找任何反驳这一点的东西。以下是您的说明,以及#34;让它工作&#34;。

// #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.

答案 4 :(得分:0)

感谢所有想要帮助的人!一些信息有助于我找到解决方案。我能够使用来自@dcromley和@Joseph_J的信息。我将所有错误设置为数组,然后使用@dcromley建议的true / false设置。

     `$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 =&#34; true&#34;或$ Error =&#34; false&#34;如果$ Error =&#34; true&#34;。

,设置一个函数来包含我的下一个php
<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();
 }
 ?>

由于我不能(由于某种未知的原因)让标头工作,这就是我使用include的原因。为了在确认出现后隐藏表单,我在表单之前和表单开头处执行此操作:

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

?>
<div id="wrap">
<form id="RegForm" method="post" action= "<?php echo htmlspecialchars  ($_SERVER["PHP_SELF"]);?>">