通过url循环


looping through url

我想做一个循环,通常它是用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次。如果迭代器存储在安全的数据库中,则不能这样做。