doukan1258 2016-03-29 03:31
浏览 61
已采纳

在null错误上调用成员函数prepare()

I am using a database object to run a prepared statement but getting this error:

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

The database object I am using is (this is only part of it, but includes all relevant methods):

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();
  }

And the method I'm using to run the query is:

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();    
  }
}

And, finally, the code I'm using to call the method:

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);

The database credentials are defined in the config.php file. I have verified that everything is correct on that end. I have multiple methods using the same Database object with no error.

  • 写回答

1条回答 默认 最新

  • dongxibeng5324 2016-03-29 04:00
    关注

    Remove the whole SMS::__constuct declaration if you're not actually doing anything there. Unless it invokes the DatabaseConnection::__construct function, you won't have a PDO handle.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 目详情-五一模拟赛详情页
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line