3

私は自分の問題を解決するためにかなりの量の調査、トラブルシューティング、検索を行ってきましたが、運がありませんでした。だからここにエラーがあります...

非オブジェクトのメンバー関数prepare()の呼び出し

このエラーを生成するコードは、次のように私のユーザーAuthクラスにあります...

$this->dbManager->db->prepare('INSERT INTO users (email, password, user_salt, is_admin) VALUES (:email, :password, :user_salt, :is_admin)');

dbManagerは、次のようにクラスの__constructに渡した$dbから取得されます...

public function __construct($db) {
        $this->siteKey = 'notImportant';
        $this->dbManager = $db;
    }

$ dbは、index.phpが必要とする1つの「ブートストラップ」phpファイルで必要な私のsqlクラスに由来します。

bootstrap.phpコードは次のとおりです...

<?php

// Load firePHP library
//require_once('FirePHPCore/FirePHP.class.php');
ob_start();
//$firephp = FirePHP::getInstance(true);

// Load all the classes/libs...
require_once 'classes/sql.class.php';

require_once 'classes/auth.class.php';
$db = sql::getInstance();
session_start();
$auth = new Auth($db);

require_once 'lib/handlepost.php';

そして最後に、sql.class.phpの私のコードは次のとおりです...

class sql {
    public static $db = false;
    private $database_host = '';
    private $database_user = '';
    private $database_pass = '';
    private $database_db = '';

    private function __construct() {
        if (self::$db === false) {
            $this -> connect();
        }
        return self::$db;
    }


    public static function getInstance() {
        if (!self::$db) {
            self::$db = new sql();
        }

        return self::$db;
    } 


    private function connect() {
        $dsn = $this -> database_type . ":dbname=" . $this -> database_db . ";host=" . $this -> database_host;
        try {
            self::$db = new PDO($dsn, $this -> database_user, $this -> database_pass, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''));
            self::$db -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch (PDOException $e) {
            //print_r($e->errorInfo);
            //echo 'Connection failed: ' . $e->getMessage();
        }
    } // End Connect

}

私はPDOを使用するのが初めてで、そもそも混乱を引き起こしています...

私が間違っていることの説明でこれを機能させるための助けは非常にありがたいです。

4

1 に答える 1

4

表示されているエラーは、それ$this->dbManager->dbがオブジェクトではないことを意味します。したがって、そのメソッド()を呼び出そうとするとprepare、エラーが発生します。

編集:申し訳ありませんが、今あなたのエラーが表示されます。

Sql::$dbは静的メンバーですが、プロパティであるかのようにアクセスしています。あなたはそれをすることはできません。sqlクラスの静的メンバーを通常のプロパティに変更することをお勧めします。例:から削除staticpublic static $db = false;ます。self::$dbすべてを次のように置き換え、メソッドを次$this->dbのように書き直します。getInstance

public static function getInstance() {
  if (!self::$instance) {
    self::$instance = new self();
  }
  return self::$instance;
}

したがって、基本的に、エラーはPDOとは特に関係がなく、静的プロパティとメンバープロパティとが関係しています。

Sqlクラスをすべて一緒にスキップしてみることができます。

class ConnectionManager {
  private static $db = false;
  private static $database_host = '';
  private static $database_user = '';
  private static $database_pass = '';
  private static $database_db = '';

  public static function getConnection() {
    if (!self::$db) {
      self::connect();
    }
    return self::$db;
  } 

  private static function connect() {
    $dsn = self::database_type . ":dbname=" . self::database_db . ";host=" . self::database_host;
    try {
      self::$db = new PDO($dsn, self::database_user, self::database_pass, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''));
      self::$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch (PDOException $e) {
      //print_r($e->errorInfo);
      //echo 'Connection failed: ' . $e->getMessage();
    }
  }
}

..。

class Auth {
  public function __construct($db) {
    $this->siteKey = 'notImportant';
    $this->db = $db;
  }

  public function foo() {
    $stmt = $this->db->prepare('INSERT INTO users (email, password, user_salt, is_admin) VALUES (:email, :password, :user_salt, :is_admin)');
    $stmt->execute(...);
  }
}

..。

$db = ConnectionManager::getConnection();
session_start();
$auth = new Auth($db); // <- Here $db is an actual instance of PDO
于 2012-11-13T20:24:34.427 に答える