如何将Yelp API返回的JSON数据完整插入MySQL数据库
问题分析与修复方案
核心问题梳理
- 仅固定获取第一条评论:所有数据变量都取了
reviews[0],完全没处理后续评论条目 - 用户字段路径错误:Yelp API中每条评论的用户信息存在
user字段下,而非users[1],键名和索引都写错了 - 循环对象错误:遍历的是整个
$response对象,而非评论数组$response['reviews'],循环逻辑混乱 - 变量未动态更新:所有数据变量定义在循环外部,导致每次插入的都是第一条评论的重复数据
- 存在SQL注入风险:直接将变量拼入SQL语句,既不安全也可能因特殊字符导致插入失败
修正后的代码
$response = json_decode($data, true); // 建立数据库连接并增加错误检测 $con = mysqli_connect('localhost', 'root', '', 'reviews'); if (!$con) { die('数据库连接失败: ' . mysqli_connect_error()); } // 检查评论数组是否有效 if (isset($response['reviews']) && is_array($response['reviews'])) { // 准备预处理语句,防范SQL注入 $stmt = mysqli_prepare($con, "INSERT INTO yelp (Text, Rating, ProfileURL, Name) VALUES (?, ?, ?, ?)"); // 绑定参数类型:s=字符串、i=整数 mysqli_stmt_bind_param($stmt, "siss", $text, $rating, $profileUrl, $userName); // 遍历每条评论 foreach ($response['reviews'] as $review) { // 从当前评论中提取数据,增加容错判断 $text = isset($review['text']) ? $review['text'] : ""; $rating = isset($review['rating']) ? $review['rating'] : 0; $profileUrl = isset($review['user']['profile_url']) ? $review['user']['profile_url'] : ""; $userName = isset($review['user']['name']) ? $review['user']['name'] : ""; // 执行插入操作 mysqli_stmt_execute($stmt); } // 关闭预处理语句与数据库连接 mysqli_stmt_close($stmt); echo "数据插入成功"; } else { echo "未获取到有效评论数据"; } mysqli_close($con);
关键改动说明
- 遍历正确对象:改为遍历
$response['reviews']数组,确保每条评论都被处理 - 修正用户字段路径:将
users[1]改为user,匹配Yelp API的实际返回结构 - 变量动态更新:将数据变量赋值放入循环内部,每次迭代获取当前评论的对应数据
- 使用预处理语句:通过参数化查询避免SQL注入,同时解决特殊字符导致的插入失败问题
- 增加错误检测:添加数据库连接、评论数组有效性的判断,便于排查问题
内容的提问来源于stack exchange,提问作者user20381197
相关产品推荐
相关产品推荐

