php 資料庫類 適用於 mysql sql service

来源:http://www.cnblogs.com/xyyphp/archive/2016/10/12/5952508.html
-Advertisement-
Play Games

BaseModel 基礎Model類 其他的資料庫表類文件都基礎此類 當前鏈接的是sql service的資料庫 mysql的只需要修改query和execute就行 資料庫表的Model類 繼承 BaseModel類 實例: ...


BaseModel 基礎Model類 其他的資料庫表類文件都基礎此類 當前鏈接的是sql service的資料庫 mysql的只需要修改query和execute就行

<?php
/**
 * 資料庫基礎類
 * @author ***
 */
abstract class BaseModel
{
    static $model;
    private $sql;
    private $PrimaryKeyField; //主鍵欄位名
    private $field_values;//存放資料庫欄位數組
    protected $db;
    protected $pk; //主鍵
    protected $table;
    protected $field = '*';
    protected $where;
    protected $orderby;
    protected $limit;
    protected $groupby;
    
    /**
     * 初始化
     *
     * @global array $TmacConfig
     */
    public function __construct()
    {
        $this->db = $this->getDB();
    }
    
    private function getDB()
    {
        if(empty(self::$model)){
            $mssql = new Mssql(DB_DEFAULT_HOST, DB_DEFAULT_NAME, DB_DEFAULT_PASSWD, DB_DEFAULT_DATABASE);
            self::$model = $mssql->getInstance();
        }
        return self::$model;
    }
    
    /**
     * 設置SQL語句
     */
    private function setSQL($sql)
    {
        $this->sql = $sql;
    }

    /**
     * 獲取SQL語句
     */
    function getSQL()
    {
        return $this->sql;
    }

    /**
     * 設置field_values
     */
    function setFieldValues(array $field_values)
    {
        $this->field_values = $field_values;
    }
    
    /**
     * 獲取field_values
     */
    private function getFieldValues()
    {
        return $this->field_values;
    }

    /**
     * 設置主鍵欄位名
     */
    protected function setPrimaryKeyField($PrimaryKeyField)
    {
        $this->PrimaryKeyField = $PrimaryKeyField;
    }
    
    /**
     * 獲取主鍵欄位名
     */
    protected function getPrimaryKeyField()
    {
        return $this->PrimaryKeyField;
    }
    
    /**
     * 設置表名
     */
    protected function setTable($table)
    {
        $this->table = $table;
    }
    
    /**
     * 獲取表名
     */
    protected function getTable()
    {
        return $this->table;
    }
    
    /**
     * 設置主鍵
     */
    function setPk($pk)
    {
        $this->pk = $pk;
    }
    
    /**
     * 獲取主鍵
     */
    function getPk()
    {
        return $this->pk;
    }

        /**
     * 設置Fields
     */
    function setFields($fields)
    {
        $this->field = $fields;
    }
    
        /**
     * 獲取Fields
     */
    function getFields()
    {
        return $this->field;
    }
    
    /**
     * 設置where條件
     */
    function setWhere($where)
    {
        $this->where = $where;
    }
    
    /**
     * 獲取where條件
     */
    function getWhere()
    {
        return $this->where;
    }
    
    /**
     * 設置Group
     */
    function setGroupBy($groupby)
    {
        $this->groupby = $groupby;
    }
    
    /**
     * 獲取Group
     */
    function getGroupBy()
    {
        return $this->groupby;
    }
    
    /**
     * 設置Order
     */
    function setOrderBy($orderby)
    {
        $this->orderby = $orderby;
    }
    
    /**
     * 設置Order
     */
    function getOrderBy()
    {
        return $this->orderby;
    }
    
    /**
     * 設置條數
     */
    function setLimit( $limit )
    {
        $this->limit = $limit;
    }
    
    /**
     * 獲取條數
     */
    function getLimit()
    {
        return $this->limit;
    }
    
    /**
     * 根據主鍵獲取
     */
    function getInfoByPk()
    {
        $sql = "select {$this->getFields()} "
            ."from {$this->getTable()} "
            ."where {$this->getPrimaryKeyField()}={$this->getPk()}";
        $result = $this->query($sql);
        if ($result != NULL){
            $result = $result[0];
        }
        return $result;
    }
    
    /**
     * 根據where條件獲取一條信息
     */
    function getOneByWhere()
    {
        $sql = "SELECT {$this->getFields()} "
                . "FROM {$this->getTable()} "
                . "WHERE {$this->getWhere()}";
        $res = $this->query( $sql );
        return $res[0];
    }
    
    /**
     * 根據where條件獲取數組列表
     */
    function getListByWhere()
    {
        $sql = "SELECT ";
        if ( $this->getLimit() != null ) {
            $line_str = $this->getWhere() != null ? "AND " : "WHERE ";
            if (strpos($this->getLimit(), ',') !== FALSE){
                list($page, $count) = explode(',', $this->getLimit());
                $page_str = $count*($page-1);
                $sql .= "TOP $count ";
            } else {
                $sql .= "TOP {$this->getLimit()} ";
            }
        }
        $sql .= "{$this->getFields()} "
                . "FROM {$this->getTable()} ";
        if ( $this->getWhere() != null ) {
            $sql .= "WHERE {$this->getWhere()} ";
        }
        if (isset($page_str) && $page_str != NULL){
            $line_str = $this->getWhere() != null ? "AND " : "WHERE ";
            $sql .= "{$line_str} {$this->getPrimaryKeyField()} not in (select top $page_str {$this->getPrimaryKeyField()} from {$this->getTable()}) ";
        }
        if ( $this->getGroupby() != null ) {
            $sql .= "GROUP BY {$this->getGroupby()} ";
        }
        if ( $this->getOrderby() != null ) {
            $sql .= "ORDER BY {$this->getOrderby()} ";
        }
        $res = $this->query( $sql );
        return $res;
    }
    
    /**
     * 根據where獲取count
     */
    function getCountByWhere()
    {
        $sql_count = "SELECT COUNT(*) AS total FROM {$this->getTable()} ";
        if ( $this->getWhere() != null ) {
            $sql_count .= "WHERE " . $this->getWhere();
        }
        $count = $this->query( $sql_count );
        return $count != NULL ? $count[0]['total'] : 0;
    }


    /**
     * 根據主鍵更新
     */
    function updateByPk($fieldList)
    {
        $sql = "UPDATE {$this->getTable()} SET ";
        foreach ($this->getFieldValues() as $key => $one){
            if ($one != NULL){
                $sql .= "$key='$one',";
            }
        }
        $sql = rtrim($sql, ',');
        $sql .= " WHERE {$this->getPrimaryKeyField()}='{$this->getPk()}'";
        return $this->execute($sql);
    }
    
    /**
     * 根據WHERE更新
     */
    function updateByWhere($fieldList)
    {
        $sql = "UPDATE {$this->getTable()} SET ";
        foreach ($this->getFieldValues() as $key => $one){
            if ($one != NULL){
                $sql .= "$key='$one',";
            }
        }
        $sql = rtrim($sql, ',');
        $sql .= " {$this->getWhere()}";
        return $this->execute($sql);
    }
    
    /**
     * 根據WHERE更新
     */
    function insert($fieldList)
    {
        $sql_values = '';
        $sql = "INSERT INTO {$this->getTable()} (";
        foreach ($this->getFieldValues() as $key => $one){
            if ($one != NULL){
                $sql .= "$key,";
                $sql_values .= "'$one',";
            }
        }
        $sql = rtrim($sql, ',').") VALUES (".rtrim($sql_values, ',').")";
        return $this->execute($sql);
    }
    
    /**
     * odbc query操作
     */
    private function query($sql)
    {
        $this->setSQL($sql);
        $data = array();
        $sql = iconv('UTF-8', 'GBK', $sql);
        if (self::$model == NULL){
            throw new Exception("資料庫連接失敗");
        }
        $result = odbc_do(self::$model, $sql);
        if ($result != NULL){
            while($res = odbc_fetch_array($result)){
                foreach ($res as $key => $one){
                    $res[$key] = iconv('GBK', 'UTF-8', $one);
                }
                $data[] = $res;
            }
        }
        return $data;
    }
    
    /**
     * odbc execute
     */
    private function execute($sql, $iconv = TRUE)
    {
        $this->setSQL($sql);
        if ($iconv){
            $sql = iconv('UTF-8', 'GBK', $sql);
        }
        if (self::$model == NULL){
            throw new Exception("資料庫連接失敗");
        }
        return odbc_exec(self::$model, $sql);
    }


    //析構函數,自動關閉資料庫,垃圾回收機制
    function __destruct() {
        odbc_close(self::$model);
    }

}



// ++++++++++++++++++++++++++++++++++++++++++++++++
                // 自定義類庫
                // mssql 鏈接類
// ++++++++++++++++++++++++++++++++++++++++++++++++
//一個普遍通用的PHP連接MYSQL資料庫類
class Mssql {
    static $conn_line;
    private $db_host; //資料庫主機
    private $db_user; //資料庫用戶名
    private $db_pwd; //資料庫用戶名密碼
    private $db_database; //資料庫名
            
    function __construct($db_host, $db_user, $db_pwd, $db_database) {
        $this->db_host = $db_host;
        $this->db_user = $db_user;
        $this->db_pwd = $db_pwd;
        $this->db_database = $db_database;
    }

    /**
     * 單例模式處理資料庫連接
     */
    function getInstance()
    {
        if (empty(self::$conn_line)){
            $connstr = "Driver={SQL Server};Server=".$this->db_host.";Database=".$this->db_database;
            self::$conn_line = odbc_connect($connstr, $this->db_user, $this->db_pwd);
        }
        return self::$conn_line;
    }
}

資料庫表的Model類 繼承 BaseModel類

<?php
/**
 * 游戲截圖類
 * @author ***
 */
class GameImagesModel extends BaseModel
{
    private $field_values = array(
        'game_id' => '',//key為資料庫欄位名
        'img_url' => '',
        'atime' => '',
        'add_user' => '',
    );
    
    function __construct() {
        parent::__construct();
        $this->setTable('game_images');
        $this->setPrimaryKeyField('id');
    }
    
    /**
     * 欄位處理函數
     * @param array $field_values
     */
    function setFieldValues(array $field_values) {
        foreach ($field_values as $key => $one){
            if (!array_key_exists($key, $this->field_values)){
                throw new Exception($key."不存在");//判斷前端傳來的數據是否合理
            }
        }
        parent::setFieldValues($field_values);
    }
}

實例:

// 對於GameDetail表的操作
$detail_model = new GameDetailModel();
// 查詢
$detail_model->setFields('DId');
$detail_model->setWhere("1=1");
$detail_model->setOrderBy("DId DESC");
$detail_model->setLimit("1");
$insert_id = $detail_model->getListByWhere();

// 更新 data的key需要和Model裡面設置的對照 也就是資料庫的欄位
$data = array(
        'GameName' => $name,
        'Subject' => $subject,
        'Grade' => $grade,
        'Teach' => $teach,
        'Point' => $point,
        'IsFree' => $free,
        'Detail' => $detail,
        'AddTime' => $_time
);
$detail_model->setPk($id);
$detail_model->updateByPk($detail_model->setFieldValues($data));


// 對於GameImages表的操作
// 插入
$image_fields = array(
        'game_id' => $id,
        'img_url' => $image_path,
        'atime' => $_time,
        'add_user' => $user_id,
);
$images_model = new GameImagesModel();
$images_model->insert($images_model->setFieldValues($image_fields));

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、映射多對一關聯關係。 1.單向的多對一 (1)以 Customer 和 Order 為例:一個用戶可以發出多個訂單,而一個訂單隻能屬於一個客戶。從 Order 到 Customer 是多對一關聯關係。 (2)創建 Customer 和 Order 表。 CREATE TABLE customer ...
  • 一、單向的多對一 1.建表語句 2.Intellij Idea 操作 3.Order.hbm.xml 文件 二、雙向的多對一 1.建表語句和單向的多對一相同 2.Intellij Idea 操作 3.生成的實體 4.hbm 文件 三、基於外鍵的雙向一對一 1.建表語句 2.生成的實體 3.hbm文件 ...
  • 概述 C語言的數據類型有基本類型,構造類型,指針類型,空類型 空類型就是void,指針類型這裡不說,構造類型也不說(數組,結構體,聯合體,枚舉,嵌套),這裡只說基本類型。 基本類型有:短整型(short)、整型(int)、長整型(long)、字元型(char)、單精度浮點型(float)、雙精度浮點 ...
  • 這裡採用夏宇聞教授第十五章的序列檢測為例來學習; 從以上的狀態轉換圖可以寫出狀態機的程式: 以下是測試模塊: 其實這裡也可以採用六個狀態來實現功能: 以下是測試模塊: 也可以用移位寄存器來實現: 1 module seqdet 2 ( 3 input wire x, 4 input wire clk ...
  • 一直在使用Mybatis這個ORM框架,都是使用mybatis里的一些常用功能。今天在項目開發中有個業務是需要限制各個用戶對某些表裡的欄位查詢以及某些欄位是否顯示,如某張表的某些欄位不讓用戶查詢到。這種情況下,就需要構建sql來動態傳入表名、欄位名了。現在對解決方法進行下總結,希望對遇到同樣問題的夥 ...
  • 首先記錄一下異常,以及異常出現的原因和解決方案 異常主要信息: 我說一下我的解決過程 我根據這個異常的提示,跟蹤到AbstractNamedValueMethodArgumentResolver的resolveArgument方法,然後從介面中看到了它的作用,就是將 處理器中的映射方法的參數進行處理 ...
  • 授權獲取二維碼類: 調取實例: ...
  • 一、資源準備 鏈接:http://pan.baidu.com/s/1mh7qUBe 密碼:p4wx 1. virtualbox.box文件放在C盤根目錄上。 2. metadata.json文件放在C盤用戶目錄上。比如我的是 C:\Users\pc 3. Git-2.9.3-64-bit.exe 下 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...