1. 程式人生 > >PHP 開發 APP 介面 學習筆記與總結--讀取資料庫方式

PHP 開發 APP 介面 學習筆記與總結--讀取資料庫方式

方案一:讀取資料庫方式

從資料庫讀取資訊→封裝→生成介面資料

應用場景:

資料時效性比較高的系統

 

方案二:讀取快取方式

從資料庫獲取資訊(第一次設定快取或快取失效時)→封裝(第一次設定快取或快取失效時)→返回資料

                                                                        ↓                                              ↑

                                                                     快取(快取生效時)     →   →    →    →

 

方案三:定時讀取快取方式(crontab 定時任務)

 

                  封裝並返回資料

                          ↑

資料庫→crontab→快取 

                          ↑

                     http 請求

 

=======

方案一:

(安裝Start BlueStacks 安卓模擬器)

流程:

http 請求→伺服器→查詢資料(使用reviewdb庫)→返回資料

db.php:

 1 <?php
 2 /*
 3  * 單例模式連線資料庫
 4  */
 5 class DB{
 6     static private $_instance;    //非public的類的例項的靜態成員變數
 7     static private $_connectSource;    //連線資料庫返回的資源控制代碼
 8     private $_dbConfig = array(
 9         'host'=>'127.0.0.1',
10         'username'=>'root',
11         'pwd'=>'',
12         'database'=>'reviewdb'
13     );
14 
15     private function __construct(){    //非public 的建構函式
16     }
17 
18     static public function getInstance(){    //訪問例項的公共靜態方法
19         if(!self::$_instance instanceof self){
20             self::$_instance = new self();
21         }
22         return self::$_instance;
23     }
24 
25     public function connect(){
26         if(!self::$_connectSource){
27             //連線mysql服務
28             self::$_connectSource = @mysql_connect($this->_dbConfig['host'],$this->_dbConfig['username'],$this->_dbConfig['pwd']);
29             if(!self::$_connectSource){
30                 //丟擲異常
31                 throw new Exception('mysql connect error'.mysql_error());
32             }
33             //選擇資料庫
34             mysql_select_db($this->_dbConfig['database'],self::$_connectSource);
35             //設定字符集
36             mysql_query('set names "UTF8"',self::$_connectSource);
37         }
38         return self::$_connectSource; //返回資源
39     }
40 }

list.php

 1 <?php
 2 require_once 'response.php';
 3 require_once 'db.php';
 4 
 5 $page = isset($_GET['page'])?$_GET['page']:1;
 6 $pageSize = isset($_GET['pageSize'])?$_GET['pageSize']:1;
 7 if(!is_numeric($page) || !is_numeric($pageSize)){
 8     return @Response::show(401,'資料不合法');
 9 }
10 
11 $offset = ($page-1)*$pageSize; //每頁起始數
12 $sql = 'select * from review where is_enabled = 1 order by creation_time desc limit '.$offset.','.$pageSize;
13 
14 #捕獲異常
15 try{
16     $connect = DB::getInstance()->connect();
17 }catch(Exception $e){
18     return Response::show(403,'資料庫連線失敗');
19 }
20 
21 $res = mysql_query($sql,$connect);
22 $vals = array();
23 while($val = mysql_fetch_assoc($res)){
24     $vals[] = $val; //二維陣列
25 }
26 
27 if($vals){
28     return Response::show(200,'首頁資料獲取成功',$vals);
29 }else{
30     return Response::show(400,'首頁資料獲取失敗',$vals);
31 }

response.php

  1 <?php
  2 
  3 class Response{
  4     const JSON = 'json';
  5     //封裝的綜合方法,預設的資料型別為json
  6     public static function show($code,$message = '',$data = '',$type = self::JSON){
  7         
  8         if(!is_numeric($code)){
  9             return '';
 10         }
 11         //供測試陣列使用
 12         $result = array(
 13             'code' => $code,
 14             'message' => $message,
 15             'data' => $data
 16         );
 17         //通過get引數判斷通訊資料型別
 18         $typelist = array('json','xml','array'); // array為測試使用
 19         if(isset($_GET['type'])){
 20             if(in_array(strtolower($_GET['type']),$typelist)){
 21                 $type = strtolower($_GET['type']);
 22             }else{
 23                 $type = self::JSON;
 24             }
 25         }else{
 26             $type = self::JSON;
 27         }
 28 
 29         if($type == 'json'){
 30             self::json($code,$message,$data);
 31         }else if($type == 'xml'){
 32             self::xml($code,$message,$data);
 33         }else if($type == 'array'){
 34             var_dump($result);    //僅供測試
 35         }
 36     }
 37 
 38     /**
 39     * 按json方式輸出通訊資料
 40     * @param integer $code 狀態碼
 41     * @param string $message 提示資訊
 42     * @param array $data 資料
 43     * return string
 44     */
 45     //設定靜態方法
 46     public static function json($code,$message = '',$data = array()){
 47         if(!is_numeric($code)){
 48             return '';
 49         }
 50         //狀態碼、資訊、資料組成的新陣列
 51         $result = array(
 52             'code' => $code,
 53             'message' => $message,
 54             'data' => $data
 55         );
 56 
 57         echo json_encode($result);
 58         exit();
 59     }
 60 
 61     /**
 62     * 按 xml 方式輸出通訊資料
 63     * @param integer $code 狀態碼
 64     * @param string $message 提示資訊
 65     * @param array $data 資料
 66     * return string
 67     */
 68     public static function xml($code,$message,$data){
 69 
 70         if(!is_numeric($code)){
 71             return '';
 72         }
 73 
 74         $result = array(
 75             'code' => $code,
 76             'message' => $message,
 77             'data' => $data
 78         );
 79 
 80         //修改 http 頭資訊
 81         header("Content-Type:text/xml");
 82         //xml頭資訊
 83         $xml = "<?xml version='1.0' encoding='utf-8'?>";
 84         //根節點開始標籤
 85         $xml .= "<root>";
 86 
 87         $xml .= self::xmlToEncode($result);
 88 
 89         //根節點結束標籤
 90         $xml .= "</root>";
 91 
 92         echo $xml;
 93         exit();
 94     }
 95 
 96     //解析$result至xml
 97     public static function xmlToEncode($data){
 98         $xml = $attr = "";
 99         foreach($data as $k=>$v){
100             //如果$k是數字(data(code,message,data中的data)資料裡面還含有索引陣列),要進行如下判斷
101             if(is_numeric($k)){
102                 $attr = "id='{$k}'";
103                 $k = 'item ';
104             }
105 
106             $xml .= "<{$k}{$attr}>";
107             //如果$v是陣列,則遞迴呼叫該方法
108             if(is_array($v)){
109                 $xml .= self::xmlToEncode($v);
110             }else{
111                 $xml .= $v;
112             }
113             $xml .= "</{$k}>";
114         }
115 
116         return $xml;
117     }
118 }