2016-04-14 51 views
0

我是PHP新手,因此請和我一起裸露。我到處搜索這個問題的解決方案,但沒有對它進行排序。在堆棧中有幾個類似的問題,但我很困惑我是否正確實施解決方案,這是另一個問題,或者如果我錯了。我想知道是否有任何有關問題的見解。我需要從另一個類訪問數據庫,但我得到錯誤致命錯誤:調用第40行上的demo.php中的非對象的成員函數prepare()。這裏是我的db_connect.php用class來包裝數據庫訪問的問題PHP GAE

<?php 



class DbConnect { 

    function __construct() {   
    } 

    /** 
    * Establishing database connection 
    * @return database connection handler 
    */ 
    function connect() { 
     $db = null; 
     if (isset($_SERVER['SERVER_SOFTWARE']) && 
      strpos($_SERVER['SERVER_SOFTWARE'], 'Google App Engine') !== false) { 
      // Connect from App Engine. 
      try{ 
      $db = new pdo('mysql:unix_socket=/cloudsql/projectid:instance;dbname=guestbook', 'root', 'password'); 
      }catch(PDOException $ex) { 
      die('Unable to connect.'); 
      } 
     } 
     $db = null; 
    } 
} 
?> 

這裏就是錯誤是從demo.php

<?php 

class Demo { 

    private $conn; 

    function __construct() { 
     require_once dirname(__FILE__) . '/include/db_connect.php'; 
     // opening db connection 
     $db = new DbConnect(); 
     $this->conn = $db->connect(); 
    } 

    public function getAllChatRooms() { 
     $stmt = $this->conn->prepare("SELECT * FROM chat_rooms"); 
     $stmt->execute(); 
     $tasks = $stmt->get_result(); 
     $stmt->close(); 
     return $tasks; 
    } 

    public function getAllUsers() { 
     $stmt = $this->conn->prepare("SELECT * FROM users"); 
     $stmt->execute(); 
     $tasks = $stmt->get_result(); 
     $stmt->close(); 
     return $tasks; 
    } 

    public function getDemoUser() { 
     $name = 'Joe Bloggs'; 
     $email = '[email protected]'; 
*Error  
40 ->* $stmt = $this->conn->prepare("SELECT user_id from users WHERE email = ?"); 
     $stmt->bind_param("s", $email); 
     $stmt->execute(); 
     $stmt->store_result(); 
     $num_rows = $stmt->num_rows; 
     if ($num_rows > 0) { 
      $stmt->bind_result($user_id); 
      $stmt->fetch(); 
      return $user_id; 
      } else { 
      $stmt = $this->conn->prepare("INSERT INTO users(name, email) values(?, ?)"); 
      $stmt->bind_param("ss", $name, $email); 
      $result = $stmt->execute(); 
      $user_id = $stmt->insert_id; 
      $stmt->close(); 
      return $user_id; 
     } 
    } 
} 
?> 

未來在__construct我沒有獲得數據庫實例的功能並將其分配給$ conn?我不明白這是否正確。我圍繞DBConnect進行了更改,以查看mysqli是否可以工作而不是pdo,但是這並沒有解決任何問題。如果有人能夠對此有所瞭解,我將非常感激。

編輯:

我將改述我在找什麼。我想知道是否有辦法將mysqli連接到帶有SQL的Google App Engine,這樣可以避免pdo問題。只有在連接到數據庫時纔會使用pdo,如果我可以將其更改爲mysqli,那麼我應該能夠與demo.php進行通信,而無需更改pdo不支持的方法,如bind_param。正確嗎?如果有一個簡單的方法來更新demo.php與pdo一起工作,我同樣很樂意這樣做,但我不知道pdo支持哪些方法,並且我不瞭解整個php。從編碼的角度來看,最簡單的選擇是什麼?是否有可能在GAE中使用mysqli,還是必須是pdo?如果GAE不支持mysqli,有人可以告訴我如何去更新demo.php中的函數嗎?

謝謝。

+0

一個簡單的谷歌搜索是足夠地發現: 不同的連接接口工作 谷歌Cloud SQL的使用我共同的連接支持從PHP連接包括PDO_MySQL,mysqli和MySQL API。默認情況下,App Engine中,開發(本地)或生產(部署的App Engine應用程序)中啓用PDO_MySQL,mysqli和MySQL API。 – peuh

+1

關於你的編輯,檢查http://php.net/manual/en/mysqli.construct.php你只需要改變你的連接方法的代碼,這樣,而不是使用它使用MySQL的PDO ... – peuh

+0

我打上你的答案正確的,謝謝 –

回答

1

你的數據庫連接:: connect()函數不返回創建的PDO對象。所以基本上,當你做:

$this->conn = $db->connect(); 

你正在做的:

$this->conn = null; 

要解決此問題,在您的連接功能的末尾添加一個return語句:

return $db; 
+0

我嘗試了你的建議,它給了我一個新的錯誤致命錯誤:調用未定義的方法PDOStatement :: bind_param()。據我所知這是因爲bind_param不是pdo的一種方法。那麼是否有辦法將pdo更改爲mysqli,以便我不必更改demo.php的大部分內容?我對PHP很新,這似乎是最簡單的選擇,但我還沒有想出如何做到這一點。 –

+0

@keithmilton由於此問題解決了您所問的問題,請您將答案標記爲已接受? – peuh

+0

關於這個新問題,如果您檢查PdoStatement doc(http://php.net/manual/en/pdostatement.bindparam.php),您會看到該函數是bindParam()而不是bind_param() – peuh