在PostgreSQL中的null上调用成员函数prepare()

时间:2019-01-31 20:34:08

标签: php postgresql prepared-statement

文件db.php:

<?php
class Database
{
    private $host;
    private $port;
    private $dbname;
    private $user;
    private $password;
    protected $conn;

    public function __construct($host, $port, $dbname, $user, $password) {
        $this->host = $host;
        $this->port = $port;
        $this->dbname = $dbname;
        $this->user = $user;
        $this->password = $password;
    }

    function error($error, $id)
    {
        echo $error.", ". $id;
        die;
    }

    public function connect()
    {
        $result = $this->conn = new PDO("pgsql:host=$this->host port=$this->port dbname=$this->dbname user=$this->user password=$this->password");
    }
}

和result.php:

<?php

require "db.php";

    class Result extends Database
    {
        private $save;
        public function __construct() {
            parent::__construct("127.0.0.1", 5432, "blue", "postgres", "postgres");
        }

        public function validate()
        {
            $this->connect();
            $sql = 'INSERT INTO test (name, surname, age, active) VALUES (:name, :surname, :age, :active)';
            $stmt = $this->conn->prepare($sql);
            $stmt->bindValue(':name', "Magdalena");
            $stmt->bindValue(':surname', "Blizna");
            $stmt->bindValue(':age', 29);
            $stmt->bindValue(':active', false);
            $stmt->execute();

    return $stmt;

        }
    }

$save = new Result();
$save->validate();

我尝试将元素插入数据库,但是php返回错误:

  

致命错误:未捕获错误:调用成员函数prepare()   空

连接到数据库文件是可以的。为了连接数据库,我使用了$conn中的变量db.php

我编辑验证功能。

2 个答案:

答案 0 :(得分:0)

函数pg_connect()不会像new PDO(...)那样返回对象。它只是返回一个资源(某种形式的ID)。因此,您无法在其上调用函数prepare()。相反,您必须像这样使用pg_prepare()

    $connection = pg_connect("my parameters");
    $statement = pg_prepare($connection, "some sql $1 $2");
    $result = pg_execute($connection, $statement, ["param1", "param2"]);

答案 1 :(得分:0)

您要达到什么目标?您要解决哪个问题?

我看到了数据库类,它对PDO来说似乎是某种“门面”。

  • 为什么现在需要这种外观,而不是直接使用PDO?
  • 为什么要在Result中继承Database类?我不同意结果“ IS A”数据库:)

如果您只想使用准备好的语句,请尝试首先直接使用PDO。 OOP很好,但是起初很难。您需要明确定义的目的才能编写自己的类:)