Php 如何连接两个类从数据库中读取信息?
我不熟悉PHP PDO OOP。我正在尝试使用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
\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
和其他语句保存为对象的属性有什么意义?你只会使用它们一次,不是吗?你应该创建另一个类,如果你喜欢的话,这是一个特性,它是“数据库连接逻辑”,它可以在你拥有的两个类中“使用”。这个类将用新方法扩展。玩具活动记录。开发商开发过程中不可避免的一步。