PHP使用cURL发起GET请求获取API数据解析后存入MySQL的实现问题
完整实现方案
一、原有代码问题说明
你调用的测试接口返回的JSON结构中,所有用户数据都存放在根节点的data数组下,原有代码直接遍历根节点$decoded无法正确拿到用户字段。
二、完整可运行代码
<?php // 1. 请求API获取数据 $ch = curl_init(); $url = "https://reqres.in/api/users?page=2"; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 测试环境可临时关闭SSL验证,生产环境建议删除两行配置开启验证 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $resp = curl_exec($ch); if($e = curl_error($ch)) { die("CURL请求错误:".$e); } curl_close($ch); $decoded = json_decode($resp, true); // 判断是否返回了有效用户数据 if(!isset($decoded['data']) || !is_array($decoded['data'])) { die("接口返回数据异常"); } // 2. 连接MySQL数据库 替换为你自己的数据库配置 $dbHost = '127.0.0.1'; $dbName = '你的数据库名'; $dbUser = '你的数据库用户名'; $dbPass = '你的数据库密码'; $dbCharset = 'utf8mb4'; try { $pdo = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=$dbCharset", $dbUser, $dbPass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 预处理写入语句 假设你的表名叫users,字段对应id、email、first_name、last_name $stmt = $pdo->prepare("INSERT INTO users (id, email, first_name, last_name) VALUES (:id, :email, :first_name, :last_name) ON DUPLICATE KEY UPDATE email=VALUES(email), first_name=VALUES(first_name), last_name=VALUES(last_name)"); // 3. 遍历用户数据写入数据库 foreach($decoded['data'] as $user) { // 绑定参数执行写入 $stmt->execute([ ':id' => $user['id'], ':email' => $user['email'], ':first_name' => $user['first_name'], ':last_name' => $user['last_name'] ]); } echo "数据写入成功,共写入".count($decoded['data'])."条用户数据"; } catch(PDOException $e) { die("数据库操作错误:".$e->getMessage()); }
三、注意事项
- 请提前在MySQL中创建对应数据表,表结构参考:
CREATE TABLE `users` ( `id` int(11) NOT NULL PRIMARY KEY, `email` varchar(255) NOT NULL DEFAULT '', `first_name` varchar(100) NOT NULL DEFAULT '', `last_name` varchar(100) NOT NULL DEFAULT '' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
- 代码中数据库配置、表名字段名请根据你的实际业务修改
- 代码中使用了
ON DUPLICATE KEY UPDATE逻辑,重复id的用户会自动更新字段,不需要该逻辑可以删除该部分内容
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

