如何通过应用程序记住用户的进度?

时间:2012-01-26 14:58:56

标签: php javascript session architecture

我正面临一个我无法解决的架构问题。我正在用PHP和Javascript开发一个小游戏,我需要保存用户的进度。现在,问题是PHP无法确定用户何时获得该级别:它是在Javascript中完成的。有没有办法在他赢得一个级别时保存用户的进度?

例如,当用户赢得等级1时,他获得对等级2的访问权。如果他试图在未完成前一等级的情况下访问等级2,则他被重定向到最后完成的等级。在我的控制器中,我正在执行以下操作:

if (1 !== $id) {
    if ($app['session']->get('last_level') !== ($id - 1)) {
        // redirect the user
    }
}

现在我需要一种方法将 last_level 值存储到会话中,这是一个用户无法模拟的操作。

任何提示?

3 个答案:

答案 0 :(得分:1)

您将要在服务器上执行不同的last_level计算。这样,用户就无法破解JavaScript,并在特制表单上提交内容。因此,根据您的存储系统(KV存储,数据库,文本文件等),将该值放在那里,然后检索它。

Ajax可以帮助你,但没有必要。这取决于你的游戏设置方式。但如果他们完成了这个级别,就需要通知服务器。

答案 1 :(得分:1)

如果用户完成某个级别,然后继续在同一页面上执行其他工作:

然后,您可能希望Ajax在新级别实现后立即将新级别信息发送到服务器。因此:

  1. 使用Cookie存储您的php会话ID

  2. 从您的Javascript客户端,只要用户赢得新级别,就使用Ajax在您的服务器上调用php url。将新级别作为参数发送。可以使用POST或GET,无所谓。

  3. php程序将在cookie中接收会话ID,并将新级别作为参数。 php程序将从会话ID中查找用户ID,然后将新级别存储在数据库中。

  4. 下次调用php程序的主url时,它将能够查找用户的级别。

  5. 如果用户按“下一步”按钮继续前进到下一级别: 使用Javascript而不是Ajax来更改“下一步”按钮的POST参数。

    你使用POST而不是GET,因为看到foo.com/game?level=5的网址对于人们欺骗你的游戏来说太明显了。 POST不会在url中显示level参数。更高的安全性:添加校验和参数。

    如果上述任何一项不明确,请在评论中或作为后续问题提出。

答案 2 :(得分:0)

如果您乐意接受javascript的话,表示该级别已经完成,那么只需从javascript设置一个cookie。

  

用户无法模拟的操作

抱歉 - 但是如果它是javascript,当它们完成关卡时就会停止,那么没有什么可以阻止用户伪造结果。