我一直在阅读(mysql)触发过去几天...特别是我想要做的是找出更新用户信息的好方法。
用于此的案例与用户管理系统有关:
例如,admin
用户将regular
用户更新为manager
,此用户type
将更改enable|disable
界面上的软件功能。
问题:
除非您查询数据库并重置例如type
变量,或者用户登录|退出系统,否则您不会知道此用户$_SESSION['user']['type']
更改。
问题:有什么好方法可以解决这个问题吗?
答案 0 :(得分:4)
我不认为mysql triggers would be ideal for this。为什么?因为你最有可能最终得到php中的部分逻辑和mysql中的部分逻辑。使用一种技术是一件好事,因为以后为您和您的同事维护/调试代码会更容易。
因此,在您的情况下,如果您希望更改用户角色将立即执行操作,则必须在每个脚本运行时加载用户角色,或者使用数据库中的某个标志注销用户,这将标志着他的会话不是已经有效(或者您可以实现自己的session_set_save_handler
,它可以将文件保存在文件中,您可以将其删除以注销用户)。
这取决于您的需求哪种解决方案更适合您的情况。
所以这真的取决于你选择是否更好地注销用户,立即给他新的权限或等到下次登录时的需要。
答案 1 :(得分:2)
问题:有没有什么好方法可以解决这个问题?
找到不这样做的好理由!
虽然这听起来像个笑话,但我完全认真。你必须考虑:
对于回答这些问题感到不自在的人并不是真的需要这个功能。
找到简单的替代方案:
这不是懒惰。只关注真正的价值。
答案 2 :(得分:1)
另一种方法是使用一些时间间隔执行ajax请求,以更新用户$ _SESSION。
如果您的'type'
中有任何更改,您可以执行任何操作,例如强制用户重新登录您的应用程序,或者只执行更新$ _SESSION信息。
当然,您需要知道在用户注销和下次登录之前是否确实需要获取此信息,并使用更新的配置文件。
答案 3 :(得分:1)
我认为将会话存储到像Redis这样的缓存机制会给你带来额外的好处。它比在数据库中存储会话数据轻。您可以非常轻松地创建群集。点击here查看示例实施。
因此,一旦用户"键入"更改,您可以加载redis数据缓存并根据您的意愿更新它。
答案 4 :(得分:0)
我认为最安全的方法是做到这一点,而我选择的是#34;头疼"方式。
根据您的应用,可能会略微昂贵的替代方案:
每次用户提供会话令牌时,请使用数据库检查会话的有效性。如果该会话包含无效信息(即'类型'不再匹配),则强制用户重新登录。
添加另一种选择:
不要使用MYSQL触发器,当应用程序调用者(管理员)更新用户A'键入时,它也会在您缓存的任何地方拨打电话会话和(a)更新会话(不建议*)或(b)使会话无效并强制用户再次登录。
*请注意,所有这些解决方案都要求用户在找到新发现的'经理后重新输入凭据。在他们可以访问“经理”之前的权力#39;我认为这比没有任何身份验证更新会话更安全。
答案 5 :(得分:0)
我推荐的方法是将每个用户的type
存储在数据库中。如果您决定将type
存储为会话变量,则会出现问题(其中包括):
会话过期后,此信息将丢失。通常会话持续30分钟,但您可以根据需要对其进行修改。但是,如果您创建的会话持续1个月,则有权访问该用户计算机的任何人都将登录到用户帐户,而无需使用任何密码。
您将无法使用数据库提供的强大和高级查询(例如MySQL,例如使用SQL)。如果您将信息存储在会话中,请确保您可以找到一种方法来逐个查找每个用户信息,但为什么要重新发明轮子?从头开始构建数据库结构并不容易,因此我不建议这样做。
关于您在更新信息后访问数据库的问题,我不会说这些信息与您可能认为的一样令人担忧。让我们想象下面的例子:
<强> 1)强>
如果某个用户当前是经理,并加载了一个他可以执行强大操作的网站,之后他被降级为普通用户,那么在数据库中拥有此信息将完美地工作。如果用户试图使用他的权力(不再是他的权力),他会点击一个按钮,向数据库发送请求以确认他的type
。数据库查询非常快,因此速度不是问题。我会更关心从会话变量获取信息所需的速度而不是数据库。
<强> 2)强>
如果用户在正常用户的同时在页面上,并且在页面上他成为经理,那么他将能够行使他的权力刷新页面后。我的意思是,如果您使用了会话,并且您希望页面自动获取信息,例如 AJAX ,然后在页面上更新他的选项,那将比简单刷新消耗更多的服务器功率。 / p>
给一个简单的SELECT * FROM myTable WHERE id = 4
只需要1毫秒就可以在数据库上执行。数据库专门针对它们的速度而设计,这就是它们首选的原因
但,也许您无法访问数据库,这就是您正在寻找替代方案的原因?好吧,你是幸运的! MySQLi 是一个仅使用文件存储信息的数据库。它专为那些没有太多资源的用户而设计,具有MySQL所具备的许多功能。
答案 6 :(得分:0)
由于每个用户都有z
或role
,这意味着查看或编辑应用内容的能力与此因素紧密相关。这意味着您的会话变量应具有的type
和userID
的两个基本内容也应该存储在您的数据库中
这些信息可以传递给userType
,例如作为一个小数组,您的数组键可以是$_SESSION['user']
和userID
值。
userType
用户登录后,您的初始值将存储到$_SESSION['user']=array($userID => $userType);
。为了使您的应用能够了解 session
可以在您的应用中查看或修改的内容,您基本上会在脚本中对userA
userType
进行比较。但要实现您的目标,您基本上需要在应用程序的每个userA
开始时重新获取该信息。如果已将新VIEW/PAGE
分配给userType
,只需显示一条消息,表明他/她将在15秒内自动注销(给予时间阅读邮件本身),以使更改生效。当您的用户看到此消息时,您可以获取他/她可能拥有的当前会话数据并将其保存在数据库中,因为某些会话变量可能(或不可用)升级或降级userA
。通过将userType
与应用程序的每个userType
的开头进行比较,您可以省去用户可能丢失数据的麻烦。