PHP头()redirect与POSTvariables
我正在使用PHP,并且正在制作表单发布到的操作页面。 页面检查错误,如果一切正常,它会将它们redirect到发布数据的页面。 如果没有,我需要将它们redirect回到他们在页面上的错误和POSTvariables。 这是它的工作原理。
HTML看起来像这样…
<form name="example" action="action.php" method="POST"> <input type="text" name="one"> <input type="text" name="two"> <input type="text" name="three"> <input type="submit" value="Submit!"> </form>
action.php看起来像这样…
if(error_check($_POST['one']) == true){ header('Location: form.php'); // Here is where I need the data to POST back to the form page. } else { // function to insert data into database header('Location: posted.php'); }
在发生错误的情况下,我需要它回到第一页。 我不能使用GET,因为input会太大。 如果可能,我不想使用SESSION。 这可能吗?
如果你不想使用会话,你可以做的唯一的事情是POST到同一页面。 无论如何,哪个IMO是最好的解决scheme。
// form.php <?php if (!empty($_POST['submit'])) { // validate if ($allGood) { // put data into database or whatever needs to be done header('Location: nextpage.php'); exit; } } ?> <form action="form.php"> <input name="foo" value="<?php if (!empty($_POST['foo'])) echo htmlentities($_POST['foo']); ?>"> ... </form>
这可以做得更优雅,但你明白了…
// from http://wezfurlong.org/blog/2006/nov/http-post-from-php-without-curl function do_post_request($url, $data, $optional_headers = null) { $params = array('http' => array( 'method' => 'POST', 'content' => $data )); if ($optional_headers !== null) { $params['http']['header'] = $optional_headers; } $ctx = stream_context_create($params); $fp = @fopen($url, 'rb', false, $ctx); if (!$fp) { throw new Exception("Problem with $url, $php_errormsg"); } $response = @stream_get_contents($fp); if ($response === false) { throw new Exception("Problem reading data from $url, $php_errormsg"); } return $response; }
不可能将POSTredirect到其他地方。 当POSTED请求时,浏览器会从服务器得到响应,然后POST完成。 之后的一切都是一个新的要求。 当你在那里指定一个位置标题时,浏览器将总是使用GET方法来获取下一页。
你可以使用一些Ajax在后台提交表单。 这样你的表单值保持不变。 如果服务器接受,您仍然可以redirect到其他页面。 如果服务器不接受,则可以显示错误消息,让用户纠正input并重新发送。
在通过POST发送之前validation表单的数据将是有益的。 您应该创build一个JavaScript函数来检查表单的错误,然后发送表单。 这将防止数据被一遍又一遍地发送,可能会减慢浏览器并使用服务器上的传输量。
编辑:
如果担心安全,执行AJAX请求来validation数据将是最好的方法。 AJAX请求的响应将决定是否提交表单。
使用聪明的模板为你的东西,然后只需将POST数组设置为一个聪明的数组,并打开模板。 在模板中,只要回显数组,所以如果它通过:
if(correct){ header("Location: passed.php"); } else { $smarty->assign("variables", $_POST); $smarty->display("register_error.php"); exit; }
我还没有尝试过,但我会尝试作为一个解决scheme,并会让你知道我find了什么。 但是,当然这个方法假定你正在使用smarty。
如果不是的话,你可以在错误页面上重新创build你的表单,并在表单中回显信息,或者你可以发回非重要数据
恩。
register.php?name=mr_jones&address==...... echo $_GET[name];