2013-12-07 23 views
3

我試圖使用默認值mysqli constructor,這證明是連接到一個數據庫:使用默認值mysqli的構造失敗

  • 主機= ini_get("mysqli.default_host")
  • 用戶名= ini_get("mysqli.default_user")
  • passwd = ini_get("mysqli.default_pw")

我想使用默認值的原因是我可以在配置文件中的證書inst通過我的代碼分散。但是,當我沒有傳遞值時,連接成功,但隨後的查詢失敗並且沒有錯誤。

$db = new mysqli(); 
if ($db->connect_errno) die("Connect failed: " . $db->connect_error); 
if ($rs = $db->query("select user();") or die("Query failed: " . $db->error)) { 
    $row = $rs->fetch_row(); 
    echo $row[0]; 
    $rs->close(); 
} 

此輸出:

查詢失敗:

這意味着成功的連接,但是任何查詢因錯誤而失敗。 (其他行動,諸如select_db,不能以同樣的方式。)

有趣的是,我可以通過改變第一線進行修復:

$db = new mysqli(ini_get("mysqli.default_host"), 
       ini_get("mysqli.default_user"), 
       ini_get("mysqli.default_pw")); 

...但我寧願沒有在任何地方輸入默認值我需要一個數據庫連接。我究竟做錯了什麼?有沒有辦法使用mysqli構造函數沒有參數?

回答

3

在寫這個問題,我正好向下滾動文檔頁面,並注意以下幾點:

注:調用無參數的構造是一樣的調用mysqli_init()

仰望mysqli_init documentation,它說:

注:任何後續調用任何mysqli的功能(除了mysqli_options())會失敗,直到mysqli_real_connect()被調用。

因此,解決方法是在第一線的改變:

$db = new mysqli(); 

要:

$db = new mysqli(); 
$db->real_connect(); 

我本來期望在場景,mysqli_error會返回類似「不連接「而不是空字符串。這有點違反直覺,但至少它有點文件記錄。