摘要
將PDO封裝成PHP類進行呼叫有很多好處,包括:
1、封裝性和抽象性: 透過將PDO封裝到一個類中,您可以將資料庫操作邏輯與應用程式的其他部分分離開來,提高了程式碼的組織性和可維護性。這樣,您只需在一個地方維護資料庫連線和查詢邏輯,而不必在整個應用程式中散佈資料庫程式碼。
2、重用性: 將資料庫操作封裝成類使得這些操作可以在應用程式的不同部分重複使用,而無需重複編寫相同的程式碼。這有助於減少程式碼冗餘,提高效率。
3、安全性: 透過類的方法來執行資料庫操作,可以輕鬆地實施預處理語句,從而減少了SQL隱碼攻擊的風險。類還可以提供錯誤處理機制,使您能夠更容易地處理資料庫錯誤。
4、可擴充套件性: 使用類封裝資料庫操作,可以輕鬆地擴充套件和維護應用程式。如果需要新增新的資料庫操作或更改現有的操作,只需修改類中的相應方法而不必更改應用程式的其他部分。
5、清晰的介面: 類提供了一個清晰的介面,使其他開發人員能夠更容易地理解和使用資料庫操作。這有助於團隊協作和程式碼維護。
將PDO封裝成PHP類可以提高程式碼的可維護性、可重用性和安全性,同時降低了程式碼的耦合度,使資料庫操作更容易管理和擴充套件。這是一個良好的軟體工程實踐,特別適用於中大型和複雜的應用程式。
類檔案
Database.php
以下是使用Chatgpt生成的操作類,但是我做了30%的修改和最佳化。
<?php
/**
* Title:PDO資料庫操作類
* Author:TANKING
* Blog:https://segmentfault.com/u/tanking
* Date:2023-09-18
*/
class Database
{
private $host;
private $username;
private $password;
private $database;
private $pdo;
private $error = null;
public function __construct($host, $username, $password, $database)
{
$this->host = $host;
$this->username = $username;
$this->password = $password;
$this->database = $database;
$this->connect();
}
// 獲取錯誤資訊
public function getError()
{
return $this->error;
}
// 連線資料庫
private function connect()
{
$dsn = "mysql:host={$this->host};dbname={$this->database}";
try {
$this->pdo = new PDO($dsn, $this->username, $this->password);
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("Connection failed: " . $e->getMessage());
}
}
// 插入資料
public function insert($table, $data)
{
try {
$columns = implode(", ", array_keys($data));
$values = ":" . implode(", :", array_keys($data));
$sql = "INSERT INTO $table ($columns) VALUES ($values)";
$stmt = $this->pdo->prepare($sql);
$result = $stmt->execute($data);
if (!$result) {
$this->error = $stmt->errorInfo();
}
return $result;
} catch (PDOException $e) {
// 處理資料庫異常
$this->error = $e->getMessage();
return FALSE;
}
}
// 更新資料
public function update($table, $data, $where)
{
try {
$set = "";
foreach ($data as $key => $value) {
$set .= "$key = :$key, ";
}
$set = rtrim($set, ', ');
$sql = "UPDATE $table SET $set WHERE $where";
$stmt = $this->pdo->prepare($sql);
$result = $stmt->execute($data);
if (!$result) {
$this->error = $stmt->errorInfo();
}
return $result;
} catch (PDOException $e) {
// 處理資料庫異常
$this->error = $e->getMessage();
return FALSE;
}
}
// 刪除資料
public function delete($table, $where)
{
try {
$sql = "DELETE FROM $table WHERE $where";
$stmt = $this->pdo->prepare($sql);
$result = $stmt->execute();
if($stmt->rowCount() === 0) {
// 沒有受影響的記錄
$this->error = '沒有受影響的記錄';
return FALSE;
}else {
return $result;
}
} catch (PDOException $e) {
// 處理資料庫異常
$this->error = $e->getMessage();
return FALSE;
}
}
// 查詢一條資料
public function queryOne($table, $conditions = [])
{
$whereClause = $this->buildWhereClause($conditions);
$sql = "SELECT * FROM $table $whereClause LIMIT 1";
try {
$stmt = $this->pdo->prepare($sql);
$stmt->execute($conditions);
return $stmt->fetch(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
// 處理資料庫異常
$this->error = $e->getMessage();
return FALSE;
}
}
// 查詢所有資料
public function queryAll($table, $conditions = [])
{
$whereClause = $this->buildWhereClause($conditions);
$sql = "SELECT * FROM $table $whereClause";
try {
$stmt = $this->pdo->prepare($sql);
$stmt->execute($conditions);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
// 處理資料庫異常
$this->error = $e->getMessage();
return FALSE;
}
}
// 執行原生SQL語句
public function executeSQL($sql, $params = [])
{
try {
$stmt = $this->pdo->prepare($sql);
$result = $stmt->execute($params);
if (!$result) {
// 執行失敗
$this->error = $stmt->errorInfo();
return FALSE;
}
return $stmt;
} catch (PDOException $e) {
// 處理資料庫異常
$this->error = $stmt->errorInfo();
return FALSE;
}
}
// 資料繫結
private function buildWhereClause($conditions)
{
if (empty($conditions)) {
return '';
}
$where = 'WHERE';
foreach ($conditions as $key => $value) {
$where .= " $key = :$key AND";
}
$where = rtrim($where, ' AND');
return $where;
}
}
例項
配置檔案 Db.php
<?php
/**
* Title:資料庫配置
* Author:TANKING
* Blog:https://segmentfault.com/u/tanking
* Date:2023-09-18
*/
$DbConfig = array(
'db_host' => 'xxx', // 資料庫伺服器
'db_name' => 'xxx', // 資料庫名
'db_user' => 'xxx', // 資料庫賬號
'db_pwd' => 'xxx', // 資料庫密碼
);
include 'Database.php';
?>
以下例項使用一個名為artcles
的資料庫表進行操作演示。
插入資料 insert.php
<?php
// 編碼
header("Content-type:application/json");
// 資料庫配置
include 'Db.php';
// 連線資料庫
$db = new Database($DbConfig['db_host'], $DbConfig['db_user'], $DbConfig['db_pwd'], $DbConfig['db_name']);
// 插入資料
$data = [
'aid' => rand(100000,999999),
'title' => 'sdfgsadg',
'tag' => 'ceshi',
'content' => '這是內容',
'author' => 'TANKING'
];
$insertArtcle = $db->insert('artcles', $data);
if($insertArtcle){
echo '插入成功';
}else{
echo '失敗!' . $db->getError();
}
?>
更新資料 update.php
<?php
// 編碼
header("Content-type:application/json");
// 資料庫配置
include 'Db.php';
// 連線資料庫
$db = new Database($DbConfig['db_host'], $DbConfig['db_user'], $DbConfig['db_pwd'], $DbConfig['db_name']);
// 更新
$updateData = ['tag' => '測試'];
$where = 'id = 19';
$updateArtcle = $db->update('artcles', $updateData, $where);
if($updateArtcle){
echo '更新成功!';
}else{
echo '更新失敗!' . $db->getError();
}
?>
刪除資料 delete.php
<?php
// 編碼
header("Content-type:application/json");
// 資料庫配置
include 'Db.php';
// 連線資料庫
$db = new Database($DbConfig['db_host'], $DbConfig['db_user'], $DbConfig['db_pwd'], $DbConfig['db_name']);
// 刪除
$where = 'id = 11';
$deleteArtcle = $db->delete('artcles', $where);
if($deleteArtcle){
echo '刪除成功!';
}else{
echo '刪除失敗!' . $db->getError();
}
?>
查詢一條資料 queryOne.php
<?php
// 編碼
header("Content-type:application/json");
// 資料庫配置
include 'Db.php';
// 連線資料庫
$db = new Database($DbConfig['db_host'], $DbConfig['db_user'], $DbConfig['db_pwd'], $DbConfig['db_name']);
// 查詢一條資料
$conditions = ['id' => 18];
$getArtcle = $db->queryOne('artcles', $conditions);
if($getArtcle){
echo json_encode($getArtcle);
}else{
echo '查詢失敗!' . $db->getError();
}
?>
查詢所有資料 queryAll.php
<?php
// 編碼
header("Content-type:application/json");
// 資料庫配置
include 'Db.php';
// 連線資料庫
$db = new Database($DbConfig['db_host'], $DbConfig['db_user'], $DbConfig['db_pwd'], $DbConfig['db_name']);
// 查詢所有資料
$conditions = [];
$getArtcles = $db->queryAll('artcles', $conditions);
if($getArtcles){
echo json_encode($getArtcles);
}else{
echo '查詢失敗!' . $db->getError();
}
?>
執行原生SQL語句
// 插入
$sql = "INSERT INTO artcles (aid, title, tag, content, author) VALUES (:aid, :title, :tag, :content, :author)";
$params = [
':aid' => rand(100000,999999),
':title' => '這是標題' . uniqid(),
':tag' => 'tag' . rand(0,9),
':content' => '這是內容' . uniqid(),
':author' => 'TANKING'
];
// 更新
$sql = "UPDATE artcles SET title = :title WHERE id = :id";
$params = [
':id' => 22,
':title' => '這是標題_已更新',
];
// 刪除
$sql = "DELETE FROM artcles WHERE id = :id";
$params = [
':id' => 20
];
// 查詢
$sql = "SELECT * FROM artcles";
try {
$stmt = $db->executeSQL($sql);
if ($stmt) {
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
if (empty($result)) {
// 沒有匹配的結果
echo "沒有匹配的結果";
} else {
echo json_encode($result);
}
} else {
echo "查詢失敗,錯誤資訊:" . json_encode($db->getError());
}
} catch (DatabaseException $e) {
// 查詢失敗
echo $e->getMessage();
}
作者
TANKING