国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

php數據庫寫入操作類

2024-09-04 11:44:15
字體:
來源:轉載
供稿:網友

有三個類:

1,過濾輸入,輕量級的 class input_filter,負責將參數,如$_GET,$_POST 這些過濾,返回值類型為 數組,用作 made_sql 類的參數.

2,轉換成SQL語句 class made_sql,參數的類型為數組和表名(字符串),數組的鍵名為表的列名,值為插入值.返回值類型為 字符串,用作 mysql ->query方法的參數.

3,數據庫查詢 class mysql 用到了單列模式,用靜態方法來獲取對象,具體參看 instanceof操作符的作用.

1,過濾輸入 class input_filter 類代碼如下:

  1.   class input_filter 
  2.   { 
  3.    
  4.        private $input_all// 要過濾的數組 
  5.        private $rustle;     // 過濾后的結果 
  6.         
  7.       //構造函數 參數可以是$_GET or $_POST 這些 
  8.      public function __construct($input_C)  
  9.      { 
  10.          if(is_array($input_C)) 
  11.               $this->input_all = $input_C ; 
  12.          else 
  13.               echo 'Parameter is not valid';  
  14.           
  15.          //初始化,不然后面第一次合并數組PHP不知道這是什么類型       
  16.          $this->rustle = array();   
  17.      } 
  18.        
  19.      private function filter_arr()  // 主函數  
  20.      { 
  21.           
  22.          foreach ($this->input_all as  $key_input => $val_input
  23.          { 
  24.              //如果鍵名不是字符串,那么返回錯誤信息 
  25.              // for key 
  26.              if(!is_string($key_input))  // error 
  27.                 { 
  28.                   echo 'This key is not string'
  29.                   return false; 
  30.                 } 
  31.              // The # is mysql Note .   
  32.              $key_one = str_replace('#','',$key_input);  
  33.              $key = htmlspecialchars($key_one,ENT_QUOTES,'UTF-8'); 
  34.                
  35.              // 我沒找 # 的HTML轉義符,所以用空代替 
  36.              $val_one = str_replace('#','',$val_input); 
  37.              // 這個函數只轉化 < > ' "  ,還有個類似函數會轉義所有符號 
  38.              $val = htmlspecialchars($val_one,ENT_QUOTES,'UTF-8'); 
  39.               
  40.              // merger       
  41.              $rustle_one = array($key=>$val); 
  42.              //合并數組 
  43.              $this->rustle = array_merge($this->rustle,$rustle_one); 
  44.          } 
  45.           
  46.      } 
  47.       
  48.      //這個函數有點多余,留下以后擴展用 
  49.      public function get_filter_rustle() 
  50.      {//開源代碼Vevb.com 
  51.          $this->filter_arr(); 
  52.          return  $this->rustle ; 
  53.      } 
  54.  
  55.  } 
  56.  
  57. 調用方法: 
  58.  
  59. $filter = new filter_input($_GET) ; // or $_POST 
  60. $input_data = $filter->get_filter(); 

2,轉換成SQL語句,class madesql類代碼如下:

  1. class madesql 
  2.     { 
  3.         private $Cnow_ary;   // type array  傳入的參數 
  4.         private $Cname_str
  5.          
  6.         private $insert_sql;  //最終的sql語句  string type 
  7.          
  8.         
  9.  
  10.   
  11.         
  12.        public function  __construct($Cary,$Cname
  13.        { 
  14.           //檢查傳入參數類型是否為數組 
  15.           if (! is_array($Cary))   
  16.               return false;  
  17.           else 
  18.               $this->Cnow_ary = $Cary;  // 寫入的值 
  19.          
  20.           $this->Cname_str = $Cname;  // 數據庫表名稱  
  21.          
  22.  
  23.        } 
  24.         
  25.        private function setSql()  // 主函數 ,生產SQL語句 
  26.        { 
  27.     
  28.             foreach ( $this->Cnow_ary as  $key_ary => $val_ary ) 
  29.             { 
  30.                 $cols_sql = $cols_sql.','.$key_ary//列名組合 
  31.                 $vals_sql = $vals_sql.', ''.$val_ary.''' ; //值 組合 
  32.             } 
  33.              // 因為前面foreach的算法有點問題,第一個字符是逗號 
  34.              // 所以用sunstr_replace()刪除 ,自第一位起(0),只替換一個字符(1)     
  35.              $cols_sql = substr_replace($vals_sql,'',0,1);    
  36.              $vals_sql = substr_replace($vals_sql,'',0,1); 
  37.                
  38.              $this->insert_sql =  
  39.              'INSERT INTO '.$this->Cname_str.' ( ' 
  40.                                 .$cols_sql.' ) VALUES ( '.$vals_sql.' )'// 語句成型 
  41.        } 
  42.        //擴展用 
  43.        public function getSql() 
  44.        { 
  45.            $this->setSql(); 
  46.            return $this->insert_sql; 
  47.     } 

3,數據庫查詢,mysql類代碼如下:

數據庫查詢類是參照書上的單列模式,用靜態方法獲取對象,這樣在一個腳本里只有一個數據庫查詢類的實例.我想單例模式用于這個類還是有點用的.

  1. class mysql 
  2.      { 
  3.          private $connect;  
  4.          static  $objectMysql// 存放對象 
  5.           
  6.          private function  __construct()  
  7.  
  8.          {     
  9.             // 創建對象的時候這個構造函數會被調用,用來初始化 
  10.             $connect = mysql_connect('db address','password','dbname'); 
  11.            $this->db = mysql_select_db('db',$connect);     
  12.         } 
  13.   
  14.         public static function Mysql_object() 
  15.         {     
  16.             //instanceof 操作符用于檢查對象是否屬于某個類或者接口的實例。我說的不是很規范... 
  17.            //如果$objectMysql不是mysql(self)的實例,那么就創建一個 
  18.             if(! self::$objectMysql instanceof self) 
  19.                  self::$objectMysql = new mysql(); 
  20.   
  21.             //這時候的$objectMysql就已經是一個對象 
  22.             return self::$objectMysql;    
  23.         } 
  24.         public function query($sql
  25.         { 
  26.             return mysql_query($sql,$this->db); 
  27.         } 
  28.    
  29.   } 

歸納一下使用方法:

  1. $filter = new filter_input($_GET) ; // or $_POST http://www.111cn.net  
  2. $input_data = $filter->get_filter();  
  3.  
  4. $madeSql = new madesql($input_data,'tableName'); 
  5. $sql = $madeSql->getSql(); 
  6.  
  7. $mysql = mysql::Mysql_object() ;  
  8. if$mysql->query($sql) ) 
  9.     echo 'Ok'
  10. lse 
  11.    echo 'failure'

只需要這幾行調用代碼即可以完成寫入數據庫的操作.

另外再說一下構造函數的私有公有問題,書上的mysql單例模式中構造函數是聲明為了private,而沒有單例模式的類如此則會產生編譯錯誤,即 PHP 不能創建一個對象,查了下.

原因在于創建對象往往在類外面進行,這樣就產生了無法訪問構造函數的問題,而單列模式是在自身類中創建對象,因此訪問private方法沒有限制.

原先以為單例模式只是防止創建相同的對象,現在看來單例模式可以將構造函數封裝起來,確實提高了安全性.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 彰武县| 清远市| 青海省| 永仁县| 定州市| 天水市| 富川| 新昌县| 鹰潭市| 紫金县| 邯郸县| 内乡县| 崇明县| 红安县| 义马市| 荆州市| 锡林郭勒盟| 利津县| 苏尼特左旗| 桃园市| 永新县| 凉山| 普兰店市| 泊头市| 崇仁县| 全州县| 商南县| 喀喇沁旗| 郑州市| 元朗区| 弋阳县| 盖州市| 阜康市| 华宁县| 怀安县| 浠水县| 岗巴县| 全南县| 清丰县| 贵阳市| 兰州市|