使用 PHP 和 MySQL 进行真实世界的 OOP

从机器人到自行车的许多示例都可以作为对 OOP 的简单解释。然而,我更喜欢演示 OOP 如何在现实场景中发挥作用,特别是针对程序员。一个实际的示例是创建 MySQL CRUD(创建、读取、更新和删除)类。这样,无论数据库的设计如何,程序员都可以有效地管理项目中的条目。
一旦我们确定了需求,创建类的基本结构就相对简单了。首先,我们需要确保我们可以进行基本的 MySQL 操作。为了实现这一点,我们需要实现以下功能:
- 选择
- 插入
- 删除
- 更新
- connect
- 断开连接
让我们快速看看我们的类定义是什么样的:
<?php
class Database
{
private $db_host = '';
private $db_user = '';
private $db_pass = '';
private $db_name = '';
private $con = '';
public function __contruct($db_host, $db_user, $db_pass, $db_name)
{
$this->db_host = $db_host;
$this->db_user = $db_user;
$this->db_pass = $db_pass;
$this->db_name = $db_name;
}
public function connect() {}
public function disconnect() {}
public function select() {}
public function insert() {}
public function delete() {}
public function update() {}
}
基本上,它是一个名为 Database 的骨架类,它代表数据库连接并提供与数据库交互的方法。我们定义了不同的私有属性,例如 $db_host、$db_user、$db_pass、$db_name 和 $con。该类用于存储数据库连接详细信息和连接对象本身。
在下一节中,我们将详细介绍此类的实际实现。
实现数据库类
在本节中,我们将实现执行不同数据库操作所需的方法。
connect 方法
继续添加 connect 方法,如以下代码片段所示。
<?php
public function connect()
{
if (!$this->con) {
$this->con = mysqli_connect($this->db_host, $this->db_user, $this->db_pass);
if($this->con) {
$seldb = mysqli_select_db($this->con, $this->db_name);
if($seldb) {
return true;
} else {
return false;
}
} else {
return false;
}
} else {
return true;
}
}
connect 方法的目的是使用 mysqli 扩展建立与 MySQL 数据库的连接。首先,我们检查是否已经存在与数据库的连接,如果存在,该方法只是返回 true 表示连接已经建立,无需重新连接。如果没有连接,它会尝试使用 mysqli_connect 函数连接到数据库。
一旦数据库连接成功,就会通过调用mysqli_select_db函数来选择数据库。最后如果数据库选择成功,则返回true,表示连接建立,数据库选择。如果连接或数据库选择失败,则返回 false。
disconnect 方法
让我们看一下 disconnect 方法。
<?php
public function disconnect()
{
if ($this->con) {
if (mysqli_close($this->con)) {
$this->con = false;
return true;
} else {
return false;
}
}
}
它检查是否存在活动的数据库连接,如果存在,则使用 mysqli_close() 函数关闭连接,并将 $this->con 属性设置为 false。
select 方法
这是最重要且经常使用的方法之一。首先,我们创建 tableExists 方法,用于检查 MySQL 数据库中该表是否存在。
<?php
private function tableExists($table)
{
$tablesInDb = mysqli_query($this->con, 'SHOW TABLES FROM '.$this->db_name.' LIKE "'.$table.'"');
if($tablesInDb) {
if(mysqli_num_rows($tablesInDb) == 1) {
return true;
} else {
return false;
}
}
}
接下来,我们继续实现 select 方法。
<?php
public function select($table, $rows = '*', $where = null, $order = null)
{
$q = 'SELECT '.$rows.' FROM '.$table;
if($where != null)
$q .= ' WHERE '.$where;
if($order != null)
$q .= ' ORDER BY '.$order;
if($this->tableExists($table)) {
$result = $this->con->query($q);
if($result) {
$arrResult = $result->fetch_all(MYSQLI_ASSOC);
return $arrResult;
} else {
return false;
}
} else {
return false;
}
}
它用于从数据库中检索记录。它首先使用输入参数构建 SQL 查询字符串。它检查数据库中是否存在指定的表,如果存在,则执行查询。如果查询成功,结果行将作为关联数组获取并返回。如果查询失败,该方法返回false。如果数据库中不存在指定的表,也返回false。
insert 方法
让我们看一下 insert 方法,如以下代码片段所示。
<?php
public function insert($table, $values, $rows = null)
{
if ($this->tableExists($table)) {
$insert = 'INSERT INTO '.$table;
if ($rows != null) {
$insert .= ' ('.$rows.')';
}
for ($i = 0; $i < count($values); $i++) {
$values[$i] = mysqli_real_escape_string($this->con, $values[$i]);
if (is_string($values[$i])) {
$values[$i] = '"'.$values[$i].'"';
}
}
$values = implode(',', $values);
$insert .= ' VALUES ('.$values.')';
$ins = mysqli_query($this->con, $insert);
if ($ins) {
return true;
} else {
return false;
}
}
}
它用于使用 mysqli 扩展将数据插入到 MySQL 数据库的表中。该函数采用三个参数:表名、要插入的值以及要插入的列(可选)。首先,它检查数据库中是否存在指定的表,如果存在,则构造 SQL 查询以使用提供的值和列插入数据。我们使用 mysqli_real_escape_string 函数来清理任何字符串值。
最后使用mysqli_query()函数执行查询,如果查询成功,该函数返回true,否则返回false。
delete 方法
让我们快速浏览一下 delete 方法。
<?php
public function delete($table, $where = null)
{
if ($this->tableExists($table)) {
if ($where == null) {
$delete = 'DELETE '.$table;
} else {
$delete = 'DELETE FROM '.$table.' WHERE '.$where;
}
$del = $this->con->query($delete);
if ($del) {
return true;
} else {
return false;
}
} else {
return false;
}
}
它用于从数据库中删除表或行。
update 方法
这也是我们更新数据库信息的重要方法之一。
update 方法实现应该如下所示。
<?php
public function update($table, $rows, $where)
{
if ($this->tableExists($table)) {
// Parse the where values
// even values (including 0) contain the where rows
// odd values contain the clauses for the row
for ($i = 0; $i < count($where); $i++) {
if ($i % 2 != 0) {
if (is_string($where[$i])) {
if (($i + 1) != null) {
$where[$i] = '"' . $where[$i] . '" AND ';
} else {
$where[$i] = '"' . $where[$i] . '"';
}
}
}
}
$where = implode('=', $where);
$update = 'UPDATE ' . $table . ' SET ';
$keys = array_keys($rows);
$setValues = [];
foreach ($keys as $key) {
$value = $rows[$key];
$setValues[] = "`$key` = '" . mysqli_real_escape_string($this->con, $value)."'";
}
$update .= implode(',', $setValues);
$update .= ' WHERE ' . $where;
$query = $this->con->query($update);
if ($query) {
return true;
} else {
return false;
}
} else {
return false;
}
}
update 方法具有三个参数:$table、$rows 和 $where。然后解析 $where 数组以生成用于更新查询的 SQL WHERE 子句。解析 $rows 数组以生成用于更新查询的 SQL SET 子句。数组键表示列名称,而数组值表示列的新值。我们使用 mysqli_real_escape_string 函数来清理任何字符串值。
至此,我们完成了数据库操作所需方法的创建。您可以将其另存为 Database.php 文件。
在下一节中,我们将了解如何使用它。
如何使用数据库类
首先,我们在数据库中创建一个 MySQL 表,以便我们可以测试该表上的 CRUD 操作。
继续运行以下 SQL 来创建表。
CREATE TABLE `mysqlcrud` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
`email` VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`)
);
它应该在您的数据库中创建 mysqlcrud 表。
如何插入新行
让我们看看如何插入新行。
<?php
require "Database.php";
$db = new Database("DB_HOST", "DB_USER", "DB_PASS", "DB_NAME");
if ($db->connect()) {
$db->insert('mysqlcrud', array(1,"Foo Bar","foobar@yahoo.com"));
} else {
echo "There was some error connecting to the database.";
}
?>
首先,我们创建了一个新的 Database 对象,并将数据库凭据作为参数传递。您需要将其替换为您的凭据。接下来调用Database类的connect方法来建立与数据库的连接。如果连接成功,则调用 insert 方法,并将表名作为第一个参数,将新行的值数组作为第二个参数。
如果一切顺利,它应该在 mysqlcrud 表中创建一个新行。
如何更新行
让我们看看更新操作是如何工作的。
<?php
require "Database.php";
$db = new Database("DB_HOST", "DB_USER", "DB_PASS", "DB_NAME");
if ($db->connect()) {
$db->update('mysqlcrud',array('name'=>'Updated Foo Bar'), array('id',1));
} else {
echo "There was some error connecting to the database.";
}
?>
如您所见,我们调用了 update 方法来更新该行的 name 列。
如何删除行
接下来,让我们看看如何删除特定行。
<?php
require "Database.php";
$db = new Database("DB_HOST", "DB_USER", "DB_PASS", "DB_NAME");
if ($db->connect()) {
$db->delete('mysqlcrud', "`id` = '1'");
} else {
echo "There was some error connecting to the database.";
}
?>
它应该删除 id 等于 1 的行。
如何检索记录
让我们看看如何从表中检索所有记录。
<?php
require "Database.php";
$db = new Database("DB_HOST", "DB_USER", "DB_PASS", "DB_NAME");
if ($db->connect()) {
$rows = $db->select('mysqlcrud');
} else {
echo "There was some error connecting to the database.";
}
?>
如您所见,select 方法允许我们从所需的表中获取所有记录。
这就是您如何使用我们的类执行 CRUD 操作。
以上就是使用 PHP 和 MySQL 进行真实世界的 OOP的详细内容,更多请关注其它相关文章!
Php