2016-04-14 7 views
0

私はPHPを初めて使いました。私はこの問題の解決策をどこからでも探し求めましたが、何もそれを分類していません。このようないくつかの質問がスタックに似ていますが、私はソリューションを適切に実装しているかどうか混乱しています。それは別の問題です。私は、問題の洞察があるかどうかを知りたい。別のクラスのデータベースにアクセスする必要がありますが、エラーが発生しました。致命的なエラー:40行目のdemo.phpにある非オブジェクトのメンバー関数prepare()を呼び出してください。エラーは、私はデータベースのインスタンスを取得していないです__construct機能でdemo.phpデータベースアクセスをラップするクラスに関する問題PHP GAE

<?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; 
     } 
    } 
} 
?> 

でから来ると$に代入されるのはここに私db_connect.php

<?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; 
    } 
} 
?> 

はこちらですコネクト?これが正しいかどうかわかりません。 mysqliがpdoの代わりに動作するかどうかを確認するためにDBConnectを変更しましたが、何も修正されませんでした。誰かがこれについて少しの光を放つことができるなら、私は非常に感謝します。

編集:

私は私が探していますどのような言い換えます。私はpdoの問題を回避できるように、SQLでmysqliをGoogle App Engineに接続する方法があるかどうかを知りたいと思います。 pdoはデータベースへの接続時にのみ使用され、mysqliに変更することができれば、pdoでサポートされていないbind_paramなどのメソッドを変更することなくdemo.phpと通信できるはずです。正しい?もしpdoで動作するようdemo.phpを更新する簡単な方法があれば、私はそれを行うことも同様ですが、pdoがどのようなメソッドをサポートしているのかわからず、PHP全体を知りません。コーディングの観点からは、最も簡単なオプションは何ですか?mysqliをGAEで使用することは可能ですか、それともpdoでなければなりませんか? GAEがmysqliをサポートしていない場合、誰かがdemo.phpの関数を更新する方法を教えてください。

ありがとうございました。

+0

シンプルグーグル:

$this->conn = null; 

はあなたのconnect関数の最後にreturn文を追加し、問題を解決するには検索ではこれで十分でした: 異なる接続インターフェイスでの作業 Google Cloud SQLは、共通接続を使用するPHPからの接続をサポートしていますPDO_MySQL、mysqli、およびMySQL APIなど、さまざまな種類があります。 PDO_MySQL、mysqli、およびMySQL APIは、App Engine、開発環境(ローカル)、または本番環境(デプロイ済みApp Engineアプリケーション)でデフォルトで有効になっています。 – peuh

+1

あなたの編集に関しては、http://php.net/manual/en/mysqli.construct.phpをチェックしてください。pdoを使用する代わりにmysqlを使用する代わりにconnectメソッドのコードを変更するだけです... – peuh

+0

私はあなたの答えをマークしました正解、ありがとうございます –

答えて

1

あなたのDbConnect :: connect()関数は、作成されたpdoオブジェクトを返しません。だから、基本的に、あなたは何時に:

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

あなたがやっている:

return $db; 
+0

私はあなたが提案したことを試してみて、それは私に新しいエラーを与えます。致命的なエラー:未定義のメソッドPDOStatement :: bind_param()を呼び出します。私が知っている限り、これはbind_paramがpdoのメソッドではないからです。では、pdoをmysqliに変更して、demo.phpの多くを変更する必要はありませんか?私は非常にPHPに新しいです、これは最も簡単なオプションのように思えるが、私はこれを行う方法を考え出していない。 –

+0

@keithmiltonこれがあなたが尋ねていた問題を修正したので、回答を受け入れたとマークしてください。 – peuh

+0

この新しい問題については、PdoStatementドキュメント(http://php.net/manual/en/pdostatement.bindparam.php)をチェックすると、その関数がbind_param()ではなくbindParam()であることがわかります – peuh

関連する問題