不同类中的PHP数据对象

时间:2019-02-18 20:00:44

标签: php pdo

我正在使用继承关系连接到PDO(PHP DATA OBJECTS),让我首先向您展示我的DB.php代码。

我已经将DB.php设置为单例类。我很了解单例模式。

我希望代码可以被分发和分离,因此我创建了一个全新的类来从数据库中选择数据。

class DB {
private $db = "";
private static $instance = null ;

    private function __construct() {
        try {
            //$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
            $this->db = new PDO("mysql:host=127.0.0.1;dbname=cactus", "root", "", $options = [
            PDO::ATTR_EMULATE_PREPARES   => false,
            PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
              ]);
        } catch(PDOException $e) {
            print("Error: " . $e->getMessage() . "<br>");
            die();
        }
}

    public function connect() {
        if(self::$instance == null) {
            self::$instance = new DB();
        }

        return self::$instance;
    }
}


<?php
include "DB.php";

class Load_Data {

    public function Fetch() {
        $db = DB::connect();
        $Querystatement = $this->db->prepare("SELECT * FROM `production`");
        $Querystatement->fetchAll();
        $Querystatement->execute();
        /** Converting data to JSON **/ 
        json_encode($Querystatement);
        return $Querystatement;
    }
}

$load_Data = new Load_Data();
$load_Data->Fetch();

下面是我的类,名称为load-data.php,问题是在调用DB :: connect()时出现错误。

This the image of the error that I am getting

错误是它无法识别“ DB :: connect();”。并最终在prepare函数中也给出错误。

我要去哪里错了?我应该怎么做才能实现下面的所需代码。

[注意]:我已经在堆栈溢出和其他论坛上发现了可能无法解决的准确或类似问题。

4 个答案:

答案 0 :(得分:1)

您的第一个问题是:

$db = DB::connect();
^^^
$Querystatement = $this->db->…
                  ^^^^^^^^^

分配给$db将创建一个名为$db的局部变量。如果您想将此值作为实例变量$this->db使用,则需要明确地为其分配值。

您的第二个问题是DB对象不是PDO对象。您不能在其上调用prepare()之类的PDO方法。由于db对象的DB属性是私有的,因此无法从外部调用者访问它。您将需要对设计进行一些更改。

答案 1 :(得分:0)

我相信您的问题是您尚未将connect()方法定义为静态方法。因此,无法通过调用DB:connect();

来访问它

尝试将您的类的connect()方法修改为以下内容:

public static function connect() {
    /* Existing Code Here */
}

编辑:

此外,我认为您需要在$db类而不是public中创建private属性,以确保{ {1}}方法具有属性的可见性,可以调用$db方法。

答案 2 :(得分:0)

有一些问题。首先,为了使用继承,DB类必须扩展PDO。您是正确的 构造函数应该是私有的,但实际上不应该包含任何内容。您的connect()方法必须是静态的, 并且它将需要调用另一个静态方法来获取实例,并且构造函数不能为静态。因此,添加一个静态getInstance 设置实例并返回它的方法,然后在connect()中调用它,而不是尝试使用new

<?php
class DB extends PDO {

    private static $instance = null ;

    private function __construct() { }

    private static function getInstance() {
        try {
            return self::$instance = new PDO("mysql:host=127.0.0.1;dbname=cactus", "root", "", [
                PDO::ATTR_EMULATE_PREPARES   => false,
                PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            ]);
        } catch (PDOException $e) {
            print("Error: " . $e->getMessage() . "<br>");
            die();
        }
    }

    public static function connect() {
        if (self::$instance == null) {
            self::$instance = self::getInstance();
        }
        return self::$instance;
    }
}

现在,数据库扩展了PDO,您将可以访问所需的各种PDO方法。但是,如何获取数据仍然存在一些问题。首先,您应该在prepare()上调用$db,而不是不存在的$this->db。 之后,您在fetchAll()之前调用了execute(),这将不起作用,因为执行之前没有什么可提取的 该语句,您尚未将fetchAll()json_encode()的结果分配给任何内容,而是要返回PDOStatement 对象,而不是您期望的JSON编码结果数组。

<?php

class Load_Data {

    public function Fetch() {
        $db = DB::connect();
        $Querystatement = $db->prepare("SELECT * FROM `production`");
        $Querystatement->execute();
        $result = $Querystatement->fetchAll();
        return json_encode($result);
    }
}

修复Load_Data之后,如果您想查看任何内容,仍然需要对其使用方式进行另一项调整。呼唤 $load_Data->Fetch();不输出任何内容。 Fetch()现在将返回一个字符串,但是如果需要,您需要echo 查看结果,或者将其分配给变量(如果您要对它进行其他操作)。

<?php
$load_Data = new Load_Data();
echo $load_Data->Fetch();
// OR $json = $load_Data->Fetch();

答案 3 :(得分:-1)

更改

$Querystatement = DB::connect()->prepare("SELECT * FROM `production`");

    $ virtualenv <directory_name>