我有一个表单,除了required
属性之外我不进行客户端验证。我正在服务器端进行验证。
歌词/ add.php
<form action="../scripts/lyrics/submit_lyrics.php" id="lyricsForm" method="post" autocomplete="off" enctype="multipart/form-data">
表单数据在单独的php文件中处理。以下列方式检索和验证表单数据:
脚本/歌词/ submit_lyrics.php 的
$form_data = new FormData(["artist", "album", "song", "year", "track_no", "lyrics"], "sssiis");
$form_data->validate();
validate
方法的作用是
public function validate() {
$valid = $this->check_form_data($fields);
$fields = implode(",", $fields);
if (!$valid) {
header("location: ".BASE."lyrics/add?status=error&problem=input&specifics=$fields");
exit;
}
}
检查表单数据并将页面( scripts / lyrics / submit_lyrics.php )重定向到表单页面( lyrics / add.php ),其中包含有关验证的信息(如果失败了)。然后我输出一条错误消息,指出使用GET
方法输入有问题。
我很好奇我是否可以使用POST
执行此操作。我需要修改这一行
header("location: ".BASE."lyrics/add?status=error&problem=input&specifics=$fields");
将页面重定向到BASE."lyrics/add"
,并使用POST
将验证信息发送到该页面。因此,我仍然可以输出验证错误,但使用POST
代替GET
。
这可能吗?
答案 0 :(得分:0)
不,这是不可能的,因为您正在重写请求。浏览器将始终发送“GET”请求以响应重定向请求,除非它收到307请求,其中它将使用相同的方法和参数重复请求。请参阅this related question on Programmers。
解决方法是重定向到您生成的嵌入表单的新页面,并为用户提供表单的javascript POST。这是一个额外的请求,但它是让客户端进行第二次POST的唯一方法。
答案 1 :(得分:0)
使用u_mulder的建议(在会话中存储值),我已通过以下方式解决了问题:
脚本/歌词/ submit_lyrics.php 的
public function validate() {
$valid = $this->check_form_data($fields); // check if input fields are valid
$fields = implode(";", $fields); // invalid input fields
if (!$valid) { // not all fields are valid, so we return
session_start(); // start session
if (!isset($_SESSION["problem"])) { // making sure session variable doesn't exist
$_SESSION["problem"] = "input"; // error type: input, file_upload, db_insert, etc.
$_SESSION["specifics"] = $fields; // artist, album, etc. (for input)
}
header("location: ".BASE."lyrics/add?status=error"); // redirect to form page
exit;
}
}
歌词/ add.php
if (isset($_GET["status"])) {
$status = $_GET["status"];
switch ($status) {
case "error":
session_start();
if (isset($_SESSION["problem"])) {
$problem = $_SESSION["problem"];
$specifics = explode(";", $_SESSION["specifics"]);
$error_message = "There was an error.";
switch ($problem) {
case "input":
$error_message = "Invalid input on the following fields:";
break;
// other cases ...
}
session_destroy();
output("Error!", $error_message, $specifics);
} else {
// if the user reloads the page, session data is lost
// but we're still in the error page "lyrics/add?status=error" and have no error to show
// we either show an appropriate message or redirect to "lyrics/add"
session_destroy();
// output("Error!", "You're in the form validation error page, but there aren't any errors. Did you reload the page?");
// header("location: ".BASE."lyrics/add");
// exit;
}
break;
case "success":
// form submitted successfully
break;
}
} else {
// show form
}