我是一名接管过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); ?>
答案 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);