多くの Web サイトがユーザーに天気予報を提供する機能を提供していることは誰もが知っていますが、ユーザーが自分に関連する地理的位置情報を入力しなくても、同じ Web サイトが地理的位置を決定して表示できることがあります。気象情報については、地理的な位置を特定するために IP を使用することが考えられます。ただし、これを自分で開発する場合は確かに少し面倒なので、ここでそのビジネス ロジックについて簡単に説明します。このアプリケーション (ユーザーが最初にページを開いたときに開始点として基づく):
1: IP の取得: 私の意見によれば、IP には 2 つのタイプがあり、1 つは実際に存在する独立した IP、もう 1 つはルーターによって割り当てられる IP です。もちろん、これら 2 つはすべての種類の IP を考慮する必要があります。1 つ目は $_SERVER の要素値を取得するだけで簡単です。しかし、問題は 192.168.1.1 のように判断することはできません。 , そのため、ユーザーの位置情報は元々カール拡張機能を使用して取得されていましたが、この拡張機能は使用できないため、この状況はいったん脇に置かれ、ユーザーが独自の IP を使用してアクセスする状況のみが発生します。考慮された。
ここで、サーバーのパラメータは、server_addr ではなく、REMOTE_ADDR であることを付け加えておきます。この方法でのみ、ユーザーの実際のアドレスを取得する必要はありません。別途
2: IP を取得したら、IP アドレス データベースに基づいてユーザーの IP の場所を見つける必要があります。1: IP アドレス データベースは utf-8 でエンコードされている必要があります。情報は完全な住所情報ですが、都市名局は後で必要になるため、文字列をインターセプトするか、都市の住所を簡略化する必要があります。
3: ユーザーの住所を取得することは明らかに不可能です。考えてみてください。データを取得するために最終的に天気インターフェースに接続されるのは都市コードです。ここでは、まだ変換する必要があります。市外局番ライブラリを横断したり、市外局番を取得したりする暴力的な方法です。
4: 都市コードを取得した後、データ インターフェイスに接続してデータを取得する必要があります。このデータは json データであり、ここで取得するものはオブジェクトである可能性があります。具体的には、状況を詳細に分析した結果、これらのデータを実際に割り当てることが重要であることが判明しました。コードの移植に役立ちます。
5: ビュー内でテンプレートで割り当てたデータを呼び出す、これで済むと思います。
6: 実際、上記の手順で、初めてページを開くビジネス ロジック全体がすでに処理されています。もう 1 つは、都市の天気をクエリするための都市名を入力する機能をユーザーに提供していることです。ユーザーが取得する通常の入力情報は都市名
です。7: 都市名はすでに取得されているか、都市コードを取得するためのトラバースに直接参加できます。ここには、これら 2 つの関数を適切に組み合わせる順序と判断方法という非常に重要な論理的問題があります。一つ、それは次のとおりです:
まず、システムが都市名を自動的に取得するかどうかを判断し、それが空でない場合は、都市名のみが取得されます。そうでない場合は、IP アドレスが対応するアドレス情報を見つけられなかったことを示すメッセージが表示されます。次に、ユーザーの入力が空であるかどうかを決定する連続した構造であることに注意してください。つまり、ユーザーの入力権限は次のとおりです。システムによって自動的に取得される権限よりも大きいため、2 つのコードを完全に組み合わせることができます。さらに、IP を取得して都市名を抽出する 2 つの方法を作成しました。
上記の記述は少し面倒です。ここでは、セキュリティと著作権上の理由により、データ インターフェイスを処理したため、メソッドの参照のみを提供します。貼り付けても無駄ですので、独自に調べてみます。
weather_test.html を表示:
即时天气信息 | |
城市 | {$all_info->forecast->city} |
基本天气 | {$all_info->realtime->weather} |
温度 | {$all_info->realtime->temp} |
风向 | {$all_info->realtime->WD} |
更新时间 | {$all_info->realtime->time} |
生活建议 | |
城市 | {$all_info->forecast->city} |
防嗮建议 | {$all_info->index[0]->details} |
穿衣建议 | {$all_info->index[1]->details} |
运动建议 | {$all_info->index[2]->details} |
洗车建议 | {$all_info->index[3]->details} |
晾晒建议 | {$all_info->index[4]->details} |
更新时间 | {$all_info->realtime->time} |
未来四天天气信息 城市: {$all_info->forecast->city} | ||||
项目/日期 | 今天 | 明天 | 后天 | 大后天 |
概况 | {$all_info->forecast->weather1} | {$all_info->forecast->weather2} | {$all_info->forecast->weather3} | {$all_info->forecast->weather4} |
温度 | {$all_info->forecast->temp1} | {$all_info->forecast->temp2} | {$all_info->forecast->temp3} | {$all_info->forecast->temp4} |
风向 | {$all_info->forecast->wind1} | {$all_info->forecast->wind2} | {$all_info->forecast->wind3} | {$all_info->forecast->wind4} |
风力 | {$all_info->forecast->fl1} | {$all_info->forecast->fl2} | {$all_info->forecast->fl3} | {$all_info->forecast->fl4} |
今日空气质量状况 | |
城市 | {$all_info->forecast->city} |
PM2.5 | {$all_info->aqi->pm25} |
PM10 | {$all_info->aqi->pm10} |
SO2 | {$all_info->aqi->so2} |
NO2 | {$all_info->aqi->no2} |
更新时间 | {$all_info->aqi->pub_time} |
public function weather_test(){ require_once './Component/Citycode.php'; //////这里是根据客户端的ip判断地理位置 //定义两个标志变量 $count=0; $city_id='101120301';//默认大淄博 $city_name_cin=$_POST['cityname']; $city_sim_name=R('Test/get_user_cityname'); //这是系统根据ip自动判断的位置 echo $city_sim_name; if($city_sim_name!=null){ $city_name_cin=$city_sim_name; } //这是用户输入的位置 if(!empty($_POST['cityname'])){ //放置信息覆盖 $city_name_cin=$_POST['cityname']; } ////////不管是ip定位还是用户输入最终需要遍历获取城市代码的变量只要$city_name_cin foreach ($citycode as $key => $value){ if($key==$city_name_cin){ $city_id=$citycode[$city_name_cin]; $count++; } } if($count==0){ echo 对不起,您输入的地址没有找到!默认淄博哦; }else{ echo $city_name_cin.的天气信息如下; } //接口已经处理,请勿使用,仅供学习 $weather_interface_url=http://weatherai.markt.xiaomi.com/wtr-v2/weather?cityId=.$city_id.&mei=e32c88633283737f5d9f381d47&device=HM2013023&miuiVersion=JHBCNBD16.0&modDevice=ce=miuiWeatherAp; $all_weather_info = json_decode(file_get_contents($weather_interface_url)); //分配数据 $this->assign(all_info,$all_weather_info); $this->display(); } /////////////////////////////////////////////////// /* * 下面两个分别是获取主机ip和ip所在地的两个 * 方法,最后的结果数值通过R方法,返回获取 */ //方法1:获取用户ip public function get_user_ip(){ //先通过这种简单的方法获取主机的ip,通过R方法获取 $host_ip=$_SERVER['SERVER_ADDR'];
return $host_ip; } //方法2:获取地名 public function get_user_cityname(){ //得到用户的ip $host_ip=R('Test/get_user_ip'); //这里ip地址库必须这样实例化 $Ip = new OrgNetIpLocation('UTFWry.dat'); // 实例化类 参数表示IP地址库文件 //可以同时放ip和域名 $area = $Ip->getlocation($host_ip); // 获取域名服务器所在的位置 $city_allname=$area['country']; $sim_cityname=explode(市,explode(省, $city_allname)[1])[0]; return $sim_cityname; }