我使用$ _SESSION来存储用户ID,但我想更改为使用与SQL配对的常规cookie(使用KEY),这样我就可以在用户关闭浏览器时对用户进行身份验证。
如何为SESSIONs表中的每一行创建唯一键?
答案 0 :(得分:1)
您正在寻找编写自己的会话处理程序以绕过会话cookie上的PHP的Cookie过期问题。这非常简单,如果正确完成,则会进行相当优化。
第1步:生成会话ID
会话ID是唯一的。但是,如果您计划进行永久会话,则必须记住以下几点:您希望会话在每个浏览器中继续运行,而不管连接问题如何。因此,您可以通过将会话ID与导航器的用户代理(不会更改)映射来欺骗系统。
这使您可以减少会话ID生成器为两个不同的访问者生成相同ID的机会。其余部分取决于随机数生成器和散列算法,但是md5(microtime().$_SERVER['REMOTE_ADDR'])
通常是值得信赖的朋友。
第2步:存储和检索数据
存储数据也很简单。您的目标是创建一个至少包含两列的MySQL表:会话密钥(设置为PRIMARY
)和数据(最简单形式的序列化数组,存储为TEXT
)。
创建会话时,只需插入新行并观察错误。如果出现错误,则密钥已被使用,因此您需要重新生成另一个密钥。如果成功插入行 - 一切都很好,您现在有一个用户的会话行!你需要做的就是在你认为合适的情况下读/写这一行。
使用会话ID为用户Cookie,然后就完成了!
<强>注意事项强>
答案 1 :(得分:0)
最好的方法是使用一些哈希函数,实际上PHP也会通过生成会话ID来使用它。 你可以使用这样的东西:
md5(microtime());
您可以将更多值组合在一起,例如随机数,用户代理,服务器名称或使用更强大的算法,如SHA2。
但是对于唯一性,如果没有存储这样的哈希,你总是需要查看表格(但当然概率非常低)。
但我会选择完成所有工作的标准session_id()
。
答案 2 :(得分:0)
您可以使用MySQL的UUID()
。
如果你想让会话保持活跃,你也可以使用PHP的session_set_cookie_params()
。
SQL解决方案有一个优点:您可以轻松扩展到更多Web服务器。另一方面,你不能使用PHP的$_SESSION
数组,你必须自己编写会话处理。