首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >php在同一页面上验证,然后通过不同的php处理

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

Stack Overflow用户
提问于 2018-06-02 08:00:37
回答 4查看 503关注 0票数 1

我对PHP非常陌生,并且已经设法自己学到了一些东西,但我在这个问题上陷入了困境。我有一个表单,将验证自我,并在同一页上显示错误。一旦信息被填充和验证,我需要通过一个单独的PHP脚本处理它,它将给我发送一封电子邮件,将信息发布到一个.csv文件,并显示一个确认页面。我目前有这两个工作,但不是在一起。换句话说,我的表单将对self进行验证,但信息不会出现。这显然是无用的。另外,通过将操作设置为PHP脚本,我可以让表单执行所有其他功能,但是字段是否填写并不重要,它会发送任何内容。我尝试了所有的方法,从会话、函数、包含,我甚至不记得还有什么可以让它工作。我甚至尝试将我的错误设置为数组,然后对结果调用TRUE/FALSE函数,以便使其进行验证,然后重定向。我已经在同一页上验证了结果,但无论如何都会发送所有信息,但什么也不做,只会在空白页上显示。

请不要回答说这是重复的。这是一个我已经研究了至少一周的问题。我已经在这个网站和其他网站上阅读了很多帖子,但没有找到一个有效的答案。

我不希望在客户端验证,然后通过PHP发送。我还需要同一页验证,并确保任何以前输入的响应a被保留(我的表单目前这样做),因为有许多字段是必需的。

我正在张贴我的代码的一部分,以保持它的必要信息。正如我所说的,如果我设置了运行PHP脚本的操作,那么我的验证就会自动生效。

这是验证的一部分:

代码语言:javascript
复制
    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;
}

这是表单的一部分:

代码语言:javascript
复制
<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>

虽然我意识到这里没有代码来表明我正在尝试重定向以发送信息,但请相信我已经做了不止几次尝试,我所寻找的只是做这件事的最佳方式和如何去做的一些实际指导。只要它能工作,不管它是include还是require,会话还是其他的,只要它是PHP并验证到self,然后在验证完成并且表单没有错误时提交给另一个PHP脚本就可以了。

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

这是我的PHP脚本的开头和结尾-我将省略中间部分,因为总共有16个基本相同的书面验证。

代码语言:javascript
复制
  if ($\_SERVER["REQUEST\_METHOD"] == "POST") {
代码语言:javascript
复制
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";
  }
}

。。。

代码语言:javascript
复制
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;
}


?>

这不需要任何当前传递表单信息的尝试-只有在验证有效的情况下。我不断地恢复到正在工作的状态,这样我就不会破坏正在工作的状态。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-06-12 01:38:53

感谢所有试图提供帮助的人!一些信息对我找到解决方案很有帮助。我可以使用@dcromley和@Joseph_J中的信息,我将所有的错误设置为一个数组,然后使用@dcromley建议的真/假设置。

代码语言:javascript
复制
     `$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”,并设置了一个函数,以便在$Error = "true“时包含我的下一个php。

代码语言:javascript
复制
<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的原因。为了在确认消息出现后隐藏表单,我在表单之前和表单开头执行了以下操作:

代码语言:javascript
复制
    $style = "";
    if($Error === "true"){
     $style = "style='display:none;'";
    }

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

Stack Overflow用户

发布于 2018-06-02 08:27:36

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

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

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

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

代码语言:javascript
复制
header('Location: /success-script.php');
exit;

在使用header()时,您必须在后面立即使用exit,因为您是重定向的,所以您实际上并不想运行其余的代码。如果你不这样做,一个简单的用户永远不会知道其中的区别。一个儿童黑客可以很容易地看到其余代码的结果,有时这是一个真正的威胁。

希望这能有所帮助!

票数 0
EN

Stack Overflow用户

发布于 2018-06-02 10:14:49

提纲:

代码语言:javascript
复制
IS FORM POSTED?

    YES

        IS FORM VALID?

            YES

                Process data

                HTTP redirect and exit

            NO

                Render form with errors
    NO

        Render blank form

在验证检查结束时,您可以将数据传递给其他函数,然后重定向,如下所示:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50652300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档