类中的连接变量在关闭连接时会生成错误

时间:2009-11-13 06:32:16

标签: php

下面是我的数据库连接类。问题是,当我尝试从我的代码访问CloseConnection函数时,它会给出错误:“Unknown MySQL localhost”。我通过其他代码文件使用“dbconnection :: CloseConnection”。它成功打开连接,但在“$ conn”中出错。

final class dbconnection 
{

    private $conn;
        //Opens connection for a MySQL DB
        public static function OpenConnection()
        {
            require("../Config/dbconfig.php");
            $conn = mysql_connect(DB_HOST,DB_USER,DB_PASSWORD);

            mysql_select_db('MyDB');  

        }

        //Closes connection for a MySQL DB
        public static function CloseConnection()
        {
            mysql_close($conn);

        }
}

下面是我访问上述函数的另一个PHP文件中的方法:

public static function InsertRecord($inQuery)
{
     dbconnection::OpenConnection();
     $resultSet = mysql_query($inQuery);
     dbconnection::CloseConnection();
     return $resultSet;     
}

当我删除行“dbconnection :: CloseConnection()”时,它工作正常。我还想知道在DB任务完成后立即关闭连接是否是一个好习惯,还是应该保持打开直到用户关闭浏览器?

1 个答案:

答案 0 :(得分:2)

尝试:

class dbconnection  {
  private static $conn;

  public static function OpenConnection() {
    require("../Config/dbconfig.php");
    self::$conn = mysql_connect(DB_HOST,DB_USER,DB_PASSWORD);
    mysql_select_db('MyDB');  
  }

  public static function CloseConnection() {
    mysql_close(self::$conn);
  }
}

你正在做的是尝试访问成员变量$conn,但你做错了,所以你只是创建一个新的(本地)变量来使用。这在open上无关紧要(引用被简单地丢弃)但是在关闭时你不再处理资源引用了。

其次,您的函数是静态的,但您的成员变量不是。这些是用于访问成员变量的两种方法:

class A {
  private $a;
  private static $b;

  public static function foo() {
    $this->a = 3; // instance member
    self::$b = 4; // static member
  }
}
关于最后一个函数的

编辑,当您删除对CloseConnection()的调用时它会起作用,因为它不再尝试通过局部变量$conn访问数据库连接(这会导致错误)。

立即关闭数据库连接并不是一个好习惯。 PHP中最常见的做法是在脚本顶部打开一个连接,然后不再执行任何操作。当脚本退出时,它将关闭。有些人按需打开连接,这意味着在需要之前不会尝试创建连接。这是可接受的优化(从不增加不必要的复杂性的角度来看)。通常,连接永远不会被明确关闭。当脚本结束时,它将被隐式关闭。

长期存在的脚本可能希望采用不同的方法,因此它们不会在不必要的情况下长时间保持打开的连接。

您可能在某些时候想要使用持久连接。

上述方法足够简单,足以满足一些非常大的网站的需求。作为一般规则,不要尝试优化这些内容并引入不必要的复杂性,直到您确实遇到需要执行某些操作的问题。