2013-07-22 79 views
0

我正在使用PHP Web应用程序连接到MySQL,我想要做的是设置已登录的客户端的用户标识,然后在视图和函数中使用该变量来限制数据回。MySQL变量PHP连接

目前,我简单地使用: -

SET @UserID = 3; 

然后内的意见/函数引用此。

这是跨越多个并发用户会话做到这一点的合适可靠方法吗?这是否会在该用户的一生中出现MySQL的PHP​​连接(或页面加载),我显然希望确保没有其他连接可以利用它。它设置在每个页面加载(或从我的应用程序重新连接MySQL)。

谢谢大家!

回答

1

因为它清楚地在MySQL变量手册页第一款规定:http://dev.mysql.com/doc/refman/5.0/en/user-variables.html

用户定义的变量是会话特有的。也就是说,由一个客户端定义的用户变量不能被其他客户端看到或使用。当客户端退出时,给定客户端会话的所有变量都会自动释放。

例如,它们在php连接处于活动状态时保持连接状态,并且在连接关闭/终止时自动删除。除非你在PHP中使用持久连接(你不应该这样做),否则mysql变量基本上会存在于特定脚本调用的生命周期中,并且当相同的用户稍后返回另一个http请求时将不可用。

+0

是从连接池中不同的持久连接? – tadman

+0

持久连接在未使用时保留在池中。通常他们在网络环境中是一个坏主意。例如一些脚本栏通过一个复杂的事务中途。由于连接的持久性,mysql + php将其打开。一些OTHER脚本然后显示,重新使用连接,并开始做自己的东西。您可以很容易地陷入僵局,因为脚本#2不知道它正在脚本#1的半完成事务中工作。如果连接在#1中止时关闭,则交易会自动回滚。 –

+1

持续连接是好的,死锁情况不是问题。 –

0

所以,严格来说,你在做什么不应该是一个问题(每个PHP连接存在或多或少独立)。但是,那就是说,这不是最好的方法。

我认为你有一个“如果你只有一把锤子,一切看起来像钉子”问题。 MySQL并没有考虑到请求生命周期的设计,也不需要知道它。另一方面,PHP的设计正是这个想法。

相反的:

mysqli_query('Set @UserID=' . $id); 
$output = mysqli_query('SELECT * FROM FOO WHERE [email protected]'); 

为什么不直接使用bound variables?

+0

看起来像你只是错过了这个问题 –

+0

我认为值得重申的是,这种事情是一个非常糟糕的想法,这就是为什么应该为每个查询专门指定绑定,而不是依赖连接上下文为您提供它们。 – tadman