我对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;?>"/>
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;
}
?>
目前没有任何传递表单信息的尝试 - 仅在验证工作时。我不断恢复正在工作的东西,这样我就不会破坏正在发挥作用的东西。
答案 0 :(得分:0)
您可以使用两种方法。
第一个使用header()将脚本重定向到所需的页面。
if(have_valid_data){
header('Location: email.php');
}
第二种方法是使用jQuery validation Plugin来验证你的表单。然后,在验证成功后,使用表单标记上的action属性重定向到所需的页面。这是jQuery插件的链接。
我用它来验证我的所有表格。它非常易于使用,并且具有许多功能,可以自定义以执行您想要的任何操作。
其他示例
这只是一个人如何验证表单的示例。您将完成所有条件,如果它们生成错误,那么您将该错误添加到数组中,例如$ 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> <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();
}
?>
由于我不能(由于某种未知的原因)让标头工作,这就是我使用include的原因。为了在确认出现后隐藏表单,我在表单之前和表单开头处执行此操作:
$style = "";
if($Error === "true"){
$style = "style='display:none;'";
}
?>
<div id="wrap">
<form id="RegForm" method="post" action= "<?php echo htmlspecialchars ($_SERVER["PHP_SELF"]);?>">