自定義MVC框架之工具類-模型類

来源:https://www.cnblogs.com/ghostwu/archive/2018/03/03/8502878.html
-Advertisement-
Play Games

截止目前已經改造了5個類: ubuntu:通過封裝驗證碼類庫一步步安裝php的gd擴展 自定義MVC框架之工具類-分頁類的封裝 自定義MVC框架之工具類-文件上傳類 自定義MVC框架之工具類-圖像處理類 這個模型類支持以下功能: >連貫操作,js叫鏈式操作,連貫操作的函數可以打亂順序,最後一個函數必 ...


截止目前已經改造了5個類:

ubuntu:通過封裝驗證碼類庫一步步安裝php的gd擴展

自定義MVC框架之工具類-分頁類的封裝

自定義MVC框架之工具類-文件上傳類

自定義MVC框架之工具類-圖像處理類

這個模型類支持以下功能:

>連貫操作,js叫鏈式操作,連貫操作的函數可以打亂順序,最後一個函數必須是執行語句的那個函數,如select, delete, update, add等

如 $db->table( 'user' )->where( 'id=1' )->select()

等等

->支持擴展各種子類模型,命名如: UserModel, 也可以用其他方式的,跟表名稱不同的Model命名,如MyUserModel等

  1 <?php
  2 
  3 class Model {
  4     protected $dbHost; //主機
  5     protected $dbUser; //用戶名
  6     protected $dbPwd; //密碼
  7     protected $dbName; //資料庫名
  8 
  9     protected $prefix; //表首碼
 10     protected $tbName; //表名稱
 11     protected $charset; //字元集
 12     protected $link; //資料庫連接資源
 13     protected $sql; //拼接的sql語句
 14     protected $options; //sql查詢條件
 15 
 16 
 17     public function __construct( $config ){
 18         $this->dbHost = $config['db_host'];
 19         $this->dbUser = $config['db_user'];
 20         $this->dbPwd = $config['db_pwd'];
 21         $this->dbName = $config['db_name'];
 22         $this->prefix = $config['prefix'];
 23         $this->charset = $config['charset'];
 24 
 25         $this->link = $this->connect();
 26 
 27         $this->tbName = $this->getTableName();
 28 
 29         $this->initOptions();
 30     }
 31 
 32     protected function initOptions(){
 33         $sqlKey = [ 'where', 'group', 'having', 'limit', 'order', 'field', 'table' ];
 34         foreach ( $sqlKey as $key => $value ) {
 35             $this->options[$value] = '';
 36             if( $value == 'table' ) {
 37                 $this->options[$value] = $this->tbName;
 38             }
 39         }
 40     }
 41 
 42     public function table( $tbName ) {
 43         if( !empty( $tbName ) ) {
 44             $this->options['table'] = $tbName;
 45         }
 46         return $this;
 47     }
 48     
 49     public function limit( $limit ){        
 50         if( !empty( $limit ) ) {
 51             if( is_string( $limit ) ) {
 52                 $this->options['limit'] = 'limit ' . $limit;
 53             }else if ( is_array( $limit ) ) {
 54                 $this->options['limit'] = 'limit ' . join( ',', $limit );
 55             }    
 56         }
 57         return $this;
 58     }
 59 
 60     public function order( $order ){
 61         if( !empty( $order ) ) {
 62             $this->options['order'] = 'order by ' . $order;
 63         }
 64         return $this;
 65     }
 66 
 67     public function having( $having ){
 68         if( !empty( $group ) ) {
 69             $this->options['having'] = 'having ' . $having;
 70         }
 71         return $this;
 72     }
 73 
 74     public function group( $group ){
 75         if( !empty( $group ) ) {
 76             $this->options['group'] = 'group by ' . $group;
 77         }
 78         return $this;
 79     }
 80     
 81     public function where( $where ){
 82         if( !empty( $where ) ) {
 83             $this->options['where'] = 'where ' . $where;
 84         }
 85         return $this;
 86     }
 87 
 88     public function field( $fields ){
 89         if( !empty( $fields ) ) {
 90             if( is_string( $fields ) ) {
 91                 $this->options['field'] = $fields;
 92             }else if( is_array( $fields ) ){
 93                 $this->options['field'] = join( ',', $fields );    
 94             }
 95         }
 96         return $this;
 97     }
 98 
 99     public function getTableName(){
100         if( !empty( $this->tbName ) ) {
101             return $this->prefix . $this->tbName;
102         }    
103         $className = get_class( $this );
104         //UserModel GoodsModel, 獲取Model前面的字元串(就是表名稱)
105         $tbName = strtolower( substr( $className, 0, -5 ) );
106         return $this->prefix . $this->tbName;
107     }
108 
109     protected function connect(){
110         $link = mysql_connect( $this->dbHost, $this->dbUser, $this->dbPwd );
111         if( !$link ){
112             die( "mysql資料庫連接失敗:" .  mysql_error() );
113         }
114         mysql_select_db( $this->dbName, $link );
115         mysql_query( $this->charset );
116         return $link;
117     }
118 
119     public function select(){
120         $sql = 'SELECT %FIELD% FROM %TABLE% %WHERE% %GROUP% %HAVING% %ORDER% %LIMIT%';
121         $sql = str_replace(
122             ['%FIELD%', '%TABLE%', '%WHERE%', '%GROUP%', '%HAVING%', '%ORDER%', '%LIMIT%'],    
123             [ $this->options['field'], $this->options['table'], $this->options['where'], $this->options['group'], $this->options['having'], $this->options['order'], $this->options['limit'] ],
124             $sql
125         );
126         $this->sql = $sql;    
127         return $this->query( $sql );
128     }
129 
130     public function __get( $key ){
131         if( $key == 'sql' ) {
132             return $this->sql;
133         }else if( $key == 'prefix' ) {
134             return $this->prefix;
135         }
136         return false;
137     }
138     
139     public function query( $sql ){
140         //執行語句之前,清空原來的options保存的sql語句臨時拼接數據
141         $this->initOptions();
142         $res = mysql_query( $sql );
143         $data = array();
144         if( $res && mysql_num_rows( $res ) ) {
145             while( $row = mysql_fetch_assoc( $res ) ){
146                 $data[] = $row;
147             }
148         }
149         return $data;
150     }
151 
152     public function add( $data ){
153         $data = $this->parse( $data );
154         $keys = array_keys( $data );
155         $values = array_values( $data );
156         $sql = 'INSERT INTO %TABLE%(%FIELD%) values(%VALUES%)';
157         $sql = str_replace(
158             [ '%TABLE%', '%FIELD%', '%VALUES%' ],
159             [ $this->options['table'], join( ',', $keys ), join( ',', $values ) ],
160             $sql
161         );
162         $this->sql = $sql;
163         return $this->exec( $sql, true );
164     }
165 
166     public function delete(){
167         $sql = 'DELETE FROM %TABLE% %WHERE%';
168         $sql = str_replace(
169             [ '%TABLE%', '%WHERE%' ],
170             [ $this->options['table'], $this->options['where'] ],
171             $sql
172         );
173         $this->sql = $sql;
174         return $this->exec( $sql );
175     }
176 
177     public function exec( $sql, $isInsert = false ){
178         $this->initOptions();
179         $res = mysql_query( $sql );
180         if( $res !== false ) {
181             if( $isInsert ) {
182                 return mysql_insert_id();
183             }else {
184                 return mysql_affected_rows();
185             }
186         }
187         return false;
188     }
189 
190     public function parse( $data ) {
191         $res = [];
192         foreach( $data as $k => $v ){
193             if( is_string( $v ) ) {
194                 $res[$k] = '"' . $v . '"';
195             }
196         }
197         return $res;
198     }
199 
200     public function update( $data ) {
201         $data = $this->parse( $data );
202         $fieldValue = $this->format( $data );
203         $sql = 'UPDATE %TABLE% SET %FIELD% %WHERE%';
204         $sql = str_replace(
205             [ '%TABLE%', '%FIELD%', '%WHERE%' ],
206             [ $this->options['table'], $fieldValue, $this->options['where'] ],
207             $sql
208         );
209         $this->sql = $sql;
210         return $this->exec( $sql );
211     }
212 
213     //update ghostwu_user set field = value, where ....
214     protected function format( $data ){
215         $res = [];
216         foreach( $data as $k => $v ) {
217             $res[] = $k . '=' . $v;
218         }        
219         return join( ',', $res );
220     }
221 
222     public function __destruct(){
223         mysql_close( $this->link );
224     }
225 
226     public function __call( $funcName, $args ) {
227         $str = substr( $funcName, 0, 5 );
228         $field = substr( $funcName, 5 );
229         if( $str == 'getBy' ) {
230                 echo $args[0];
231             return $this->where( $field . '="' . $args[0] . '"' )->select();
232         }
233         return false;
234     }
235 }
236 $config = [ 
237     'db_host' => 'localhost',
238     'db_user' => 'root',
239     'db_pwd' => '',
240     'prefix' => 'ghostwu_',
241     'db_name' => 'blog',
242     'charset' => 'utf8',
243 ]; 
244 $db = new Model( $config );
245 print_r( $db->field( '*' )->table( $db->prefix . 'users' )->getByName( 'zhangsan' ) );
246 echo $db->sql . PHP_EOL;
247 //$db->table( $db->prefix . 'users' )->where( 'id=1' )->update( [ 'name' => 'david', 'email' => '[email protected]' ] );
248 //echo $db->sql . PHP_EOL;
249 //$db->table( $db->prefix . 'users' )->where( 'id in( 4, 5, 6, 7 )' )->delete();
250 //echo $db->sql . PHP_EOL;
251 //$db->table( $db->prefix . 'users' )->add( ['name' => 'zhangsan', 'email' => '[email protected]'] );
252 /*
253 $list = $db->table( $db->prefix . 'users' )->field( [ 'name', 'email' ] )->where( 'id >= 1' )->order( 'id desc' )->limit( [0, 5] )->select();
254 echo $db->sql . PHP_EOL;
255 print_r( $list );
256  */
257 ?>
View Code

 


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

-Advertisement-
Play Games
更多相關文章
  • CDN 什麼是CDN 初學Web開發的時候,多多少少都會聽過這個名詞 CDN。 CDN在我沒接觸之前,它給我的印象是用來優化網路請求的,我第一次用到CDN的時候是在找JS文件時。當時找不到相對應的JS文件下載地址(之前一般我都是把JS下載下來,然後在項目中引用的。PS:當然了,我覺得大部分初學者都一 ...
  • 覆選框checkbox和單選框radio是web網站里經常會使用到的兩個控制項,那麼在web自動化測試的時候如何利用Selenium來操作這倆控制項呢?今天我們就來簡單入門練習一下! html測試頁面代碼如下: 從HTML代碼看,這裡面的覆選框checkbox和單選框radio都是input標簽,那麼我 ...
  • 解法一: 這種解法使用的是Brute Force演算法,即是暴力搜索匹配,時間複雜度較高 解法二: 這種解法的思想是計算兩個相同的字元之間的長度,好比作一個視窗在字元串上右邊框向右拉伸,若右邊框碰到視窗內已存在的字元,那麼左邊框向右拉伸到到視窗已存在字元的右邊,時間複雜度較低 github地址:htt ...
  • 研究了一些操作系統的概念,研究了I/O模式,著重研究了select、poll、epoll 的區別, ...
  • (一) 字元串 單引號、雙引號、三重引號都可以作為字元串的開始和結束,三重引號可以直接輸入多行字元串。三重引號可能一般是用來寫多行註釋。 (二) r和\ r使字元串成為原始字元串,忽略所有轉義字元。 \是轉義字元。 (三) 字元串下標和切片 (四) 字元串的in和not in (五) 改變大小寫 方 ...
  • 事先聲明,我只是java併發的新手,這篇文章也只是我閱讀《java併發編程的藝術》一書(內容主要涉及前3章)的一些總結和感悟。希望大家能多多討論,對於錯誤的地方還請指出。 0. 簡介 程式的世界是有層次分明的,每層都對外封裝細節而提供一些方式或者說介面來提供功能,甚至是約束功能來換取正確性等等。那麼 ...
  • SpringBoot中關於Mybatis使用的三個問題 轉載請註明源地址:http://www.cnblogs.com/funnyzpc/p/8495453.html 原本是要講講PostgreSQL的一些學習總結的,不巧的是最近一段時間的進度都是一些類似於加減乘除、位移、類型轉換的稍顯小兒科的一些 ...
  • istringstream用於執行C++風格的串流操作。 下麵的示例是使用一個字元串初始化istringstream類,然後再使用>>操作符來依次輸出字元串中的內容。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...