3

我做了相当多的研究、故障排除和搜索,试图解决我的问题,但没有运气。所以这里是错误...

在非对象上调用成员函数 prepare()

生成此错误的代码在我的用户身份验证类中,如下所示...

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

dbManager 来自 $db ,我已将其传递到我的类的 __construct 中,如下所示...

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

$db 源自我的 sql 类,我在 index.php 所需的一个“引导”php 文件中需要它。

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 回答