2013-05-20 85 views
1

我想通過一個mysqli數據庫連接到php類。我迄今爲止(削減爲簡單起見)的代碼如下:無法通過mysqli連接到類

db.php中

$db_host = 'localhost'; 
$db_name = 'dbname'; 
$db_user = 'username'; 
$db_password = 'password'; 

$db = array('db_host'=>$db_host, 
    'db_name'=>$db_name, 
    'db_user'=>$db_user, 
    'db_password'=>$db_password); 

$dbCon = new mysqli($db['db_host'], 
    $db['db_user'], 
    $db['db_password'], 
    $db['db_name']); 

if (mysqli_connect_errno()) 
{ 
    die(mysqli_connect_error()); //There was an error. Print it out and die 
} 

的index.php

<?php 
    require_once($_SERVER["DOCUMENT_ROOT"] . "/db.php"); 

    $sql = "SELECT id FROM usr_clients"; 
    $stmt = $dbCon->prepare($sql); 
    if ($stmt) 
    { 
     $stmt->execute(); 
     $stmt->bind_result($id); 
     while($stmt->fetch()) 
     { 
      $cl = new Client($id, $dbCon); 
      $cl->doIt(); 
     } 
     $stmt->close(); 
    } 
?> 

client.php

<?php 
    Class Client 
    { 
     private $con; 
     public static $clientCount = 0; 

     public function __construct($id, $con) 
     { 
      $this->con = $con; 

      $sql = "SELECT id FROM usr_clients WHERE id = $id"; 
      $stmt = $this->con->prepare($sql); 

      if ($stmt) 
      { 
       echo "it worked!"; 
      } 
      else 
      { 
       echo "it failed"; 
      } 
     } 
} 
?> 

現在,index.php頁面成功識別db.php中聲明的數據庫連接,並返回所有客戶端的列表。然後循環遍歷每個客戶端,並創建一個「客戶端」對象,並將其傳遞給數據庫連接。

問題似乎在這裏開始。在客戶端類中,數據庫連接無法識別。我在網頁上發現有多個錯誤,說「失敗」。在日誌中,有一條關於在非對象上調用prepare()的行。

任何人都可以解釋爲什麼連接在index.php工作,但不是在客戶端類?

感謝

+0

您是否嘗試過在您的數據庫方法中實際提供錯誤處理邏輯以查看您正在收到的失敗消息? –

+0

我已經嘗試了好幾次,雖然大部分時候我都在嘗試使用單例模式。我得到的唯一的失敗消息是關於非對象的$ this-> con> prepare()。 – Typhoon101

回答

1

你的主要問題是假設

假設沒有連接通過,由間接結果來判斷。

但是程序員應該總是在邏輯上正確的推理。

談到連接?驗證連接。 var_dump($con)在構造函數中。 var_dump($this->con)的方法。如果失敗 - 只有現在你可以責怪連接並開始解決方案。
如果沒有 - 沒有理由尋找另一個連接傳遞方法。現在是時候找到真正的問題了。

如果你的查詢失敗,你必須使用$this->con->error來問問mysql,發生了什麼,因爲這個函數將爲你提供比簡單的「失敗」更多有用的信息。我在這裏已經解釋了正確的用法:https://stackoverflow.com/a/15447204/285587

+0

你說得對。連接WAS被傳遞給該類。我做了各種錯誤處理,除了最明顯的例外。 $這個 - > CON組>錯誤。 (嘿,已經很晚了,我累了,這是我的藉口,我堅持下去:)最終,問題是因爲客戶端類在index.php頁面完成之前正在運行一個查詢來完成它的mysqli位。只需插入$ stmt-> store_result();到index.php做了訣竅。謝謝您的幫助。 – Typhoon101