漏刻有时API接口实战开发系列(12):php-mysql语句开发

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 漏刻有时API接口实战开发系列(12):php-mysql语句开发

项目拓展性的重要标准就是API接口,根据项目的需要,实时开发对应API接口来延展项目的需求。本案例是多个项目开发经验的总结,便于后期复盘,汲取经验。


1.跨表查询API

下面API接口是一个综合性极强的API接口,涉及


跨表查询功能;

关键词筛选功能;

layui后台动态翻页功能;

public function getExpertMyProject()
    {
        global $db, $res;
        dbc();
        @$user_city = get_param("user_city");
        @$user_area = get_param("user_area");
        @$pro_category = get_param("pro_category");
        @$pro_name = get_param("pro_name");
        @$pro_serial = get_param("pro_serial");
        @$pro_declarant = get_param("pro_declarant");
        @$pro_condition = $_GET["pro_condition"];
        @$pro_types = $_GET["pro_types"];
        @$p = $_GET['page'] == "" ? 1 : $_GET['page'];
        @$pagesize = $_GET['limit'] == "" ? 15 : $_GET['limit'];
        @$limit = ($p - 1) * $pagesize;
        $sql = "select a.pro_id,a.user_id,MAX(a.ex_times) as ex_times,b.pro_id,b.pro_types,b.pro_audit,b.pro_name,b.pro_serial,b.pro_category,b.pro_condition,b.pro_declarant FROM " . $db->table('expert') . " AS a, " . $db->table('project') . " AS b WHERE a.user_id =" . $_COOKIE['user_id'] . " AND a.pro_id = b.pro_id ";
        if ($user_city != "") {
            $sql .= " AND a.user_city = '" . $user_city . "'";
        }
        if ($user_area != "") {
            $sql .= " AND a.user_city = b.user_city AND a.user_area = '" . $user_area . "'";
        }
        if ($pro_types != "") {
            $sql .= " AND b.pro_types = " . $pro_types;
        }
        if ($pro_condition != "") {
            $sql .= " AND b.pro_condition = " . $pro_condition;
        }
        if ($pro_category != "") {
            $sql .= " AND b.pro_category like '%" . $pro_category . "%'";
        }
        if ($pro_name != "") {
            $sql .= " AND b.pro_name like '%" . $pro_name . "%'";
        }
        if ($pro_serial != "") {
            $sql .= " AND b.pro_serial like '%" . $pro_serial . "%'";
        }
        if ($pro_declarant != "") {
            $sql .= " AND b.pro_declarant like '%" . $pro_declarant . "%'";
        }
        $sql .= " GROUP BY a.pro_id ORDER BY a.ex_id DESC LIMIT " . $limit . "," . $pagesize;
        $row = $db->queryall($sql);
        //获取总记录;
        $sql_c = "select a.pro_id,MAX(a.ex_times) AS ex_times,b.pro_id FROM " . $db->table('expert') . " AS a," . $db->table('project') . " AS b WHERE a.pro_id = b.pro_id";//  AND b.pro_status = 1
        //设置筛选条件;
        if ($_COOKIE['dbRoles'] == 2) {//县管理员
            $sql_c .= " AND a.user_city = b.user_city AND a.user_area = b.user_area";
        }
        if ($_COOKIE['dbRoles'] == 3) {//市管理员
            $sql_c .= " AND a.user_city = b.user_city";
        }
        if ($_COOKIE['dbRoles'] == 4) {//省管理员
            $sql_c .= " AND a.user_province = b.user_province";
        }
        if ($pro_types != "") {
            $sql_c .= " AND b.pro_types = " . $pro_types;
        }
        if ($pro_condition != "") {
            $sql_c .= " AND b.pro_condition = " . $pro_condition;
        }
        if ($user_city != "") {
            $sql_c .= " AND a.user_city = '" . $user_city . "'";
        }
        if ($user_area != "") {
            $sql_c .= " AND a.user_area = '" . $user_area . "'";
        }
        if ($pro_category != "") {
            $sql_c .= " AND b.pro_category like '%" . $pro_category . "%'";
        }
        if ($pro_name != "") {
            $sql_c .= " AND b.pro_name like '%" . $pro_name . "%'";
        }
        if ($pro_serial != "") {
            $sql_c .= " AND b.pro_serial like '%" . $pro_serial . "%'";
        }
        if ($pro_declarant != "") {
            $sql_c .= " AND b.pro_declarant like '%" . $pro_declarant . "%'";
        }
        $sql_c .= " GROUP BY a.pro_id ORDER BY a.ex_id DESC";
        $row_c = $db->queryall($sql_c);
        /*信息输出*/
        $res['code'] = 0;
        $res['msg'] = "OK";
        $res['count'] = count($row_c);
        $res["data"] = $row;
        die(json_encode_lockdata($res));
    }


2.地图下钻API接口

传递不同的地区参数,获取对应的区域数据。例如:省级–地市级,二级下钻。默认读取省级数据,当传递地级市名称的时候,获取区县级数据。

    public function getProjectMap()
    {
        global $db, $res;
        dbc();
        @$user_city = get_param("user_city");
        if ($user_city != "") {
            $sql = "select user_city,user_area,COUNT(CASE pro_status WHEN '2' THEN 2 END) AS total FROM " . $db->table('project') . " WHERE 1";
            $sql .= " AND user_city ='" . $user_city . "'";
            $sql .= " GROUP BY user_area";
        } else {
            $sql = "select user_city,COUNT(CASE pro_status WHEN '2' THEN 2 END) AS total FROM " . $db->table('project') . " WHERE 1";
            $sql .= " GROUP BY user_city";
        }
        $row = $db->queryall($sql);
        $res['msg'] = "OK";
        $res["data"] = $row;
        die(json_encode_lockdata($res));
    }


3.循环读取API

  //总站-城市站点排名信息表;
    public function getCityInfo()
    {
        global $db, $res;
        dbc();
        @$p = $_GET['page'] == "" ? 1 : $_GET['page'];//获取用户选择的页码
        @$pagesize = $_GET['limit'] == "" ? 10 : $_GET['limit'];//获取用户选择的每页显示多少条数据
        @$keys = $_GET['keys'];//站点Id
        @$fromTime = $_GET['fromTime'];//开始时间
        @$toTime = $_GET['toTime'];//结束时间
        @$limit = ($p - 1) * $pagesize;//偏移量
        //筛选全部记录并随前端自动分页展示;
        $sql = "select a.uniacid,a.name,a.dpopen,a.short_name from " . $db->table('set_basic') . " AS a where a.dpopen = 1";
        //按照站点筛选;
        IF ($keys != "") {
            $sql .= " AND a.uniacid = " . $keys;
        }
        $sql .= " ORDER BY a.uniacid DESC";
        $sql .= " LIMIT " . $limit . "," . $pagesize;
        $row = $db->queryall($sql);
        //获取总记录数量;
        $sql_c = "select a.uniacid,a.name,a.dpopen,a.short_name from " . $db->table('set_basic') . " AS a where a.dpopen = 1";
        //按照站点筛选;
        IF ($keys != "") {
            $sql_c .= " AND a.uniacid = " . $keys;
        }
        $sql_c .= " ORDER BY a.uniacid DESC";
        $row_c = $db->queryall($sql_c);
        $count = count($row_c);
        //获取对应站点的销量及对应的item;
        foreach ($row as $k => $v) {
            $sql_p = "select COUNT(a.id) AS transTotal,SUM(a.should_paid) AS totalPays,COUNT(DISTINCT a.user_id) AS totalUser,a.paid_at,a.uniacid,SUM(a.all_num) AS totalAmount from " . $db->table('orders') . " AS a";
            $sql_p .= " WHERE a.status <> '-128' AND a.uniacid =" . $v['uniacid'];//AND a.status <> '-126'
            //按照时间筛选;
            IF ($fromTime != "") {
                $sql_p .= " AND date_format(a.paid_at,'%Y-%m-%d') >= '$fromTime'";
            }
            IF ($toTime != "") {
                $sql_p .= " AND date_format(a.paid_at,'%Y-%m-%d') <= '$toTime'";
            }
            $sql_p .= " GROUP BY a.uniacid";
            $row[$k]["products"] = $db->queryall($sql_p);
        }
        //获取对应站点团长的数量;
        foreach ($row as $k => $v) {
            $sql_l = "select IFNULL(COUNT(id),0) AS leaderTotal from " . $db->table('leader');
            $sql_l .= " WHERE created_at <> '' AND uniacid =" . $v['uniacid'];//AND server = 1 AND legitimate = 1
            //按照时间筛选;
            IF ($fromTime != "") {
                $sql_l .= " AND date_format(created_at,'%Y-%m-%d') >= '$fromTime'";
            }
            IF ($toTime != "") {
                $sql_l .= " AND date_format(created_at,'%Y-%m-%d') <= '$toTime'";
            }
            $sql_l .= " GROUP BY uniacid";
            $row[$k]["leader"] = $db->queryall($sql_l);
        }
        //获取对应的站点会员数量;
        foreach ($row as $k => $v) {
            $sql_m = "select COUNT(id) AS memberTotal from " . $db->table('member');
            $sql_m .= " WHERE created_at <> '' AND legitimate = 1 AND uniacid =" . $v['uniacid'];
            //按照时间筛选;
            IF ($fromTime != "") {
                $sql_m .= " AND date_format(created_at,'%Y-%m-%d') >= '$fromTime'";
            }
            IF ($toTime != "") {
                $sql_m .= " AND date_format(created_at,'%Y-%m-%d') <= '$toTime'";
            }
            $sql_m .= " GROUP BY uniacid";
            $row[$k]["member"] = $db->queryall($sql_m);
        }
        $res['code'] = 0;
        $res['count'] = $count;
        $res['msg'] = "";
        $res["data"] = $row;
        die(json_encode_lockdata($res));
    }


4.日期条件筛选判断API

 //会员排名;
    public function getMemberRank()
    {
        global $db, $res;
        dbc();
        @$CR_days = $_POST['days'];
        @$limitNum = $_POST['limitNum'];
        if ($limitNum == "") {
            $limitNum = "10";
        }
        $sql = "select SUM(a.should_paid) AS totalPays,a.user_id,b.id,b.nickname as name from " . $db->table('orders');
        $sql .= " as a, " . $db->table('member') . " as b where b.id= a.user_id AND a.paid_at <> ''";
        switch ($CR_days) {
            case -1;
                $sql .= "  AND TO_DAYS(CURDATE()) - TO_DAYS(date_format(a.paid_at,'%Y-%m-%d')) = 1";
                break;
            case 0;
                $sql .= "  AND date_format(a.paid_at,'%Y-%m-%d') = CURDATE()";
                break;
            case 7;
                $sql .= "  AND DATE_SUB(CURDATE(), INTERVAL 6 DAY) <= date(a.paid_at)";
                break;
            case 30;
                $sql .= "  AND DATE_SUB(CURDATE(), INTERVAL 29 DAY) <= date(a.paid_at)";
                break;
            case 2;//本月,修改 BY jieji007,2020-08-31
                $sql .= "  AND date_format(a.paid_at,'%Y-%m') = date_format(CURDATE(),'%Y-%m')";
                break;
            case 3;//上月,修改 BY jieji007,2020-08-31
                $sql .= "  AND date_format(a.paid_at,'%Y-%m') = date_format(DATE_SUB(CURDATE(), INTERVAL 1 MONTH),'%Y-%m')";
                break;
            case "100";//全部信息;
                break;
            default:
                $sql .= "  AND date_format(a.paid_at,'%Y-%m-%d') = CURDATE()";
        }
        if (@$_COOKIE['Controller'] == "-1") {
            $sql .= " AND a.uniacid = " . $_COOKIE['uniacid'];
        }
        $sql .= " GROUP BY a.user_id ORDER BY totalPays DESC";
        $sql .= " LIMIT " . $limitNum;
        $row = $db->queryall($sql);
        $res["data"] = $row;
        die(json_encode_lockdata($res));
    }


5.数据更新API

通过该API实现对数据库数据进行增改删的动作。

    public function updateUser()
    {
        global $db, $res;
        dbc();
        @$user_id = get_param("user_id");
        @$user_name = get_param("user_name");
        @$user_phone = get_param("user_phone");
        @$user_roles = get_param("user_roles");
        @$user_surveyor_type = get_param("user_surveyor_type");
        @$user_expert_type = get_param("user_expert_type");
        @$user_manage_type = get_param("user_manage_type");
        @$user_source = get_param("user_source");
        $db->update('user', array('user_name' => $user_name, 'user_phone' => $user_phone, 'user_roles' => $user_roles, 'user_surveyor_type' => $user_surveyor_type, 'user_expert_type' => $user_expert_type, 'user_manage_type' => $user_manage_type, 'user_source' => $user_source), array("user_id" => $user_id));
        $res['msg'] = "OK";
        $res["data"] = $user_id . "-信息更新成功.";
        die(json_encode_lockdata($res));
    }


6.创建数据库分表API:

当数据超过一定的数据量时,需要对mysql数据库进行分库分表。

判断数据表名,是否重复

        $row = $db->fetch('subtables', '*', array('tb_name' => trim(addslashes($tb_name))), ' tb_id DESC');
        if ($row) {
            $res['code'] = 0;
            $res['msg'] = "数据表名已存在,请更换名称。";
            die(json_encode_lockdata($res));
        }

创建新的数据表

//创建分表;
        $sql = "CREATE TABLE IF NOT EXISTS `" . $CONF['db_prefix'] . $tb_name . "` (
        `res_id` int(10) NOT NULL COMMENT 'id',
        `room_id` int(11) DEFAULT NULL COMMENT '房间号',
        `data_id` varchar(64) DEFAULT NULL COMMENT '同步id',
        `room_lnglat` varchar(255) DEFAULT NULL,
         `room_address` varchar(255) DEFAULT NULL,
        `room_depart` varchar(255) DEFAULT NULL,
        `room_floor` varchar(64) DEFAULT NULL COMMENT '楼层',
        `room_num` varchar(255) DEFAULT NULL COMMENT '房号',
        `res_name` varchar(255) DEFAULT NULL COMMENT '姓名',
        `res_mobile` varchar(32) DEFAULT NULL COMMENT '手机',
        `res_persons` int(2) DEFAULT NULL COMMENT '被困人数',
        `res_task` varchar(255) DEFAULT NULL COMMENT '任务领取',
        `res_status` varchar(255) DEFAULT NULL COMMENT '救援情况',
        `user_name` varchar(10) DEFAULT NULL COMMENT '提交人',
        `submit_time` int(11) DEFAULT NULL COMMENT '提交时间',
        `update_time` int(11) DEFAULT NULL COMMENT '更新时间'
        ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='码上救援';";
        $row = $db->queryall($sql);
        $res['code'] = 1;
        $res['msg'] = "数据分表创建成功,请在conf/config中配置切换";
        die(json_encode_lockdata($res));


@lockdata.cn

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
14天前
|
Java API Maven
如何使用Java开发抖音API接口?
在数字化时代,社交媒体平台如抖音成为生活的重要部分。本文详细介绍了如何用Java开发抖音API接口,从创建开发者账号、申请API权限、准备开发环境,到编写代码、测试运行及注意事项,全面覆盖了整个开发流程。
58 10
|
15天前
|
API 开发工具 数据库
开发一份API接口,需要注意这些,看你做到了几项
本文介绍了设计API接口时需注意的关键点,包括数字签名、敏感数据加密与脱敏、限流、参数校验、统一返回与异常处理、请求日志记录、幂等设计、数据量限制、异步处理、参数定义、完整文档及开发者对接SDK等内容,旨在帮助开发者设计出安全、稳定、易维护的API接口。
74 6
开发一份API接口,需要注意这些,看你做到了几项
|
11天前
|
缓存 前端开发 API
深入浅出:后端开发中的RESTful API设计原则
【10月更文挑战第43天】在数字化浪潮中,后端开发如同搭建梦想的脚手架,而RESTful API则是连接梦想与现实的桥梁。本文将带你领略API设计的哲学之美,探索如何通过简洁明了的设计,提升开发效率与用户体验。从资源定位到接口约束,从状态转换到性能优化,我们将一步步构建高效、易用、可维护的后端服务。无论你是初涉后端的新手,还是寻求进阶的开发者,这篇文章都将为你的开发之路提供指引。让我们一起走进RESTful API的世界,解锁后端开发的新篇章。
|
18天前
|
存储 SQL API
探索后端开发:构建高效API与数据库交互
【10月更文挑战第36天】在数字化时代,后端开发是连接用户界面和数据存储的桥梁。本文深入探讨如何设计高效的API以及如何实现API与数据库之间的无缝交互,确保数据的一致性和高性能。我们将从基础概念出发,逐步深入到实战技巧,为读者提供一个清晰的后端开发路线图。
|
17天前
|
JSON 前端开发 API
后端开发中的API设计与文档编写指南####
本文探讨了后端开发中API设计的重要性,并详细阐述了如何编写高效、可维护的API接口。通过实际案例分析,文章强调了清晰的API设计对于前后端分离项目的关键作用,以及良好的文档习惯如何促进团队协作和提升开发效率。 ####
|
15天前
|
JSON API 数据格式
如何使用Python开发1688商品详情API接口?
本文介绍了如何使用Python开发1688商品详情API接口,获取商品的标题、价格、销量和评价等详细信息。主要内容包括注册1688开放平台账号、安装必要Python模块、了解API接口、生成签名、编写Python代码、解析返回数据以及错误处理和日志记录。通过这些步骤,开发者可以轻松地集成1688商品数据到自己的应用中。
30 1
|
18天前
|
监控 搜索推荐 安全
探究亚马逊详情API接口:开发与应用
在数字化时代,亚马逊作为全球领先的电商平台,为商家和消费者提供了丰富的商品信息和便捷的购物体验。本文深入探讨了亚马逊详情API接口的获取与运用,帮助开发者和商家实时监控商品数据、分析市场趋势、优化价格策略、分析竞争对手、构建推荐系统及自动化营销工具,从而在竞争中占据优势。文章还提供了Python调用示例和注意事项,确保API使用的安全与高效。
45 3
|
12天前
|
Web App开发 人工智能 自然语言处理
WebChat:开源的网页内容增强问答 AI 助手,基于 Chrome 扩展的最佳实践开发,支持自定义 API 和本地大模型
WebChat 是一个基于 Chrome 扩展开发的 AI 助手,能够帮助用户理解和分析当前网页的内容,支持自定义 API 和本地大模型。
39 0
|
13天前
|
数据采集 自然语言处理 搜索推荐
淘宝评价API接口的开发与应用
在数字化商业时代,数据成为企业提升竞争力的关键资源。淘宝作为电商巨头,其商品评论数据极具价值。本文详细介绍了淘宝评价API接口的开发流程与应用场景,从注册账号、获取密钥到实际调用和数据解析,再到商品分析、店铺管理、个性化推荐等多个方面,全面解析了技术细节与实践方法,为企业和开发者提供了宝贵的技术支持和数据资源。
67 0
|
17天前
|
缓存 前端开发 API
探索后端开发中的API设计原则
【10月更文挑战第37天】本文旨在引导读者理解API设计的核心理念,通过简明的语言和直观的示例,揭示如何构建高效、稳定且易于维护的后端接口。我们将深入浅出地探讨RESTful API的设计规范,并通过一个简易的代码样例,展示如何在实战中应用这些原则。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的参考和启示。