我想做一个循环,通常它是用while
do
for
等完成的,但当进程很大时,我想出了一个解决方案,通过响应javascript来刷新页面以进行下一个循环。
页面是http://localhost/index.php
->这是$i=1;
的第一次迭代
在脚本末尾,它将被重定向到http://localhost/index.php?i=$i++
if (!$_GET['i']){
$i = 1;
}else{
$i = $_GET['i'];
}
if ($i<500){
// proceed with $i = $_GET['i']
//then redirect to http://localhost/index.php?i=$i++
}else{
echo "done";
}
现在,考虑这样一种情况:该脚本的输入参数来自FORM。(即$parameter1 , $parameter2, $parameter3
)然后我必须每次将它们传递给新url(下一次迭代)。
在正常工作中,我可以把它们作为GET变量传递给新的url,但如果我不希望用户能够看到url中参数的值,我怎么能传递它们呢?
在正常工作中,我可以把它们作为GET变量传递给新的url,但如果我不希望用户能够看到url中参数的值,我怎么能传递它们呢?
你不能用纯重定向,但如果你谈论的是一个特定的用户,你可以通过分配这些参数作为会话变量Docs,然后传递会话id作为一个额外的参数(或信任用户已启用cookie)。
function do_redirect($i, Array $parameters)
{
$i = (int) $i;
$parameters['i'] = $i; // save to session as well
$_SESSION['parameters'] = $parameters;
// redirect to http://localhost/index.php?i=$i&SID
}
if (is_form_request())
{
$parameters = get_form_parameters();
do_redirect(1, $parameters);
}
elseif (is_redirect_loop_request())
{
$parameters = $_SESSION['parameters'];
$i = $parameters['i'];
if ($i < 500)
{
do_redirect($i++, $parameters);
} else {
echo "done.";
}
}
无意冒犯,但以上两种答案都很容易出现安全问题(但会话解决方案是最好的解决方案)。至于@itamar的"加密"解决方案:这并不是真正的加密……这就是所谓的"凯撒密码"(http://en.wikipedia.org/wiki/Caesar_cipher),它确实和纸核掩体一样安全……
它可以更容易,更安全;不要将迭代保存在会话中,而是保存在数据库中。对于下一个请求,您唯一要做的就是从数据库中获取迭代器,然后继续执行您想要执行的任何操作。会话可以被窃取,这意味着有人可以让您从$i=10迭代1000次。如果迭代器存储在安全的数据库中,则不能这样做。