2011-06-07 168 views
27

我正在爲我的一個應用程序編寫安裝程序,我希望能夠測試一些默認的數據庫設置。PDO連接測試

這可能使用PDO來測試有效和無效的數據庫連接嗎?

我有以下代碼:

try{ 
      $dbh = new pdo('mysql:host=127.0.0.1:3308;dbname=axpdb','admin','1234'); 
      die(json_encode(array('outcome' => true))); 
     }catch(PDOException $ex){ 
      die(json_encode(array(
       'outcome' => false, 
       'message' => 'Unable to connect' 
      ))); 
     } 

我遇到的問題是,劇本改掉連接,直到60秒的腳本執行時間耗盡,而不是說,它不能連接到數據庫中。

感謝

+0

$胸徑=新的'PDO'?一切看起來都很好。 – 2011-06-07 09:58:27

+0

小寫字母pdo與PDO的作用相同,如果我在腳本中正確輸入了正確的細節,但是我試圖檢測到無效設置 – 2011-06-07 10:01:00

+0

您嘗試添加選項PDO :: ATTR_ERRMODE => PDO :: ERRMODE_EXCEPTION ? – 2011-06-07 10:03:50

回答

35

您需要設置錯誤模式時連接到數據庫:

try{ 
    $dbh = new pdo('mysql:host=127.0.0.1:3308;dbname=axpdb', 
        'admin', 
        '1234', 
        array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); 
    die(json_encode(array('outcome' => true))); 
} 
catch(PDOException $ex){ 
    die(json_encode(array('outcome' => false, 'message' => 'Unable to connect'))); 
} 

更多相關信息請參閱以下鏈接:

Using MySQL with PDO

Errors and error handling

+0

'與'ini_set('display_errors ','off');'工作正常。謝謝 – 2011-06-07 10:38:44

+4

@Themodem:你爲什麼需要關閉顯示錯誤?你已經發現了異常 - 它已被處理。 – mpen 2013-04-06 17:20:18

+0

@Mark,因爲'PDO :: ERRMODE_EXCEPTION'的實現中斷(PHP5.3.28),並且在某些情況下(例如,我的主機上的「數據庫服務器未運行」)不起作用。因此,不幸的是,這種解決方案還不夠,因爲Themodem在他的解決方法中注意到了這一點。 *(嘿,順便說一下,只是把'@new pdo()',不要蠻力'display_errors'爲'off')* – 2014-04-25 08:22:12

9

As @Sascha Ga lley已經提到你應該將錯誤模式設置爲異常模式。但是,您還應該設置PDO::ATTR_TIMEOUT屬性以防止在某些情況下長時間等待響應。

雖然文檔中說這個屬性的行爲是依賴於驅動程序的,但在MySQL的情況下,這是一個連接超時。你不會找到它documentation什麼,但這裏是從驅動程序的源代碼中的一小段:

long connect_timeout = pdo_attr_lval(driver_options, PDO_ATTR_TIMEOUT, 30 TSRMLS_CC); 
+0

非常棒,就是我之後的 – 2011-06-07 10:40:15

2

正如例如可見在this answer(但幾乎沒有任何其他地方,所以我在這裏更加可見)的評論中,「經典」PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION解決方案並不總是工作

執行PDO::ERRMODE_EXCEPTIONis broken,所以在某些情況下似乎是「漏水」。

例如:

警告: PDO :: __結構()[PDO .--構建]:無連接可以作出[2002]因爲目標機器積極拒絕 它。 (試圖通過TCP連接://本地主機:3306)在 [...]上線

db.php中的代碼有:

try { 
    $this->pdo = new PDO($cfg['DB'], $cfg['DB_USER'], $cfg['DB_PASS'], 
     array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); 
} catch { 
    echo("Can't open the database."); 
} 

的例外拋出(和cought:我可以看到我的消息)。

所以,作爲一個必要的解決辦法,你需要也把@(讓我們把它叫做「尿布運營商」,在這種情況下)new pdo(...)真正保持它的清潔。

1

在PDO :: ERRMODE_EXCEPTION結尾有一個缺失的關閉括號。

應該是:

$this->pdo = new PDO($cfg['DB'], $cfg['DB_USER'], $cfg['DB_PASS'], 
    array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); 
+0

這應該是一個編輯https://stackoverflow.com/a/23288361/956397 – PiTheNumber 2018-03-09 10:53:10