从数据库获取数据转为json格式给程序调用

本文介绍了一个使用PHP实现的电影搜索API,通过连接本地数据库,实现了根据电影名称、类型或年份进行搜索的功能。该API能够返回电影的详细信息,包括名称、类型、年份、播放地址、地区、导演、演员和内容等。
<?php
header("content-Type: text/html; charset=utf-8");//字符编码设置
$servername = "localhost";
$username = "wang_shuchuwenku";
$password = "wang123456";
$dbname = "wang_shuchuwenku";

$tosearch = $_GET['tosearch'];

// 创建连接
$conn =new mysqli($servername, $username, $password, $dbname);
// 检测连接
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

$sql = "

SELECT 
`vod_name` as '名称'
,`vod_class` as '类型'
,`vod_year` as '年份'
,`vod_play_url` as '播放地址'
,`vod_area` as '地区'
,`vod_director` as '导演'
,`vod_actor` as '演员'
,`vod_content` as '内容'  
FROM `mac_vod` 
WHERE  `vod_name` Like '%$tosearch%'  
OR `vod_class` Like '%$tosearch%'  
OR `vod_class` Like '%$tosearch%' 

";
$result = $conn->query($sql);
 //SELECT * FROM `mac_vod`
$arr = array();
// 输出每行数据
while($row = $result-> fetch_assoc()) {
    $count=count($row);//不能在循环语句中,由于每次删除row数组长度都减小
    for($i=0;$i<$count;$i++){
        unset($row[$i]);//删除冗余数据
    }
    array_push($arr,$row);
 
}
//print_r($arr);
echo json_encode($arr,JSON_UNESCAPED_UNICODE);//json编码
$conn->close();
 
?>

假设上面为文件test2.php

放置站点根目录

 

注备:少量数据可用

调用方法:http://  ip或者域名  /test2.php/tosearch?= 搜索内容

 

 

你可以使用 `aiomysql` 异步连接 Apache Doris(兼容 MySQL 协议),执行查询,并将结果转换为标准的 JSON 格式返回。由于 Python 的 `asyncio` 和数据库操作是异步的,最终需要将查询结果序列化为 JSON 可识别的数据结构(如字典列表)。 以下是完整的示例代码: ```python import asyncio import aiomysql import json from typing import List, Dict, Any # Doris 数据库配置 config = { 'host': 'your_doris_host', # 替换为 Doris FE 地址 'port': 9030, # 默认 MySQL 协议端口 'user': 'your_username', # 用户名 'password': 'your_password', # 密码 'database': 'your_database', # 数据库名 'charset': 'utf8mb4', 'autocommit': True, } async def query_doris_as_json(sql: str) -> str: """ 执行 SQL 查询并以 JSON 字符串形式返回结果 """ pool = None try: # 创建连接池 pool = await aiomysql.create_pool(**config, minsize=1, maxsize=5) async with pool.acquire() as conn: async with conn.cursor(aiomysql.DictCursor) as cur: # 使用 DictCursor 直接返回字典 await cur.execute(sql) result: List[Dict[Any, Any]] = await cur.fetchall() # 如果查询无结果,返回空数组 if not result: return json.dumps([], ensure_ascii=False, indent=2) # 转换为 JSON 兼容格式(例如处理 Decimal、bytes 等) json_result: List[Dict[str, Any]] = [] for row in result: cleaned_row = {} for k, v in row.items(): if isinstance(v, (int, str, float, bool, type(None))): cleaned_row[k] = v elif isinstance(v, bytes): cleaned_row[k] = v.decode('utf-8') else: cleaned_row[k] = str(v) # 其他类型转字符串(如 Decimal) json_result.append(cleaned_row) # 序列化为 JSON 字符串 return json.dumps(json_result, ensure_ascii=False, indent=2) except Exception as e: # 错误也返回 JSON 格式 error_msg = {"error": str(e)} return json.dumps(error_msg, ensure_ascii=False, indent=2) finally: if pool: pool.close() await pool.wait_closed() # 示例:运行查询 async def main(): sql = "SELECT * FROM your_table_name LIMIT 10" json_data = await query_doris_as_json(sql) print(json_data) # 运行 if __name__ == '__main__': asyncio.run(main()) ``` --- ### ✅ 说明: 1. **`aiomysql.DictCursor`**: - 使用该游标类可以让每行结果直接以字典形式返回(字段名为 key),便于 JSON 化。 2. **数据类型处理**: - Doris 中某些字段可能返回 `bytes` 或 `Decimal` 类型(如 `DECIMAL` 列),不能直接被 `json.dumps` 序列化。 - 代码中对常见类型做了清洗,非 JSON 原生类型统一转为字符串。 3. **JSON 输出格式**: - 返回的是一个 JSON 字符串,可以直接用于 Web API 响应(如 FastAPI、aiohttp)。 - 使用 `ensure_ascii=False` 支持中文输出。 - `indent=2` 使输出更易读。 4. **异常处理**: - 即使出错,也返回合法的 JSON 字符串(包含 error 字段),方便调用方解析。 5. **资源管理**: - 正确关闭连接池,防止资源泄漏。 --- ### 示例输出(JSON): ```json [ { "id": 1, "name": "张三", "score": "95.5", "create_time": "2024-01-01 12:00:00" }, { "id": 2, "name": "李四", "score": "87.0", "create_time": "2024-01-02 12:00:00" } ] ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wenlong Yang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值