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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (51)

我对PHP非常陌生,自己也能学到一些东西,但我在这个问题上一直在原地打转。我有一个表单,可以验证自我,并在同一页上显示错误。一旦信息被填充和验证,我需要通过一个单独的PHP脚本来处理,该脚本将发送给我一封电子邮件。信息到一个.csv文件中,并显示一个确认页。我现在让这两件事都正常工作,但不能一起使用。换句话说,我的表单将对Self进行验证,但是信息将不起作用。这显然是无用的。另外,我可以让表单通过将操作设置为我的PHP脚本来完成所有其他函数,但是如果将操作设置为PHP脚本,则不重要。字段是否填入,它会发送任何内容。我尝试了从会话、函数、包含到其他什么东西,我甚至不记得还有什么能让它工作。我甚至尝试将错误设置为数组,然后对结果调用一个真/假函数,以便让它验证,然后重定向。相同的页面,但是发送所有的信息到做任何事情,只会出现在一个空白页上。

请不要回复这是一个重复的问题。这是一个问题,我已经工作和研究了至少一个星期。我已经阅读了本网站和其他许多帖子,但没有找到一个工作的答案。

我不希望在客户端验证,然后通过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脚本,并且表单是无错误的。

提问于
用户回答回答于

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

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

第二种方法是使用jQuery验证插件来验证表单,然后在验证成功后使用Form标记上的action属性重定向到你想要的页面。以下是jQuery插件的链接。

我用它来验证我所有的表单,它非常容易使用,并且有很多特性,并且可以定制来做任何你想做的事情。

附加例子

这仅仅是一个验证表单的例子,要遍历所有的条件,如果它们生成一个错误,那么就会将该错误添加到数组中,比如$Error。

如果完成了操作,$Error数组为空,那么就没有任何错误,可以假设你的表单已被验证。然后可以执行任何你想要的额外代码。在你的示例中,你将使用Header函数告诉php脚本转到另一个页面并在那里执行脚本。

还可以在当前页面代码中使用包含/要求和包含该页面中的脚本。我将选择该选项。

如果$Error数组中有错误,则显示错误。

//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)记住isset()功能。有人可以绕过/编辑你的html表单。

2)永不使用die/exit,但只是为了测试目的-或者一些罕见的情况下,将没有其他方法可以绕过它。

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

如果您发现表单提交正确,则可以使用以下方法将用户重定向到另一个页面

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

使用时header(),必须使用exit之后,因为您要重定向,所以您不想运行其余的代码。如果你不知道,一个简单的用户就永远不会知道区别。一个子黑客可以很容易地看到其余代码的结果,有时这是一个真正的威胁。

扫码关注云+社区

领取腾讯云代金券