从天气网免费接口获取特定城市的天气json,PHP+MYSQL保存到本地后写入到数据库中

作用是从天气网免费接口获取特定城市的天气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();  
?>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

BigKay

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

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

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

打赏作者

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

抵扣说明:

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

余额充值