多くの Web サイトがユーザーに天気予報を提供する機能を提供していることは誰もが知っていますが、ユーザーが自分に関連する地理的位置情報を入力しなくても、同じ Web サイトが地理的位置を特定して天気情報を表示することもあります。 IP を使用して地理的位置を決定することを考えるかもしれませんが、実際にそうなります。ただし、自分で開発する場合は確かに少し面倒なので、ここでこのアプリケーションのビジネス ロジックについて簡単に説明します。ユーザーが最初にページを開いたときの開始点):
1: IP の取得: 私の意見によれば、IP には 2 つの種類があり、1 つは実際に存在する独立した IP、もう 1 つはルーターによって割り当てられる IP です。これは、もちろん、ある意味で固有ではありません。これら 2 つの IP もちろん、最初の IP は $_SERVER の要素の値を取得するだけなので非常に簡単ですが、問題は 192.168.1.1 のように判断できないためです。位置情報はもともとカール拡張機能を使用して取得されましたが、この拡張機能では使用できないため、この状況は当面脇に置いて、ユーザーが独立した IP を使用してアクセスする状況のみを考慮します。 。
ここで、サーバーのパラメータはserver_addrではなくREMOTE_ADDRであることを付け加えておきます。この方法でのみユーザーの実際のアドレスを取得できます。この場合、わざわざ取得する必要はありません。
2: IP を取得したら、IP アドレス ライブラリに基づいてユーザーの IP の場所を見つける必要があります。1: IP アドレス ライブラリは utf-8 でエンコードされている必要があります。住所情報は後で都市名局にする必要があるため、文字列をインターセプトするか、都市の住所を簡略化する必要があります。
3: ユーザーの住所を取得することは明らかに不可能です。考えてみてください。データを取得するために最終的に天気インターフェースに接続されるのは都市コードです。ここでは、依然として乱暴な方法を使用しました。都市コード ライブラリを検索するか、都市コードを取得します。
4: 都市コードを取得したら、データ インターフェイスに接続してデータを取得する必要があります。このデータは json_encode() によってトランスコードされる必要があります。一部のインターフェイスは異なる場合があります。特定の状況は特定です。最も重要なことはこれらのデータを割り当てることです。後で、これらを 1 つずつ割り当てないことが正しいことがわかりました。コード移植へ。
5: ビュー内のテンプレートで割り当てられたデータを呼び出すと、これが行われると思います。
6: 実際、上記の手順で、初めてページを開くビジネス ロジック全体がすでに処理されています。もう 1 つは、ビューで都市の天気をクエリするための都市名を入力する機能をユーザーに提供することです。このように、ユーザーが取得した入力情報は都市名
という順番で解析されます。7: 都市名はすでに取得されています。都市コードを取得するためのトラバースに直接参加できます。これは、これら 2 つの機能を適切に組み合わせる順序と判断方法です。必ず:
まず、システムが都市名を自動的に取得するかどうかを確認し、それが空でない場合は、都市名のみが取得されます。 、次の点に注意してください。はい、連続構造により、ユーザーの入力が空であるかどうかが決定されます。空でない場合は、ユーザーが都市名を入力できるようにします。つまり、ユーザーの入力権限は自動的に許可される権限より大きくなければなりません。 2 つのコードを完全に組み合わせることができるように、IP を取得する方法と都市名を取得する方法を 2 つ作成しました。
上記の記述は少し面倒です。ここでは、さまざまなセキュリティと著作権上の理由により、データ インターフェイスを処理しましたが、これはメソッドの参照のみを提供します。独自に調べて貼り付けます。
weather_test.html を表示:
リーリー
リアルタイムの天気情報 | |
市 | {$all_info->予報->都市} |
基本天気 | {$all_info->リアルタイム->天気} |
気温 | {$all_info->リアルタイム->温度} |
風向き | {$all_info->リアルタイム->WD} |
更新時間 | {$all_info->リアルタイム->時間} |
生活建议 | |
城市 | {$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; }