2016-04-14 95 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