[英]Closing my mySQL connection
我是一位接管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); ?>
好的,我將其發布為答案,因為我認為這兩種方法中的一種(可能同時適用)對您有幫助。
首先: 您不需要手動關閉MySQL連接 。 除非您對其進行設置以使其持久存在,否則它們將自動關閉。 除非您確定其他所有問題都不是解決方案,否則我將避免這樣做。
另外,我將切換為使用預處理語句 。 它更加安全,並且可以面向未來。 與mysqli相比,我更喜歡PHP的PDO,但這取決於您。
如果您想查看一個簡單的PDO對象的示例,以從創建准備好的語句和連接以及獲得結果中去除很多內容 ,那么可以看看我的自制解決方案 。
第二:“系統錯誤111”是MySQL錯誤。 從我閱讀的內容來看,當您在同一台服務器上使用PHP和MySQL時,通常會發生此錯誤,但告訴PHP通過IP地址連接到MySQL。 將$host
變量切換為'localhost'
。 這很可能會解決該錯誤。
這里的問題是您正在調用mysql_close而不指定有效的mysql連接資源對象。 相反,您正在嘗試關閉DatabaseManager對象的實例。
您可能要運行mysql_close(DatabaseManager :: connection); 這是DatabaseManager存儲資源對象的位置。
另外,我個人建議您學習PDO或使用mysqli驅動程序。 在將來的PHP版本中,內置的mysql函數將移至E_DEPRECATED
嘗試實施__destrcut
public function __destruct()
{
mysql_close(self::$connection)
}
然后只需使用unset($dm);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.