You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

新手开发者求助: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 18:06:16