在出现null错误时获取对成员函数prepare()的调用


getting Call to a member function prepare() on null error

我正在使用一个数据库对象来运行一个准备好的语句,但得到了以下错误:

Fatal error: Call to a member function prepare() on null in /var/www/html/rsvp/lib/classes.php on line 43

我使用的数据库对象是(这只是其中的一部分,但包括所有相关方法):

class DatabaseConnection {
  private $host = DB_HOST;
  private $user = DB_USER;
  private $pass = DB_PASS;
  private $dbname = DB_NAME;
  protected $dbConnect;
  private $stmt = NULL;
  private $result;
  public function __construct() {
    // Set DSN
    $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;
    // Set options
    $options = array(
        PDO::ATTR_PERSISTENT        => true,
        PDO::ATTR_ERRMODE           => PDO::ERRMODE_WARNING,
        PDO::ATTR_EMULATE_PREPARES  => false
    );
    // Create a new PDO instanace
    try{
        $this->dbConnect = new PDO($dsn, $this->user, $this->pass, $options);
    }
    // Catch any errors
    catch(PDOException $e) {
        $this->error = $e->getMessage();
    }
  }
  //Prepare statement
  public function preparedQuery($query) {
    //Unset previous stmt
    unset($this->stmt);
    //Set up new prepared statment
    $this->stmt = $this->dbConnect->prepare($query);
  }
  //Bind paramaters
  public function bind($param, $value, $type = null) {
    if (is_null($type)) {
        switch (true) {
            case is_int($value):
                $type = PDO::PARAM_INT;
                break;
            case is_bool($value):
                $type = PDO::PARAM_BOOL;
                break;
            case is_null($value):
                $type = PDO::PARAM_NULL;
                break;
            default:
                $type = PDO::PARAM_STR;
        }
    }
    $this->stmt->bindValue($param, $value, $type);
  }
  //Execute statement
  public function execute() {
    return $this->stmt->execute();
  }

我用来运行查询的方法是:

class SMS extends DatabaseConnection {
  public function __construct() {
  }
  public function createSMSSession($phoneNumber) {
    //Add to sms table
    $this->preparedQuery("INSERT INTO sms (phone_number, step) VALUES (:phonenumber, :step)");
    $this->bind(':phonenumber', $phoneNumber);
    $this->bind(':step', 1);
    $this->execute();    
  }
}

最后,我用来调用方法的代码:

require_once('lib/config.php');
require_once('lib/classes.php');
// Sender's phone numer
$from_number = $_REQUEST['From'];
// Receiver's phone number - Plivo number
$to_number = $_REQUEST["To"];
// The SMS text message which was received
$text = $_REQUEST["Text"];
$sms = new SMS();
$sms->createSMSSession($from_number);

数据库凭据在config.php文件中定义。我已经证实了这方面的一切都是正确的。我有多个方法使用同一个数据库对象,没有任何错误。

如果您实际上没有在SMS::__constuct声明中执行任何操作,请删除该声明。除非它调用DatabaseConnection::__construct函数,否则就没有PDO句柄。