使用 PHP 和 MySQL 進行真實世界的 OOP

王林
發布: 2023-08-26 19:48:01
原創
763 人瀏覽過

使用 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板