funPDO.php
<?php
/**
* @title: 封裝PDO函數
*
* @Features:
* 1. 封裝 SELECT ,INSERT,DELETE,UPDATE 操做 @done(2019-3-22 13:35:30)
* 2. 加入回滾事務 @done(2019-3-22 15:35:46)
*
* @ TODO:
* 1. 完善SQL語句的漏洞屏蔽
* 2. 學習面向對象後,封裝成類
* 3. 繼續補充PDO知識,完善此函數
*
*
* @author Paul <19805123@qq.com>
* @version 0.1
* @created 2019-3-22 15:43:32
*
*/
# 加載conn.config.php
include 'conn.config.php';
//1. 鏈接數據庫,獲取PDO操做對象
function connectPDO($dbType, $host, $dbName, $user, $pass)
{
//定義全局變量,這樣每一個function均可以用到
global $pdoObj;
//調用 conn.config.php 鏈接數據庫服務器
$pdoObj = connMySQL($dbType, $host, $dbName, $user, $pass);
}
//定義 `SELECT` 語句的函數
/**
* 輸出 查詢結果 和 結果數
*
* @param string $tableName //表名
* @param string $fields //字段名
* @param string $where //條件
* @param string $order //排序
* @param string $limit //限制
* @return [關聯數組] 結果集 和 查詢到的記錄數
*/
function select(string $tableName, string $fields = '*', string $where = '', string $order = '', string $limit = '')
{
try {
// 1. 組裝SQL語句
$sql = 'SELECT '; // 組裝select關鍵詞
// 2. 組裝 查詢字段
if (!empty($fields) && isset($fields)) {
$sql .= $fields;
}
// 3. 組裝 FROM 關鍵字
$sql .= ' FROM ';
// 4. 組裝 表名
if (!empty($tableName) && isset($tableName)) {
$sql .= $tableName;
} else {
echo '沒有輸入表名,退出程序!...';
exit;
}
// 5. 組裝 WHERE
if (!empty($where) && isset($where)) {
$sql .= ' WHERE ' . $where;
}
// 6. 組裝 ORDER
if (!empty($order) && isset($order)) {
$sql .= ' ORDER BY ' . $order;
}
// 7. 組裝 LIMIT
if (!empty($limit) && isset($limit)) {
$sql .= ' LIMIT ' . $limit;
}
// 8. 返回整條sql語句
//return $sql ;
$GLOBALS['pdoObj'] ->beginTransaction(); //開啓事務處理
// 返回查詢到的結果集 到PDOStatement對象 = 全局$pdo對象 ->query(sql語句)
$results = $GLOBALS['pdoObj']->query($sql);
if ($results && $results->rowCount()) {
// 設置讀取模式
$results->setFetchMode(PDO::FETCH_ASSOC);
// 一次性把結果集保存在 `關聯數組` 裏面
$rows = $results->fetchAll();
// 統計結果集的總數
$rowsCount = $results->rowCount();
// 輸入結果集和結果集總數
$returnResults = [$rows, 'rowsCount' => $rowsCount];
// // 返回關聯數組的結果集
return $returnResults;
}
} catch (PDOException $e) {
$GLOBALS['pdoObj'] ->rollBack(); //回滾事務處理
//拋出錯誤
die('操做失敗:' . $e->getMessage());
}
}
/**
* 插入操做
*
* @param string $tableName #表名
* @param array $keysValues #字段名=>字段值 的索引數組
* @return void
*/
function insert(string $tableName, array $keysValues)
{
try {
//1. 組裝 INSERT 關鍵字
$insertSQL = 'INSERT INTO ';
//INSERT INTO `表名` SET 字段名=字段值,字段名=字段值
//2. 組裝表名
$insertSQL .= '`' . trim($tableName) . '`';
//3. 組裝 SET 關鍵字
$insertSQL .= ' SET ';
//4. 拼裝須要插入字段名和字段值,類型爲關聯數組
foreach ($keysValues as $key => $value) {
$insertSQL .= '`' . $key . '`' . '=' . "'" . $value . "'" . ',';
}
//去掉最右邊的','
$insertSQL = rtrim($insertSQL, ',');
echo $insertSQL;
//開啓事務處理
$GLOBALS['pdoObj'] ->beginTransaction();
//5. 執行插入操做
// 返回受影響行數 = $pdo對象 ->exec(sql語句)
$affectNum = $GLOBALS['pdoObj']->exec($insertSQL);
//6. 返回剛插入記錄的id = $pdo ->lastInsertId()
$insertId = $GLOBALS['pdoObj']->lastInsertId();
//7. 組裝返回結果, 返回受影響記錄數 和 插入的id號
$returnInsert = ['affectNum' => $affectNum, 'insertId' => $insertId];
return $returnInsert;
} catch (PDOException $e) {
//回滾事務
$GLOBALS['pdoObj'] ->rollback();
//拋出錯誤
die('操做失敗:' . $e->getMessage());
}
}
function update(string $tableName, array $keysValues,string $where='')
{
try {
//1. 組裝 UPDATE 關鍵字
$updateSQL = 'UPDATE ';
//UPDATE `表名` SET 字段名=字段值,字段名=字段值 WHERE 條件
//2. 組裝表名
$updateSQL .= '`' . trim($tableName) . '`';
//3. 組裝 SET 關鍵字
$updateSQL .= ' SET ';
//4. 拼裝須要插入字段名和字段值,類型爲關聯數組
foreach ($keysValues as $key => $value) {
$updateSQL .= '`' . $key . '`' . '=' . "'" . $value . "'" . ',';
}
//去掉最右邊的','
$updateSQL = rtrim($updateSQL, ',');
//5. 組合WHERE關鍵字
$updateSQL .= ' WHERE ';
//6. 組合 where 條件
$updateSQL .= trim($where);
echo $updateSQL;
//開啓事務處理
$GLOBALS['pdoObj'] ->beginTransaction();
//5. 執行插入操做
// 返回受影響行數 = $pdo對象 ->exec(sql語句)
$affectNum = $GLOBALS['pdoObj']->exec($updateSQL);
//6. 組裝返回結果, 返回受影響記錄數
$returnUpdate = ['affectNum' => $affectNum];
return $returnUpdate;
} catch (PDOException $e) {
//回滾事務
$GLOBALS['pdoObj'] ->rollback();
//拋出錯誤
die('操做失敗:' . $e->getMessage());
}
}
function delete(string $tableName , string $where='')
{
// DELETE FROM `表名` WHERE 條件;
try {
//1. 組裝 DELETE 關鍵字
$deleteSQL = 'DELETE FROM ';
//2. 組裝表名
$deleteSQL .= '`' . trim($tableName) . '`';
//3. 組合WHERE關鍵字
$deleteSQL .= ' WHERE ';
//4. 組合 where 條件
$deleteSQL .= trim($where);
echo $deleteSQL;
//開啓事務處理
$GLOBALS['pdoObj'] ->beginTransaction();
//5. 執行刪除操做
// 返回受影響行數 = $pdo對象 ->exec(sql語句)
$affectNum = $GLOBALS['pdoObj']->exec($deleteSQL);
//6. 組裝返回結果, 返回受影響記錄數
$returnUpdate = ['affectNum' => $affectNum];
return $returnUpdate;
} catch (PDOException $e) {
//回滾事務
$GLOBALS['pdoObj'] ->rollback();
//拋出錯誤
die('操做失敗:' . $e->getMessage());
}
}
/**
* TODO : 未完成的 SWITCH 操做
* SEE : https://www.cnblogs.com/xiaoliwang/p/7963471.html
*
* @param string $dmlString
* @param string $tableName
* @param string $fieldName
* @param string $fieldValue
* @param string $where
* @return void
*/
/**
* 銷燬 PDO 對象
* @return void
*/
function clearPDO()
{
//釋放PDO對象
unset($pdoObj);
}