2013-06-03 66 views
4

我使用此函數在需要時連接到我的MySQL數據庫,並且還可以在同一個php腳本中重新使用相同的連接對象進行任何進一步的查詢。重用數據庫連接對象

function cnn() { 
    static $pdo; 
    if(!isset($pdo)) { 
     try { 
      $pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASS); 
      $pdo->setAttribute(PDO::ATTR_TIMEOUT, 30); 
      $pdo->setAttribute(PDO::ATTR_PERSISTENT, true); 
      $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
      $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ); 
      return $pdo; 
     } catch(PDOException $e) { 
      http_response_code(503); 
      echo $e->getCode.': '.$e->getMessage(); 
      die(); //or whatever error handler you use 
     } 
    } else { 
     return $pdo; 
    } 
} 

首先查詢(創建對象)

echo cnn()->query('SELECT firstname FROM user WHERE id=4;')->fetch(PDO::FETCH_COLUMN) 

第二個查詢(對象重複使用)

echo cnn()->query('SELECT title FROM news WHERE id=516;')->fetch(PDO::FETCH_COLUMN) 

你同意這種做法?你認爲它可以優化嗎?感謝您的意見。

+0

如果您需要關閉該連接,該怎麼辦?你想如何確定它是否處於活動狀態(未關閉)? – BlitZ

+0

你希望它有多優化?根據真正的小優化,你應該將它存儲在一個臨時變量中,它將是一個'MOVE'組件,而不是'CALL'和'BRANCH',但是,嘿,就像一個μs。 = D – Jerska

+0

@CORRUPT通常,PHP會在腳本結束時關閉連接。在這種情況下,我使用持久性連接(第6行),這意味着連接在腳本結束時不會關閉,但在另一個腳本使用相同憑據請求連接時會被緩存和重新使用。不過,我想如果添加一個參數,如果爲true,則將$ pdo設置爲null即可。 – andufo

回答

3

我同意這種方法,但很多人會告訴你,這種「單身」方法不好,不好。

但是,我不同意你的實現。它應該是:

function cnn() { 
    static $pdo; 
    if(!$pdo) { 
     $conf = array(PDO::ATTR_TIMEOUT => 30, 
        PDO::ATTR_PERSISTENT => true, 
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ, 
      ); 
     $dsn = 'mysql:host='.DB_HOST.';dbname='.DB_NAME; 
     $pdo = new PDO($dsn, DB_USER, DB_PASS, $conf); 
    } 
    return $pdo; 
} 

此外,它看起來明智的移動處理程序代碼插入處理

function my_exceptionHandler($exception) { 
    http_response_code(503); 
    if (ini_get('display_errors')) { 
     echo $e->getMessage().$e->getTrace(); 
    } else { 
     log_error($e->getMessage().$e->getTrace()); 
    } 
    die(); //or whatever error handler you use 
} 
set_exception_handler("my_exceptionHandler"); 

而且,我會延長(當然的沒有無條件地附和錯誤!)它接受一個參數來使多個連接成爲可能。

+0

感謝您的代碼。但是有一個問題:做幾個連接可能有什麼好處? (假設只有一個分貝) – andufo

+0

假設你有幾個分貝連接。 –