如何将多个API端点的JSON数据合并存储到同一数据库
解决方案
方式选择说明
两种方案都可实现,对入门阶段更推荐先通过PHP合并两组数据再统一存入数据库,逻辑更简单,不需要额外处理多表关联查询的操作,学习成本更低。
具体实现步骤
1. 用PHP获取两个API的JSON数据
新手优先用file_get_contents实现,代码更简洁:
// 第一个API数据 $api1Url = "你的第一个API地址"; $api1Json = file_get_contents($api1Url); $api1Data = json_decode($api1Json, true); // 转成PHP关联数组 // 第二个API数据 $api2Url = "你的第二个API地址"; $api2Json = file_get_contents($api2Url); $api2Data = json_decode($api2Json, true);
如果API需要传请求头、特殊参数,改用curl实现即可。
2. 通过关联键item name合并两组数据
把第一组数据的item name作为数组索引,方便快速匹配:
// 重组第一组数据,key为item name $formattedData = []; foreach($api1Data as $item) { $itemName = $item['item name']; $formattedData[$itemName] = $item; } // 合并第二组的额外字段 foreach($api2Data as $item) { $itemName = $item['item name']; // 如果存在匹配的item,就把第二组的字段加进去 if(isset($formattedData[$itemName])) { // 把第二组的所有字段合并进去,也可以手动指定要新增的字段 $formattedData[$itemName] = array_merge($formattedData[$itemName], $item); } } // 合并后的数据去掉key、转为索引数组(非必需,按需选择) $finalData = array_values($formattedData);
3. 把合并后的数据导入MySQL
首先先在MySQL建对应的数据表,举个建表参考:
CREATE TABLE `item_data` ( `id` int NOT NULL AUTO_INCREMENT PRIMARY KEY, `item name` varchar(255) NOT NULL UNIQUE, -- 下方补充两个API返回的所有对应字段,比如: `field1` varchar(255) DEFAULT NULL, `field2` int DEFAULT NULL, `extra_field1` varchar(255) DEFAULT NULL, `extra_field2` int DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
然后用PHP执行插入操作,用mysqli实现即可:
// 连接数据库 $conn = mysqli_connect("数据库地址", "用户名", "密码", "数据库名"); if (!$conn) { die("连接失败: " . mysqli_connect_error()); } // 循环插入数据 foreach($finalData as $item) { // 转义特殊字符避免SQL报错 $itemName = mysqli_real_escape_string($conn, $item['item name']); $field1 = mysqli_real_escape_string($conn, $item['field1']); $field2 = intval($item['field2']); $extraField1 = mysqli_real_escape_string($conn, $item['extra_field1']); $extraField2 = intval($item['extra_field2']); $sql = "INSERT INTO item_data (`item name`, field1, field2, extra_field1, extra_field2) VALUES ('$itemName', '$field1', $field2, '$extraField1', $extraField2) ON DUPLICATE KEY UPDATE field1=VALUES(field1), field2=VALUES(field2), extra_field1=VALUES(extra_field1), extra_field2=VALUES(extra_field2)"; // ON DUPLICATE KEY 逻辑用于避免重复item name插入报错,已有数据会自动更新 mysqli_query($conn, $sql); } mysqli_close($conn);
先存库再合并的方案(可选)
如果后续两个API的数据需要分别独立更新,也可以先存两个单独的表,再用SQL关联查询合并:
- 分别为两个API建表,都保留
item name字段,设置为唯一键 - 分别导入两个API的数据到对应表
- 用JOIN查询得到合并后的数据:
SELECT a.*, b.extra_field1, b.extra_field2 FROM api1_table a LEFT JOIN api2_table b ON a.`item name` = b.`item name`
内容的提问来源于stack exchange,提问作者Mercator
相关产品推荐
相关产品推荐

