Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何连接两个类从数据库中读取信息?_Php_Pdo - Fatal编程技术网

Php 如何连接两个类从数据库中读取信息?

Php 如何连接两个类从数据库中读取信息?,php,pdo,Php,Pdo,我不熟悉PHP PDO OOP。我正在尝试使用\u构造函数创建数据库连接。 这是我的数据库类代码 <?php // database class class Database { // database host name private $db_host = "localhost"; // database username private $db_user = "root"; // database nam

我不熟悉PHP PDO OOP。我正在尝试使用
\u构造函数创建数据库连接。
这是我的数据库类代码

<?php
// database class
class Database
{
    // database host name
    private $db_host = "localhost";
    // database username
    private $db_user = "root";
    // database name
    private $db_name = "project_crud";
    // database password
    private $db_pass = "";

    public $conn;

    // function for create connection
    public function __construct()
    {
        try {
            $this->conn = new PDO("mysql:host=" . $this->db_host . ";dbname=" . $this->db_name, $this->db_user, $this->db_pass);
            $this->conn->exec("set names utf8");
        } catch (PDOException $e) {
            die("ERROR: Could not connect with database." . $e->getMessage());
        }
        return $this->conn;
    }
}
<?php

class Employees
{
    private $conn;

    private $db_table = "employees";

    public function getConnection()
    {
        $this->conn = $ob ;
    }

    public function readAllEmployee()
    {
        $data   = array();
        $query  = "SELECT * FROM $this->db_table";
        $stmt   = $this->conn->prepare($query);
        $stmt->execute();
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);

        foreach ($result as $row) {
            $data[] = $row;
        }
        return $data;
    }
}


这里绝对没有理由使用OOP。你拥有的是程序代码。您打开一个到PDO的连接,然后从数据库中获取一些数据。这里没有涉及任何对象

事实上,您的整个代码可以总结在以下几行中(修复后):

面向对象编程意味着您应该将实体表示为类。例如,
Employee
可以是一个类,然后该类将具有某些方法来对对象执行操作。如果需要,这样的类可以由一个PDO链接组成,尽管您必须考虑您的类是否做了一件事或多件事情(例如从数据库中获取并在雇员对象上执行动作)。 如果您决定实现此类,则可以通过以下方式传递PDO连接:

class Employee
{
    private PDO $pdo;
    public function __construct(PDO $pdo)
    {
        $this->pdo = $pdo;
    }

    public function getByID(int $id): ?array
    {
        $stmt =  $this->pdo->prepare('SELECT * FROM employees WHERE Id=?');
        $stmt->execute([$id]);
        return $stmt->fetch();
    }
}
/**
 * Class representing a real life employee in a company
 */
class Employee {
    private $Id;

    private $Name;

    public function getName(): ?string {
        return $this->Name;
    }
}

// Execute prepared statement to to create a single employee object. 
$stmt = $pdo->query('SELECT Id, Name FROM employees ORDER BY Id LIMIT 1');
$stmt->setFetchMode(PDO::FETCH_CLASS, Employee::class);
$empl = $stmt->fetch();

echo $empl->getName();

// or if you want to fetch by an ID
$stmt = $pdo->prepare('SELECT Id, Name FROM employees WHERE Id=?');
$stmt->execute([1]); // pass ID of the employee
$stmt->setFetchMode(PDO::FETCH_CLASS, Employee::class);
$empl = $stmt->fetch();

echo $empl->getName();

// or if you need to fetch multiple employees
$stmt = $pdo->prepare('SELECT Id, Name FROM employees WHERE Id IN(?,?)');
$stmt->execute([1, 2]); // pass ID of the employee
$stmt->setFetchMode(PDO::FETCH_CLASS, Employee::class);
$employees = $stmt->fetchAll();
foreach ($employees as $empl) {
    var_dump($empl->getName());
}
然后,当您创建此类的实例时,将PDO实例作为参数传递

$emplpyee = new Employee($pdo);
$johndoe = $emplpyee->getByID(42);
现在小心点这仍然不是一个合适的OOP。正如你所看到的,我们班并不是一名雇员。事实上,它充当PDO包装器,用于获取员工。这是PDO已经提供的功能,因此可以通过以下方式对类进行返工:

class Employee
{
    private PDO $pdo;
    public function __construct(PDO $pdo)
    {
        $this->pdo = $pdo;
    }

    public function getByID(int $id): ?array
    {
        $stmt =  $this->pdo->prepare('SELECT * FROM employees WHERE Id=?');
        $stmt->execute([$id]);
        return $stmt->fetch();
    }
}
/**
 * Class representing a real life employee in a company
 */
class Employee {
    private $Id;

    private $Name;

    public function getName(): ?string {
        return $this->Name;
    }
}

// Execute prepared statement to to create a single employee object. 
$stmt = $pdo->query('SELECT Id, Name FROM employees ORDER BY Id LIMIT 1');
$stmt->setFetchMode(PDO::FETCH_CLASS, Employee::class);
$empl = $stmt->fetch();

echo $empl->getName();

// or if you want to fetch by an ID
$stmt = $pdo->prepare('SELECT Id, Name FROM employees WHERE Id=?');
$stmt->execute([1]); // pass ID of the employee
$stmt->setFetchMode(PDO::FETCH_CLASS, Employee::class);
$empl = $stmt->fetch();

echo $empl->getName();

// or if you need to fetch multiple employees
$stmt = $pdo->prepare('SELECT Id, Name FROM employees WHERE Id IN(?,?)');
$stmt->execute([1, 2]); // pass ID of the employee
$stmt->setFetchMode(PDO::FETCH_CLASS, Employee::class);
$employees = $stmt->fetchAll();
foreach ($employees as $empl) {
    var_dump($empl->getName());
}

现在我们有了一个类,它有一些方法并表示单个实体。该类由PDO实例化,PDO创建一个对象并填充其属性。不需要传递PDO或处理类中的依赖项。每个类都有一个单独的职责。

不要尝试捕捉连接错误。除非您打算从错误中恢复,否则不应捕获任何错误。
foreach($result as$row)
的目的是什么?
Employees
class的目的是什么?这看起来像一个SQL语句将
$db\u host
和其他语句保存为对象的属性有什么意义?你只会使用它们一次,不是吗?你应该创建另一个类,如果你喜欢的话,这是一个特性,它是“数据库连接逻辑”,它可以在你拥有的两个类中“使用”。这个类将用新方法扩展。玩具活动记录。开发商开发过程中不可避免的一步。