php 在同一页面上验证,然后通过不同的 php 进行处理
Posted
技术标签:
【中文标题】php 在同一页面上验证,然后通过不同的 php 进行处理【英文标题】:php validate on same page and then process through different php 【发布时间】:2018-11-12 02:52:18 【问题描述】:我对 php 很陌生,并且已经设法自己学习了一点,但是我在这个问题上陷入了困境。我有一个表单可以验证自我并在同一页面上显示错误。填写并验证信息后,我需要通过单独的 PHP 脚本对其进行处理,该脚本将向我发送电子邮件,将信息发布到 .csv 文件,并显示确认页面。我目前有这两个方面的工作,但没有一起工作。换句话说,我的表单将验证自我,但信息无处可去。这显然是没有用的。另外,通过将操作设置为我的 PHP 脚本,我可以让表单执行所有其他功能,但是字段是否填写并不重要,它会发送任何内容。我已经尝试了从会话、函数到包含的所有内容,我什至不记得还有什么可以让它工作的。我什至尝试将我的错误设置为一个数组,然后在结果上调用一个 TRUE/FALSE 函数,以使其验证然后重定向。我已经在同一页面上进行了验证,但无论如何发送所有信息都只是显示在空白页面上。
请不要回复说这是重复的。这是我至少一个星期以来一直在研究和研究的问题。我已经阅读了本网站和其他网站上的许多主题,但没有找到有效的答案。 我不希望在客户端进行验证,然后通过 PHP 发送。我还需要在同一页面验证并确保保留任何先前输入的响应(我的表单当前所做的),因为有许多字段是必需的。
我发布了我的部分代码以保留必要的信息。正如我所说,如果我将操作设置为运行它,我的验证和 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;?>"/>
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 和 验证自我,然后在验证完成且表单无错误后提交到另一个 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;
?>
目前没有任何尝试传递表单信息 - 仅在验证工作的情况下。我不断地恢复到正在工作的东西,这样我就不会破坏正在工作的东西。
【问题讨论】:
将第二个脚本中的代码插入第一个脚本或通过调用require
(php.net/manual/en/function.require.php) 执行它
请编辑您的问题以显示您的提交按钮。还有您的第二个(电子邮件)php 例程的名称。我可以编辑我的答案以减少侵入性 - 我想我的目的是让你挑选出重要的部分。
我的提交按钮只是一个提交按钮的运行。这与信息的去向无关。这是通过函数完成的。它看起来像这样: 我尝试使用会话传递信息。这行得通,但是我的表单是否经过验证并不重要,它会发送所有内容 - 甚至是空白的必填字段。但是,我的实际问题与如何使其工作有关。
“还有您的第二个(电子邮件)php 脚本的名称。”
我编辑了我的答案,为您提供“让它工作”的说明。
【参考方案1】:
有两种方法可以做。
第一个使用 header() 将您的脚本重定向到所需的页面。
if(have_valid_data)
header('Location: email.php');
第二种方法是使用 jQuery 验证插件之类的东西来验证您的表单。然后在验证成功后使用表单标签上的 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.
花点时间研究一下这个例子,然后把它应用到你自己的代码中。
【讨论】:
您能否详细说明“have_valid_data”的含义。这实际上是我在脚本中放入的内容吗?而且,我刚刚意识到我忘记了我尝试了没有动作发生的标题。另外,我只想坚持使用 PHP,但无论如何感谢您的 jQery 建议 这只是伪代码,向您展示如何设置条件语句。您想编写为您的数据返回 true 或 false 的函数。如果他们都以您希望的方式返回,那么该表格将是有效的。我给你写一个例子。 我尝试设置条件语句并返回真/假,但它没有提交我的数据。它只是把我带到一个空白页面,我一定做错了什么。 我已经更新了我的答案。请记住,这是一个模板,只需学习并适应您的代码即可。 我确实像你说的那样,但它不能正常工作。当我尝试提交丢失的数据时,我收到了预期的错误消息,但是当表单已满时,它只会将空白表单备份,而不会将数据发送到任何地方或重定向到任何地方。当输入某些字段时,它也不再回显已经输入的响应,但是该字段的错误现在丢失了。这似乎是我一直在寻找的轨道,但它没有正确执行。【参考方案2】:1) 记住isset()
函数。有人可以绕过/编辑您的 html 表单。
2) 切勿使用 die
/ exit
,但仅用于测试目的 - 或者在极少数情况下,您将没有其他办法。
3) 要回答您的问题,您的表单应将数据(表单操作属性)提交到同一页面。如果您发现表单已提交,您将在那里进行所有检查,并且您将在表单中显示适当的错误,甚至可能重新填写输入。有人说这对安全性不利,我说不补充它们对用户体验不利。
如果您发现表单提交正确,那么您将用户重定向到另一个页面使用
header('Location: /success-script.php');
exit;
当使用header()
时,你必须紧接着使用exit
,因为你正在重定向,所以你真的不想运行其余的代码。如果您不这样做,一个简单的用户将永远不会知道其中的区别。儿童黑客可以很容易地看到其余代码的结果,有时这是一个真正的威胁。
希望这会有所帮助!
【讨论】:
我将再次尝试 header 函数,因为我不记得在尝试使用它时是否包含 exit 函数 - 到目前为止我已经尝试了很多东西。 至于我的表单验证自身并在同一页面上显示错误,这不是一个问题,它是一个声明 - 它确实如此。另外,如果我不应该使用 die / exit 除了测试之外,你为什么说在 header 之后使用它? die/exit 不像 return 语句,它完全停止代码执行。如果您在发现错误的那一刻终止代码执行,您将永远无法显示它。但是,如果您发现一切正常并且您想重定向到不同的 url,即对服务器的不同请求,这将打开一个新线程。如果你不这样做,这就像在一个带有“display:none;”的 html 表单中拥有一个元素。简单用户看不到它,但有经验的用户可以随时查看它,这可能是一种安全威胁。 是的,那里的信息与死亡/退出有冲突! 您能否提供更多有关该消息的信息?另外我想你已经在“header()”函数之后删除了所有的“die”语句。【参考方案3】:大纲:
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
后一种风格会更容易测试每个组件。
【讨论】:
你将如何重定向?使用“标题”,在我看来,您将进入第二个 php 例程,但不会有任何 $_POST 数据并且经过验证的表单数据会丢失?我错了吗? (抄送:@Angela S.) @dcromley 此处的标头位置重定向 (PRG) 是在完成后(已验证、通过电子邮件发送、存储到 csv)。 $data 可以是经过验证和/或过滤的值数组,其他函数可以使用,替代超级全局变量。我个人会将逻辑封装在函数中,但如果需要,它们可以是 require_once 行。 OP 说:“填写并验证信息后,我需要通过单独的 PHP 脚本处理它,该脚本将向我发送电子邮件,将信息发布到 .csv 文件并显示确认页面。”,所以我认为她不想要第一个脚本中的“电子邮件”和“商店”。 所有这些都可以在上面完成。最后的重定向是确认页面。处理函数可以调用/使用其他脚本/文件。一定要分门别类。 是的,dcromley 是正确的。我有一个 PHP - “sendemail_script.php”,其中包含“发送和发送电子邮件、将信息发布到 .csv 文件并显示确认页面”所需的所有脚本和信息。如果我使用 【参考方案4】:我为你修改了这个模型。希望对你有帮助。
<?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.
【讨论】:
这实际上并没有回答我的问题,它只是完全改变了我所拥有的完全不同的东西,并且没有任何提交给我的 php 脚本 @Angela S.“没有任何提交给我的 php 脚本”?验证后,(乔治华盛顿),表单数据被提交到 php2.php,您的电子邮件等将在其中。重要的一点是,php1.php 中的 php 必须(?)以某种方式与 php1.php 页面中的 javascript 通信,表明数据已经过验证,因此可以将表单数据提交给 php2.php。在我的模型中,这是在语句“if ($torf)”、“elt.action = 'php2.php';”中完成的和“elt.submit();”。没有“标题”,没有“重定向”。【参考方案5】:感谢所有试图提供帮助的人!其中一些信息有助于我找到解决方案。我能够使用来自@dcromley 和@Joseph_J 的信息。我将所有错误设置为一个数组,然后使用@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 if $Error = "true"。
<input name="Err" type="hidden" value="<?php echo $Error ?>" style="width: 945px"/>
<div id="submit">
<label> <strong><input id="submit" name="Submit" type="submit" value="Submit" style="left: 0px; top: 0px" /></strong>
</label>
</div>
</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"]);?>">
【讨论】:
感谢您的跟进。我猜“at”dcromley 除了在评论中不起作用(我只是偶然回到这里)。我没有得到“enter();”,但我很高兴你的工作顺利进行。以上是关于php 在同一页面上验证,然后通过不同的 php 进行处理的主要内容,如果未能解决你的问题,请参考以下文章
如何验证表单数据,然后通过 AJAX 发送,然后在同一页面上显示提交的结果
我希望我的 php 表单提交数据并在同一页面但不同的选项卡上重定向