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:

 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

<?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

  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 }

时间: 2024-10-17 07:50:08

PHP 开发 APP 接口 学习笔记与总结 - APP 接口实例 [2] 首页 APP 接口开发方案 ① 读取数据库方式的相关文章

ASP.Net开发基础温故知新学习笔记

申明:本文是学习2014版ASP.Net视频教程的学习笔记,仅供本人复习之用,也没有发布到博客园首页. 一.一般处理程序基础 (1)表单提交注意点: ①GET通过URL,POST通过报文体: ②需在HTML中为表单元素设置name: ③元素id是给Dom用的,name才是提交给服务器用的: (2)请求处理响应模型: ①浏览器发出访问请求→②服务器处理访问请求并返回HTML→③浏览器解析HTML并显示页面 (3)GET与POST的区别:(★★★→重点) ①GET通过URL传值,而POST通过HTT

《Spring3.X企业应用开发实战》学习笔记--DAO和事务

本篇是"<Spring3.X企业应用开发实战>,陈雄华 林开雄著,电子工业出版社,2012.2出版"的学习笔记的第二篇,关于DAO和事务. 本篇从DAO操作,以及事务处理的基本知识谈起,介绍事务本身,以及Spring如何通过注解实现事务. DAO 近几年持久化技术领域异常喧嚣,各种框架如雨后春笋般地冒出,Sun也连接不断的颁布了几个持久化规范. Spring对多个持久化技术提供了持久化支持,包括Hibernate,iBatis,JDO,JPA,TopLink,另外,还通过S

OpenCV(C++接口)学习笔记4-Mat::operator = 的陷阱

当我们想要将一个Mat对象的数据复制给另一个Mat对象时,应该怎么做呢? 我们发现,OpenCV提供了重载运算符Mat::operator = ,那么,是否按照下列语句就可以轻松完成对象的赋值呢? Mat a; Mat b = a; 答案是否定的! 我们可以从reference manual 中看到: Mat::operator = Provides matrix assignment operators. C++: Mat& Mat::operator=(const Mat& m) Pa

OpenCV(C++接口)学习笔记2-像素级的图像操作

1.通过成员函数at(int y, int x)访问 这种方法需要知道像素保存的格式. (1) 这是为模板类型的函数,因为一个函数的返回类型只有在运行时才会知道. (2)这个函数返回的是一个向量即Vector,故有下标的操作. image.at<uchar>(j,i)= 255; 在单通道图像中,采用以上语句可以获取图像(i,j)处的灰度值(注:先行后列,一般用j表示行(rows),i表示列(cols)).如果是灰度图像的话,只需要更改一个数据就可以了.如果是rgb图像的话,就要用"

Go语言学习笔记(一) : 搭建Windows下的Go开发环境

最近突然对Go语言产生了兴趣,主要是因为在使用python的时候遇到了一些不爽的问题,然后发现了Go.Go是Google出的一个动态语言,语法和C++接近,性能也非常的好,而且还支持编译成exe发布,并且不依赖任何虚拟机(其实是打包在exe里面了),这种好语言怎么能够错过?所以便一时兴起,开始学习了起来.由于本人还处于异常小白的阶段,所以文章中可能不免有些错误,欢迎大家各种指正. 安装Go 前往Go语言的官方网站:http://golang.org/, 下载对应平台的安装包.如果是x86的系统可

OpenCV(C++接口)学习笔记1-图像的读取、显示、保存

OpenCV在2.0版本之后添加了C++接口函数,之前学习的都是C语言的接口函数,现在OpenCV已经发展到2.4.9版本了,所以决定学习C++接口函数,跟上节奏. 1.创建图像 cv::Mat image; 采用类cv::Mat来定义图像变量或矩阵变量. 当然你也可以指定图像的大小: cv::Mat img(240,320,CV_8U,cv::Scalar(100)); 参数CV_8U中的U代表unsigned,而S代表signed.对于三通道彩色图像可以用CV_8UC3.你也可以声明16或3

蓝鸥Unity开发基础——类型转换学习笔记

蓝鸥Unity开发基础--类型转换学习笔记 类型转换包括:自动转换+强制转换 一.自动转换 自动转换:由系统自动完成,不会导致数据精度丢失,只能从低精度类型转换高精度类型. 二.强制转换 强制转换:从高精度转向低精度类型需要强制转换,会丢失精度,需要显式地进行转换. 源代码: using System; namespace Lesson07{    class MainClass    {        public static void Main (string[] args)       

php服务器开发之 app客户端首页接口开发(一) 概述及方案一:读取数据库方式开发首页接口

本篇博文主要内容:1.简述app客户端首页接口开发的三种方案 2.实例讲解 方案一:读取数据库方式开发首页接口 /**********************************************************************************************************************************/ 方案一:读取数据库方式开发首页接口 1.从数据库获取消息 2.封装数据 3.生成接口数据 适用场景: 数据时效性高的系统

iOS: 学习笔记, 用代码驱动自动布局实例

iOS自动布局是设置iOS界面的利器. 本实例展示了如何使用自动布局语言设置水平布局, 垂直布局 1. 创建空白iOS项目 2. 添加一个控制器类, 修改YYAppDelegate.m文件 #import "YYAppDelegate.h" #import "YYViewController.h" @implementation YYAppDelegate - (BOOL)application:(UIApplication *)application didFin