关闭我的mySQL连接

时间:2011-03-11 21:09:21

标签: php mysql

我是一名接管过PHP项目的.Net开发人员。该项目有一个如下所示的数据库层:

<?php

class DatabaseManager {

    private static $connection;

    const host = "projectname.mysql.hostname.se";
    const database = "databaseName";
    const username = "userName";
    const password = "password";

    public function __construct()
    {

    }

    public function instance($_host = null, $_username = null, $_password = null)
    {
        if(!self::$connection)
        {
            if(!$_host || !$_username || !$_password)
            {
                $host = self::host;
                $username = self::username;
                $password = self::password;         
            }else{
                $host = $_host;
                $username = $_username;
                $password = $_password;
            }
            self::$connection = mysql_connect($host, $username, $password);
            $this->setDatabase();
        }
        return self::$connection;
    }

    public function setDatabase($_database = null)
    {
        if(!$_database)
        {
            $database = self::database;
        }else{
            $database = $_database;
        }
        $connection = $this->instance();
        mysql_select_db($database, $connection) or die(mysql_error());  
    }
} ?>

我写了一个使用这个图层的php文件,但过了一段时间我得到了这些mysql错误,暗示我没有关闭我的连接,我没有。我尝试关闭它们,但知道我得到其他奇怪的错误,如系统错误:111 。非常简单,我的php文件看起来像这样:

<?php
$return = new stdClass();

$uid = '9999999999999';
$return->{"myUid"} = $uid;

$dm = new DatabaseManager();
$dmInstance = $dm->instance();

/* MY CLICKS */
$sql = sprintf("SELECT count(*) as myClicks FROM clicks2011, users2011 WHERE clicks2011.uid = users2011.uid AND users2011.uid = %s AND DATEDIFF(DATE(at), '%s') = 0 AND exclude = 0", mysql_real_escape_string($uid), mysql_real_escape_string($selectedDay));
$result = mysql_query($sql, $dmInstance) or die (mysql_error());
$dbResult = mysql_fetch_row($result);
$return->{"myClicks"} = $dbResult[0];

mysql_close($dmInstance);

echo json_encode($return); ?>

3 个答案:

答案 0 :(得分:2)

好的,我将发布这个作为答案,因为我认为这些事情中的一个(可能两个)都会对你有帮助。

首先:您无需手动关闭MySQL连接。除非你已将它们设置为持续存在,否则它们将自动关闭。除非你确定其他所有问题都不是解决办法,否则我会避免这样做。

此外,我会切换到使用预备语句。它更安全,非常适合未来。我更喜欢PHP的PDO而不是mysqli,但这取决于你。

如果您想查看一个简单PDO对象的示例,以便创建准备好的语句和连接并获得结果,那么您可以查看我的homebrew solution

第二:“系统错误111”是MySQL错误。从我读过的内容来看,当您在同一台服务器上使用PHP和MySQL时,通常会发生此错误,但是告诉PHP通过IP地址连接到MySQL。 将您的$host变量切换为'localhost' 。这可能会解决这个错误。

答案 1 :(得分:1)

这里的问题是你正在调用mysql_close并且没有指定有效的mysql连接资源对象。相反,您尝试关闭DatabaseManager对象的实例。

你可能想运行mysql_close(DatabaseManager :: connection);这是DatabaseManager存储资源对象的位置。

此外,我个人建议您学习PDO或使用mysqli驱动程序。在PHP的未来版本中,内置的mysql函数将被移动到E_DEPRECATED

答案 2 :(得分:1)

尝试实施__destrcut

public function __destruct()
{
    mysql_close(self::$connection)
}

然后只需使用unset($dm);