封裝PDO函數

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);
}
相關文章
相關標籤/搜索