新手开发者求助:PHP开发Android API及三表左连接实现
PHP开发Android API及三张表左连接查询指南
一、PHP开发Android API基础步骤
作为新手,按以下流程搭建基础API:
- 环境配置:确保PHP环境(如XAMPP/WAMP)正常运行,MySQL数据库已创建,开启PDO或MySQLi扩展(优先选PDO,安全性更高)
- 数据库连接:编写通用连接文件(如
db.php),用PDO实现安全连接,避免重复编写连接逻辑 - 接口设计:根据Android端需求定义接口,比如:
- 获取菜单列表接口
- 获取分类列表(关联菜单+统计菜谱数)接口
- 获取菜谱详情接口
- 接口实现:每个接口对应独立PHP文件,处理HTTP请求(GET/POST)、执行数据库查询、返回JSON格式数据(Android端易解析)
- 安全防护:用PDO预处理语句防止SQL注入,校验请求参数合法性,必要时处理跨域问题
二、三张表左连接查询实现
三张表关联关系:
menu表的mid对应tbl_category表的menu_id(菜单-分类)tbl_category表的cid对应tbl_recipes表的cat_id(分类-菜谱)tbl_recipes表也有menu_id可直接关联menu表(菜谱-菜单)
1. 分类关联菜单+统计菜谱数
如果需要展示所有分类,同时显示所属菜单信息和该分类下的菜谱数量,用以下左连接查询(保留所有分类,即使无对应菜单或菜谱):
SELECT m.mid, m.menu_Name, m.menu_icon, c.cid, c.category_name, c.category_image, COUNT(DISTINCT r.recipe_id) AS recipes_count FROM tbl_category c LEFT JOIN menu m ON c.menu_id = m.mid LEFT JOIN tbl_recipes r ON c.cid = r.cat_id GROUP BY c.cid ORDER BY c.cid DESC
2. 菜单关联分类+统计总菜谱数
如果要展示所有菜单,统计每个菜单下的分类数量和总菜谱数(包括直接关联菜单的菜谱):
SELECT m.mid, m.menu_Name, m.menu_icon, COUNT(DISTINCT c.cid) AS category_count, COUNT(DISTINCT r.recipe_id) AS total_recipes FROM menu m LEFT JOIN tbl_category c ON m.mid = c.menu_id LEFT JOIN tbl_recipes r ON c.cid = r.cat_id OR m.mid = r.menu_id GROUP BY m.mid ORDER BY m.mid DESC
3. 优化你的原有查询
你之前的查询只关联了分类和菜谱,现在加入菜单关联,同时替换直接拼接$limit的写法(避免SQL注入),用PDO预处理实现:
<?php // 示例:获取分类列表接口 header('Content-Type: application/json'); include 'db.php'; $limit = isset($_GET['limit']) ? (int)$_GET['limit'] : 10; try { $sql = "SELECT c.cid, c.category_name, c.category_image, m.menu_Name, COUNT(DISTINCT r.recipe_id) AS recipes_count FROM tbl_category c LEFT JOIN menu m ON c.menu_id = m.mid LEFT JOIN tbl_recipes r ON c.cid = r.cat_id GROUP BY c.cid ORDER BY c.cid DESC LIMIT :limit"; $stmt = $pdo->prepare($sql); $stmt->bindParam(':limit', $limit, PDO::PARAM_INT); $stmt->execute(); $data = $stmt->fetchAll(PDO::FETCH_ASSOC); echo json_encode([ 'status' => 'success', 'data' => $data ]); } catch(PDOException $e) { echo json_encode([ 'status' => 'error', 'message' => '查询失败:' . $e->getMessage() ]); } ?>
三、通用数据库连接示例(db.php)
<?php $host = 'localhost'; $dbname = '你的数据库名'; $username = 'root'; $password = '你的数据库密码'; try { $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e) { die(json_encode(['status' => 'error', 'message' => '数据库连接失败:' . $e->getMessage()])); } ?>
内容的提问来源于stack exchange,提问作者atozcodes
相关产品推荐
相关产品推荐

