PHP 開發 APP 介面 學習筆記與總結--讀取資料庫方式
阿新 • • 發佈:2018-11-21
方案一:讀取資料庫方式
從資料庫讀取資訊→封裝→生成介面資料
應用場景:
資料時效性比較高的系統
方案二:讀取快取方式
從資料庫獲取資訊(第一次設定快取或快取失效時)→封裝(第一次設定快取或快取失效時)→返回資料
↓ ↑
快取(快取生效時) → → → →
方案三:定時讀取快取方式(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 }