作用是从天气网免费接口获取特定城市的天气json,保存到本地后写入到数据库中;
两个部分,写到一个文件就可以了;
<?php
//第一部分,先把相关json保存到本地,需要php配置一下
//获取方式已经写过了,参考https://blog.csdn.net/hkear/article/details/139134816
$url = 'http://www.nmc.cn/rest/weather?stationid=bmyrb';
// 保存该结果为json到本地路径
$saveTo = '/wwwroot/weather.json';
// 初始化cURL会话
$ch = curl_init($url);
// 设置cURL选项
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 获取的信息以文件流的形式返回,而不是直接输出
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true); // 在传输数据时不进行编码处理
curl_setopt($ch, CURLOPT_HEADER, false); // 不需要头部信息
// 执行cURL会话
$result = curl_exec($ch);
// 关闭cURL会话
curl_close($ch);
// 检查是否有错误发生
if ($result === false) {
die('Curl error: ' . curl_error($ch));
}
// 将获取的数据写入文件
if(!file_put_contents($saveTo, $result)) {
echo "Failed!";
}
?>
<?php
//第二部分解析该json,并写到数据库
header("Content-Type: text/html; charset=utf-8");
ini_set("display_errors","on");
$date=date('Y-m-d');
$url='http://127.0.0.1/weather.json';//保存到本地后,该路径为URL路径;
//如果对精度要求没那么高可以每天上午下载一次该json到本地,避免下午时候天气出现9999;
$jsonData = file_get_contents($url);
$data = json_decode($jsonData, true);
$dbhost = '127.0.0.1'; // mysql服务器主机地址
$dbuser = 'root'; // mysql用户名
$dbname = 'weather_test'; // mysql用户名
$dbpass = '123456'; // mysql用户名密码
$dbtable='weather';
// 创建数据库连接
$conn = new mysqli($dbhost, $dbname, $dbpass, $dbname);
// 检查连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 获取JSON数据
$json = file_get_contents("http://127.0.0.1/weather.json");
if ($json === false) {
die("无法获取JSON数据");
}
$data = json_decode($json, true);
// 检查JSON数据是否有效
if (json_last_error() !== JSON_ERROR_NONE) {
die("JSON数据解析错误");
}
// 检查是否成功获取并解析JSON数据
if (!empty($data) && isset($data['data']['predict']['detail'])) {
$detail = $data['data']['predict']['detail'];
// 开始事务(可选)
$conn->autocommit(false);
try {
// 遍历JSON中的天气数据
// ddw=day->weather;dnw=night->weather
foreach ($detail as $item) {
$date = $item['date'];
$ddwInfo = $item['day']['weather']['info'] ?? '';
$ddwTemp = $item['day']['weather']['temperature'] ?? null;
$dnwInfo = $item['night']['weather']['info'] ?? '';
$dnwTemp = $item['night']['weather']['temperature'] ?? null;
// 处理可能的null值,将它们转换为适当的默认值
$ddwTempValue = $ddwTemp === null ? 0.0 : $ddwTemp;
$dnwTempValue = $dnwTemp === null ? 0.0 : $dnwTemp;
//sleep(10);
// 准备SQL语句
//根据dt日期(数据库已经有了)作为条件update进去
$sql = "UPDATE $dbtable SET ddw_info = ?, ddw_temp = ?, dnw_info = ?, dnw_temp = ? WHERE dt = ?";
// 使用预处理语句
$stmt = $conn->prepare($sql);
// 绑定参数
$stmt->bind_param("sssss", $ddwInfo, $ddwTempValue, $dnwInfo, $dnwTempValue, $date);
// 执行预处理语句
if (!$stmt->execute()) {
throw new Exception("执行更新失败: (" . $stmt->errno . ") " . $stmt->error);
}
else{
$tm=date("Y-m-d H:i:s");
echo "sucess@$tm";
}
}
// 提交事务(如果开启了事务)
$conn->commit();
} catch (Exception $e) {
// 回滚事务(如果事务失败)
$conn->rollback();
echo "错误: " . $e->getMessage();
}
$stmt->close();
} else {
echo "无法解析JSON数据或数据不存在。\n";
}
// 关闭数据库连接
$conn->close();
?>