【问题标题】:MySQL Variables PHP COnnectionsMySQL 变量 PHP 连接
【发布时间】:2013-07-22 19:19:48
【问题描述】:

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

目前,我只是在使用:-

SET @UserID = 3;

然后在视图/函数中引用它。

这是跨多个并发用户会话执行此操作的合适且可靠的方法吗?这将在该用户从 PHP 的 MySQL 连接(或页面加载)的生命周期内出现,我显然希望确保没有其他连接利用这一点。它在每次页面加载(或从我的应用程序重新连接 MySQL)时设置。

谢谢大家!

【问题讨论】:

    标签: php mysql codeigniter mysqli


    【解决方案1】:

    正如它在 mysql 变量手册页的第一段中明确指出的那样:http://dev.mysql.com/doc/refman/5.0/en/user-variables.html

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

    例如它们在 phpmysql 连接保持活动状态时存在,PER 连接,并在连接关闭/终止时自动删除。除非您在 PHP 中使用持久连接(无论如何都不应该使用),否则 mysql 变量将在特定脚本调用的整个生命周期内基本上存在,并且当同一用户稍后返回另一个 http 请求时将不可用.

    【讨论】:

    • 持久连接和连接池有区别吗?
    • 持久连接在不使用时保存在池中。通常,它们在网络环境中是一个坏主意。例如一些脚本在一个复杂的事务中途出错。由于连接是持久的,mysql+php 将其保持打开状态。然后出现一些其他脚本,重用连接,并开始做自己的事情。您很容易陷入死锁情况,因为脚本#2 不知道它在脚本#1 的半完成事务的中间工作。如果在 #1 中止时连接已关闭,则事务将自动回滚。
    • 持久连接很好,死锁情况不是问题。
    • 好吧,享受你的网站宕机吧,因为你的持久连接池被大量不完整的事务锁定了。
    • 如果您正在使用事务并且您没有可以从异常中恢复并放弃它们的数据库层,那么这是您的数据库层的问题,而不是一般的持久连接。其他语言使用持久连接和事务没有问题。
    【解决方案2】:

    因此,严格来说,您正在做的事情不应该是一个问题(每个 PHP 连接或多或少独立存在)。但是,话虽如此,这并不是最好的方法。

    我认为你有一个“如果你只有一把锤子,那么一切看起来都像钉子”的问题。 MySQL 在设计时并未考虑到请求生命周期,因此它不需要了解它。另一方面,PHP 正是按照这个想法设计的。

    代替:

    mysqli_query('Set @UserID=' . $id);
    $output = mysqli_query('SELECT * FROM FOO WHERE ID=@UserID');
    

    为什么不直接使用bound variables?

    【讨论】:

    • 看来您只是错过了问题
    猜你喜欢
    • 2010-12-26
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 2014-01-26
    • 2017-07-25
    • 1970-01-01
    相关资源
    最近更新 更多