PHP 开发 APP 接口 学习笔记与总结 - APP 接口实例 [2] 首页 APP 接口开发方案 ① 读取数据库方式
方案一:读取数据库方式
从数据库读取信息→封装→生成接口数据
应用场景:
数据时效性比较高的系统
方案二:读取缓存方式
从数据库获取信息(第一次设置缓存或缓存失效时)→封装(第一次设置缓存或缓存失效时)→返回数据
↓ ↑
缓存(缓存生效时) → → → →
方案三:定时读取缓存方式(crontab 定时任务)
封装并返回数据
↑
数据库→crontab→缓存
↑
http 请求
=======
方案一:
(安装Start BlueStacks 安卓模拟器)
流程:
http 请求→服务器→查询数据(使用reviewdb库)→返回数据
修改一下 response.php line:29
if($type == 'json'){
self::json($code,$message,$data);
}else if($type == 'xml'){
self::xml($code,$message,$data);
}else if($type == 'array'){
var_dump($result); //仅供测试
}
line 6:$data = ''
public static function show($code,$message = '',$data = '',$type = self::JSON){
.....
db.php:
<?php
/*
* 单例模式连接数据库
*/
class DB{
static private $_instance; //非public的类的实例的静态成员变量
static private $_connectSource; //连接数据库返回的资源句柄
private $_dbConfig = array(
'host'=>'127.0.0.1',
'username'=>'root',
'pwd'=>'',
'database'=>'reviewdb'
); private function __construct(){ //非public 的构造函数
} static public function getInstance(){ //访问实例的公共静态方法
if(!self::$_instance instanceof self){
self::$_instance = new self();
}
return self::$_instance;
} public function connect(){
if(!self::$_connectSource){
//连接mysql服务
self::$_connectSource = @mysql_connect($this->_dbConfig['host'],$this->_dbConfig['username'],$this->_dbConfig['pwd']);
if(!self::$_connectSource){
//抛出异常
throw new Exception('mysql connect error'.mysql_error());
}
//选择数据库
mysql_select_db($this->_dbConfig['database'],self::$_connectSource);
//设置字符集
mysql_query('set names "UTF8"',self::$_connectSource);
}
return self::$_connectSource; //返回资源
}
}
list.php
<?php
require_once 'response.php';
require_once 'db.php'; $page = isset($_GET['page'])?$_GET['page']:1;
$pageSize = isset($_GET['pageSize'])?$_GET['pageSize']:1;
if(!is_numeric($page) || !is_numeric($pageSize)){
return @Response::show(401,'数据不合法');
} $offset = ($page-1)*$pageSize; //每页起始数
$sql = 'select * from review where is_enabled = 1 order by creation_time desc limit '.$offset.','.$pageSize;
#捕获异常
try{
$connect = DB::getInstance()->connect();
}catch(Exception $e){
return Response::show(403,'数据库连接失败');
} $res = mysql_query($sql,$connect);
$vals = array();
while($val = mysql_fetch_assoc($res)){
$vals[] = $val; //二维数组
} if($vals){
return Response::show(200,'首页数据获取成功',$vals);
}else{
return Response::show(400,'首页数据获取失败',$vals);
}
附 response.php
<?php class Response{
const JSON = 'json';
//封装的综合方法,默认的数据类型为json
public static function show($code,$message = '',$data = '',$type = self::JSON){ if(!is_numeric($code)){
return '';
}
//供测试数组使用
$result = array(
'code' => $code,
'message' => $message,
'data' => $data
);
//通过get参数判断通信数据类型
$typelist = array('json','xml','array'); // array为测试使用
if(isset($_GET['type'])){
if(in_array(strtolower($_GET['type']),$typelist)){
$type = strtolower($_GET['type']);
}else{
$type = self::JSON;
}
}else{
$type = self::JSON;
} if($type == 'json'){
self::json($code,$message,$data);
}else if($type == 'xml'){
self::xml($code,$message,$data);
}else if($type == 'array'){
var_dump($result); //仅供测试
}
} /**
* 按json方式输出通信数据
* @param integer $code 状态码
* @param string $message 提示信息
* @param array $data 数据
* return string
*/
//设置静态方法
public static function json($code,$message = '',$data = array()){
if(!is_numeric($code)){
return '';
}
//状态码、信息、数据组成的新数组
$result = array(
'code' => $code,
'message' => $message,
'data' => $data
); echo json_encode($result);
exit();
} /**
* 按 xml 方式输出通信数据
* @param integer $code 状态码
* @param string $message 提示信息
* @param array $data 数据
* return string
*/
public static function xml($code,$message,$data){ if(!is_numeric($code)){
return '';
} $result = array(
'code' => $code,
'message' => $message,
'data' => $data
); //修改 http 头信息
header("Content-Type:text/xml");
//xml头信息
$xml = "<?xml version='1.0' encoding='utf-8'?>";
//根节点开始标签
$xml .= "<root>"; $xml .= self::xmlToEncode($result); //根节点结束标签
$xml .= "</root>"; echo $xml;
exit();
} //解析$result至xml
public static function xmlToEncode($data){
$xml = $attr = "";
foreach($data as $k=>$v){
//如果$k是数字(data(code,message,data中的data)数据里面还含有索引数组),要进行如下判断
if(is_numeric($k)){
$attr = "id='{$k}'";
$k = 'item ';
} $xml .= "<{$k}{$attr}>";
//如果$v是数组,则递归调用该方法
if(is_array($v)){
$xml .= self::xmlToEncode($v);
}else{
$xml .= $v;
}
$xml .= "</{$k}>";
} return $xml;
}
}
PHP 开发 APP 接口 学习笔记与总结 - APP 接口实例 [2] 首页 APP 接口开发方案 ① 读取数据库方式的更多相关文章
- go语言,golang学习笔记1 官网下载安装,中文社区,开发工具LiteIDE
go语言,golang学习笔记1 官网下载安装,中文社区,开发工具LiteIDE Go语言是谷歌2009发布的专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速 ...
- amazeui学习笔记一(开始使用4)--Web App 相关
amazeui学习笔记一(开始使用4)--Web App 相关 一.总结 1.桌面图标(Touch icon)解决方案:终极方案:link标签的rel和href属性: <link rel=&qu ...
- 《疯狂前端开发讲义jQuery+Angular+Bootstrap前端开发实践》学习笔记
<疯狂前端开发讲义jQuery+Angular+Bootstrap前端开发实践>学习笔记 二〇一九年二月十三日星期三2时28分54秒 前提:本书适合有初步HTML.CSS.JavaScri ...
- python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例
python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...
- OGG学习笔记02-单向复制配置实例
OGG学习笔记02-单向复制配置实例 实验环境: 源端:192.168.1.30,Oracle 10.2.0.5 单实例 目标端:192.168.1.31,Oracle 10.2.0.5 单实例 1. ...
- python3.4学习笔记(十一) 列表、数组实例
python3.4学习笔记(十一) 列表.数组实例 #python列表,数组类型要相同,python不需要指定数据类型,可以把各种类型打包进去#python列表可以包含整数,浮点数,字符串,对象#创建 ...
- PHP 开发 APP 接口 学习笔记与总结 - Redis 缓存
Redis 可以定期将数据备份到磁盘中(持久化),同时不仅仅支持简单的key/value 类型的数据,同时还提供list,set,hash等数据结构的存储:Memcache 只是简单的key/valu ...
- PHP开发APP接口学习笔记
习要点概述1.APP接口简介 2.封装通信接口方法 3.核心技术 4.APP接口实例 服务器和客户端进行接口数据通信:服务器 -->数据库|缓存 -->调用接口 -->客户端 服务器 ...
- PHP 开发 APP 接口 学习笔记与总结 - JSON 结合 XML 方式封装通信接口
要求: 1.在一个类中封装多种数据通信方法(JSON,XML),并且只通过一个入口选择需要的数据通信格式 2.客户端开发工程师可以自行选择数据传输格式(GET 方式) response.php < ...
随机推荐
- mysql_3
日期查询: mysql> select * from member where birthday > '1962-01-01';
- MySQL日常应用和操作记录
整理MySQL日常操作. 1.知道一个字段名,怎样查到它在数据库里的哪张表里? USE Information_schema;SELECT TABLE_NAME FROM COLUMNS WHERE ...
- javascript散列表实现
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- hdu 1728:逃离迷宫(DFS,剪枝)
逃离迷宫 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- fopen()及相关函数使用
函数简介 函数功能:打开一个文件 函数原型:FILE * fopen(const char * path,const char * mode); ],_wfopen 所需库:<stdio.h&g ...
- 简单修改hosts文件加快打开网页速度
这个电脑小技巧的帖子菲菲博客分享如何通过简单一招利用修改系统的hosts文件来实现有效加快浏览器打开网页的速度.尤其是网络繁忙时DNS服务器负担加重的时候效果特别明显,有兴趣就和菲菲一起来学习一下吧, ...
- Android 在资源文件(res/strings.xml)定义一维数组,间接定义二维数组
经常我们会在资源文件(res/strings.xml)定义字符串,一维数组,那定义二维数组?直接定义二维数组没找到,可以间接定义. 其实很简单,看过用过一次就可以记住了,一维数组估计大家经常用到,但是 ...
- [hive小技巧]增加hive并行度
可以通过修改set hive.exec.parallel=true来修改并行度.如果job中并行执行的阶段增多,那么集群利用率会增加.
- 如何选中一个Checkbox,设置无效?
document.all.cb1[0].disabled = true;
- HDU4276 The Ghost Blows Light(树形DP+背包)
题目大概说一棵n个结点树,每个结点都有宝藏,走过每条边要花一定的时间,现在要在t时间内从结点1出发走到结点n,问能获得最多的宝藏是多少. 放了几天的题,今天拿出来集中精力去想,还是想出来了. 首先,树 ...