2012-04-21 17 views
1

我得到使用數據庫功能我的PHP網頁以下錯誤:mysql_real_escape_string與單身人士數據庫在PHP?

警告:mysql_real_escape_string() [function.mysql實時逃逸字符串]:拒絕訪問用戶 「阿帕奇」 @」本地主機'

我知道我必須有一個工作連接到我的數據庫,但這裏是'問題'。連接到我的數據庫類看起來是這樣的:

class Database 
{ 
    private static $instance = null; 
    private static $conn; 

    private function __construct() 
    { 
     try { 
      self::$conn = new mysqli('localhost', 'root', 'user', 'database'); 
     } catch (Exception $ex) { 
      $errorpager = new CustomPageGenerator(); 
      $errorpager->generateErrorPage("Connection to database failed. Please try again later."); 
     } 
    } 

    public static function getInstance() 
    { 
     try { 
      if (self::$instance == null) { 
       self::$instance = new Database(); 
      } 
      return self::$instance; 
     } catch (Exception $ex) { 
      $errorpager = new CustomPageGenerator(); 
      $errorpager->generateErrorPage("Connection to database failed. Please try again later."); 
      return false; 
     } 
    } 

    public function query($sql) 
    { 
     try { 
      return self::$conn->query($sql); 
     } catch (Exception $ex) { 
      $errorpager = new CustomPageGenerator(); 
      $errorpager->generateErrorPage("Connection to database failed. Please try again later."); 
      return false; 
     } 
    } 
} 

正如你所看到的,我使用Singleton模式這一點。但即使我把我的代碼的一開始我打開連接我不斷收到此錯誤

Database::getInstance(); 

。如何正確打開連接以便我可以使用mysql_real_escape_string()函數?

謝謝。

這裏是樂修復

添加此功能可將數據庫類:

public static function getConnection() 
{ 
    self::getInstance(); 
    return self::$conn; 
} 

更換一次單mysql_real_escape_string(與mysqli_real_escape_string(數據庫::的getConnection(),

+0

首先在'mysqli'的函數調用中缺少''',這意味着不會創建與數據庫的連接。當你使用'new mysqli('localhost','root','user','database')連接數據庫時,你會得到任何錯誤;' – vedarthk 2012-04-21 17:24:17

+0

是的,那是因爲我「審查了」我的真實用戶名和密碼,刪除了a)。修復了這個錯誤。 – Matthias 2012-04-21 17:27:24

+0

使用'new mysqli('localhost','root','user','database')連接到數據庫時會出錯嗎? – vedarthk 2012-04-21 17:30:50

回答

2

我認爲問題在於你正在使用mysql_real_escape_string()

來自與mysqli不同的圖書館,也許這就是爲什麼沒有聯繫?

mysql_real_escape_string page in the PHP manual

串mysql_real_escape_string(字符串$ unescaped_string [,資源 $ link_identifier = NULL])

這是第二個參數,$link_identifier定義。

MySQL連接。如果未指定鏈接標識符,則假定由mysql_connect()打開的最後一個鏈接 。如果找不到這樣的鏈接,則會嘗試創建一個,就好像調用mysql_connect()時不帶參數一樣使用 。如果未找到或建立連接,則會生成E_WARNING 級別的錯誤。


可能的,但那種醜陋的解決方案,是在您的數據庫單身的包裝只是添加到real_escape_string方法對你的mysqli實例。

public function escapeString($value){ 
    return $this->conn->real_escape_string($value); 
} 

另一種選擇是使用的mysqli庫的程序版本(雖然我還沒有真正嘗試,看看是否可以混合使用這兩個,但我認爲你可以):mysqli_real_escape_string

+0

有沒有辦法改變我的數據庫類呢?我有幾十個mysql_real_escape_string()函數,但只有一個地方連接到我的數據庫。 – Matthias 2012-04-21 17:43:19

+0

如果您不想刪除所有mysql_real_escape_string函數,則可以嘗試將調用更改爲'mysqli_real_escape_string'。我沒有嘗試過,但可能會有效。只要你的連接在調用之前就建立好了。可能不是每個地方都有mysql_real_escape_string的最佳解決方案。但這可能是一個快速解決方案。 – Gohn67 2012-04-21 17:49:09

+0

要獲得更好的解決方案,可以從mysqli預準備語句中獲取隊列。看看你是否可以重構你的課程來代替它。這樣,您可以在查詢執行期間將轉義字符串功能移入您的類中。 http://php.net/manual/en/mysqli-stmt.bind-param.php – Gohn67 2012-04-21 17:50:29