【问题标题】:How declare a php variable to hold the return value of "mysql_connect()"?如何声明一个 php 变量来保存“mysql_connect()”的返回值?
【发布时间】:2011-06-10 21:40:53
【问题描述】:

我需要将 mysql_connect() 的值保存在一个全局变量中,该变量可在我的项目中的每个 php 文件中访问 例如,$db_ServerVal = mysql_connect()

我只需要在程序开始时调用 mysql_connect 一次。

然后在每个 php 文件中 -- $db_ServerVal 必须是有效的。不是第一次。 每次。直到我打电话给mysql_close( $db_ServerVal)

我可以使用$GLOBALS[],php 中的预定义数组来存储我的$db_ServerVal 数据库连接吗?

另一个问题是——当浏览器窗口关闭时,我需要一个“关闭”事件, 这样我就知道是时候打电话给mysql_close( $db_ServerVal);了。

我不能在 index.php 文件的末尾调用mysql_close(),因为这会关闭 数据库过早,然后每次我访问数据库时我都必须再次mysql_connect()

虽然我可以在每次数据库调用之前和之后调用 mysql_connect()mysql_close(),但我不会 确定这是否是标准的处理方式。

【问题讨论】:

  • 为什么没有一个类来处理所有数据库交互
  • 使用$_SESSION和MySQL怎么样? This class 可能有用。
  • @quantme,我是新手,不知道 $_SESSION -- 是否比使用 $GLOBALS 存储打开的数据库连接更好?
  • @Ibu -- 我稍后会进入 OO,但是是的,这就是我最终要做的。只是想先学习第一件事,我是php和mysql的菜鸟。
  • 我对$GLOBALS了解不多,只是使用$_SESSION比较安全;至少在我的经验中。如果您想从社区获得更多帮助,请使用您正在使用的代码编辑您的问题。

标签: php mysql-connect


【解决方案1】:

首先,您不需要存储此变量,因为如果您省略 db_connection 参数,所有 mysql_* 函数将使用最后打开的连接。如果您要同时打开多个数据库连接,则只需要存储它。

其次,mysql 连接将在脚本结束时自动关闭。大多数情况下不需要关闭它。

第三,你不应该再使用 mysql_* 了。使用 mysqli_* 或 推荐的 PDO 类。

【讨论】:

  • 如果要在php中使用字符串转义函数,有时需要将link_id存储在变量中
  • @Brian Patterson 你错了。 mysql_real_escape_string() 不需要连接资源。这是一个可选参数。如果省略参数,则使用最后打开的 mysql 连接。
  • +1'ed -> 这个。是。它。另外,避免对变量使用全局命名空间。这是一种非常糟糕的编程习惯。
【解决方案2】:

不要每次都关闭数据库。您甚至可以选择根本不关闭连接,因为它将在脚本结束时隐式关闭。

如果您希望能够随时连接,您可以为此编写一个函数:

$_connection = false;
function getConnection()
{
  global $_connection;
  if (!$_connection)
    $_connection = mysql_connect( ... );
  return $_connection;
}

function closeConnection()
{
  global $_connection;
  if ($_connection)
    mysql_close($_connection);
  $_connection = false;
}

当然,将连接嵌入到实际的类中会更好,但这会让您开始解决问题。婴儿步。 :)

【讨论】:

    【解决方案3】:

    这是来自我的 db 课程,但我认为这应该对您有所帮助。只需在第一次需要时打开并在页面末尾关闭。或者,像我一样,在你的 db 类的构造函数中连接,在析构函数中关闭。

    //Constructor Code
    $this->link_id = mysql_connect($this->db_host, $this->db_user, $this->db_pass);
    
    
    //Destructor Code
    @mysql_close($this->link_id);
    

    这是我使用的两种方法的示例。

        //forward php4 to constructor
        function db_class() {
    
            return $this->__construct();
        }
    
        //constructor
        function __construct() {
    
            register_shutdown_function(array(&$this, "__destruct"));
    
            $this->link_id = mysql_connect($this->db_host, $this->db_user, $this->db_pass);
            mysql_select_db($this->db_name, $this->link_id);
    
    }
        //destructor
        function __destruct() {
    
    
            @mysql_close($this->link_id);
    
        }
    

    【讨论】:

      【解决方案4】:

      我通常按页面而不是按查询进行数据库连接调用。因此,我在需要连接的每个文件的顶部包含了用于连接数据库的文件:

      require('db_connect.php');
      

      在我在页面上完成任何需要连接的操作后关闭它。您应该做什么取决于您的需求,但是,从这个意义上说,这取决于。

      【讨论】:

      • 谢谢老兄,我将按照您的建议进行每页连接。在我从书中得到的示例 php/mysql 代码中的 index.php 的底部是对 mysql_close($db_ServerVal) 的调用。我终于意识到阅读 index.php 显示我的表单的所有 cmets 然后超出范围 - 即。 mysql_close() 被调用,但我的表单仍然可见。当我单击表单上的“提交”并重新输入代码时——index.php 早已消失,$db_ServerVal 为空。那花了我5个小时。伙计们,非常谦虚。我正在阅读您所有的 cmets,我都喜欢它们,谢谢,我学到了很多东西。
      • 这比使用全局变量要好得多。不过,我仍然可以添加一些细节。一方面, require 和 include 调用不需要括号,因为它们是语言结构。此外, require_once 会更好一些,因为如果您曾经在一个脚本中有一个同时调用 require 的脚本,这将是一个显示停止器。那么上面的行现在变成了require_once 'dbconnect.php'; 最后一个细节,如果你不希望脚本在连接不可用的情况下硬死 -> 例如给用户错误消息,更好地使用包含。 require 抛出一个致命错误,include 抛出一个警告。
      【解决方案5】:

      您可以将连接对象存储在全局变量中并通过 $GLOBALS 访问它。请注意,除非您使用持久连接(如果这样做,您应该知道自己在做什么),否则当您的 PHP 脚本结束时,数据库连接将自动关闭。

      【讨论】:

      • 虽然您确实回答了操作员的问题,但使用全局变量并不是他应该学习在脚本中实现的方式。
      • @stef 嘿,我非常怀疑你是想帮忙——我只想指出我是新来的。想想团队中的一个新人,我们正在努力帮助他——我就是那个新人。到目前为止,您没有阅读我之前所说的内容——我正在按照我的速度学习这一点,而不是您的,我知道邪恶的全局变量,我 51 岁并且在 1970 年代编写代码。所以休息吧,年轻人!提前感谢您的耐心等待,从您的个人资料中可以清楚地看出您的知识渊博。
      • @wantTheBest - 我很快就到了 44 岁,离你的 51 岁不远了。被称为“年轻人”确实感觉很好!至于使用全局变量,是的,我只是想帮忙。使用全局变量总是有另一种选择,如果你真的需要一个全局变量,我认为总是值得改变设计以避免这种需要。嘿!我希望您在 SO 社区受到热烈欢迎,这只是我的咆哮,并在这件事上给了我 强烈主张 2 美分。我提出的建议就是:建议。你用它做你想做的朋友! ;o)
      • @wantTheBest -> 又回到了post this just for you buddy,旧的但如此相关。
      • @stef 我已经习惯于编写非 web 应用程序,对象的持久性仅在为方法内对象实例调用析构函数时结束,但在头文件范围内,实例仍然存在直到 .EXE 被用户关闭。我缺乏的是网页和服务器端脚本进入范围然后迅速超出范围的观点。因此,我会将每个页面、每个 .php 文件等视为一个 .EXE,它会快速执行和终止,然后破坏所有内容并关闭所有数据库连接,因此如果发生重新发布,任何需要的对象(如数据库连接)都必须是重新实例化。
      猜你喜欢
      • 2012-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-24
      • 2014-04-03
      • 1970-01-01
      • 2018-08-12
      相关资源
      最近更新 更多