同时重定向和POST

时间:2016-08-05 21:04:30

标签: php html post get

我有一个表单,除了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

这可能吗?

2 个答案:

答案 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
}