类 中的 PDO:调用非对象上的成员函数 prepare()

PDO in Classes: Call to a member function prepare() on a non-object

我尝试使用 类 和 PDO,但我不知道如何解决问题。

借助 RunQuery 中的 var_dump($pdo)(在 $pdo = self::$pdo_conn 之后)我得到了值 "null"。任何人都可以帮助我如何在那里获得 pdo 对象吗?还是我完全错了?

index.php

require_once ('assets/socialbar/defines.php');
require_once ('assets/socialbar/mysql/classes/class.socialbar.php');

$ajaxid     = 1;
$getinfo    = "";

$getinfo = Socialbar::getInfo($ajaxid);
print_r($getinfo);

class.socialbar.php

require_once(MYSQL_DIR . 'config/pdo_connection.php');

class Socialbar extends Connection {

    function __construct(){
        parent::__construct();
    }

    public function GetInfo ($ajaxid) {
        $sql = "SELECT * FROM uploads WHERE id = :ajaxid ";
        $inputs = array('ajaxid' => $ajaxid);

        //$stmt = $this->RunQuery($sql, $inputs);
        $stmt = parent::RunQuery($sql, $inputs);
        $rowCount = $stmt->rowCount();

        if($rowCount > 0){
            return $stmt->fetchAll(PDO::FETCH_ASSOC);
        } else {
            return $rowCount;
        }
    }
}

pdo_connection.php

abstract class Connection {
    protected static $pdo_conn;
    private $dsn, $user, $pass;

        function __construct (){
            require_once MYSQL_DIR . 'pdo_config.php';

            $host = $config['db']['host'];
            $dbname = $config['db']['dbname'];
            $port = $config['db']['port'];

            $this->user = $config['db']['user'];
            $this->pass = $config['db']['pass'];            
            $this->dsn = "mysql:host=" . $host . ";port=" . $port . ";dbname=" . $dbname;

            $this->Start();
        }

        protected function Start(){
            try {
                $this->pdo_conn = new PDO($this->dsn, $this->user, $this->pass);
            } catch (PDOException $e){
                print_r($e);
                exit(0);
            }   
        }

    function RunQuery ($sql, $inputs=null){
//      $pdo = $this->pdo_conn;
        $pdo = self::$pdo_conn;

        if(is_null($inputs)) {
            $pdo->query($sql);          
        } else {
            try {
                $stmt = $pdo->prepare($sql);

                if ($stmt) {
                    $stmt->execute($inputs);
                } else {
                    print_r("Unable to prepare query");
                }

            } catch (PDOException $e) {
                print_r($e);
                exit(0);                
            }
        }
        return $stmt;
    }
}

pdo_config.php

$config['db'] = array(
'host' => 'localhost',
'user' => 'root',
'pass' => '',
'dbname' => 'images',
'port' => '3306',
);

恕我直言,问题是你对static变量和函数的理解或误解。

所以如果你声明:

abstract class Connection {
    protected static $pdo_conn;

这意味着您可以访问 $pdo_conn 即使您没有实例化 class 的对象并且没有通过 __construct 所以如果您没有通过 __construct 属性 有什么价值?正确 - NULL ;-)

所以当你尝试:

    function RunQuery ($sql, $inputs=null){
//      $pdo = $this->pdo_conn;
        $pdo = self::$pdo_conn;

你会得到什么?正确$pdo = NULL。注释行看起来是正确的。

没有理由将pdo_conn声明和调用为静态属性。 可能是 privateprotected 甚至 public 但不是 static.

先尝试实例化对象:

$socialBarObj = new Socialbar();
$getinfo = $socialBarObj->getInfo($ajaxid);
print_r($getinfo);