调用成员函数prepare()on null error

时间:2016-03-29 03:31:40

标签: php pdo

我正在使用数据库对象来运行预准备语句,但收到此错误:

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文件中定义。我已经确认一切都是正确的。我有多个方法使用相同的Database对象,没有错误。

1 个答案:

答案 0 :(得分:0)

如果您没有在那里做任何事情,请删除整个SMS::__constuct声明。除非它调用DatabaseConnection::__construct函数,否则您将无法使用PDO句柄。