Heim > PHP-Framework > Laravel > Hauptteil

Erhalten Sie Provinz- und Städtenamen basierend auf IP im Laravel-Projekt

藏色散人
Freigeben: 2020-12-22 09:20:34
nach vorne
1963 Leute haben es durchsucht

Tutorial-Kolumne Ich hoffe, dass es für Freunde in Not hilfreich sein wird!

Um eine Geolokalisierung basierend auf ip zu erhalten, habe ich das torann/geoip-Paket von laravel ausprobiert, aber es war nicht sehr genau. Es gibt auch eine Baidu-API, um die Methode zum Abrufen geografischer Informationen aufzurufen. Um die Wartungskosten zu senken, habe ich schließlich ein Paket in thinkphp3.2 verwendet wenn es mit dem TP-Framework klar kommt. Das Prinzip dieses Pakets zum Erhalten der Positionierung ist die integrierte Provinz- und Kommunaldatenbank UTFWry.dat.

Erhalten Sie Provinz- und Städtenamen basierend auf IP im Laravel-ProjektProvinz- und Städtenamen basierend auf IP abrufen

So verwenden Sie das Laravel-Projektip 获取地理定位,曾尝试了 laraveltorann/geoip 包,不是很准确。还有 百度 API 调用获取地理信息的方法,为了减少维护成本,最终用了thinkphp3.2 中的一个包,是否是tp框架自带的不很清楚。这个包获取定位的原理是内置了省市数据库 UTFWry.dat

根据 IP 获取省市名称

laravel 项目如何使用

我放在了项目 app 同级目录 sdk 下。为了能够使用,composer.json 中需将 IpLocation.class.php 添加到 classmap 自动加载中,以便该文件中包含的类能够在被调用时被自动加载(如果不太明白为何能自动加载,参考 Laravel Composer 自动加载原理)。

"autoload": {
    "classmap": [
        "database/seeds",
        "database/factories",
        "sdk/Org/Net/IpLocation.class.php"
    ]},
Nach dem Login kopieren

添加后执行 composer dump-autoload

基本使用

$ip = new \Org\Net\IpLocation('UTFWry.dat');
$location = $ip->getlocation('223.104.1.100');
dd($location);
Nach dem Login kopieren

1. 标准返回值
我们拿 广东深圳 的 ip 做示例

# 打印结果
array:5 [
"ip" => "223.104.1.100"
"beginip" => "223.104.1.0"
"endip" => "223.104.1.255"
"country" => "广东省深圳市"
"area" => "移动"]
Nach dem Login kopieren

2. 个别地区返回值有所不同,左侧为示范ip,右侧为返回地区名称

# 直辖市
'223.104.3.155',//北京市 
'223.104.7.155',//天津市 
'223.104.25.155',//重庆市 
'223.104.5.200',//上海市徐汇区 
# 自治区
'223.104.15.100',//内蒙古呼和浩特市 
'223.104.29.100',//宁夏银川市 
'223.104.30.100',//新疆乌鲁木齐市 
'211.139.74.100',//西藏拉萨市 
'218.204.63.100',//广西百色市 

'1.32.192.100',//香港 
'60.246.49.100',//澳门
Nach dem Login kopieren

封装一个返回地区id的方法函数

经常使用的话,一般喜欢放在 appHelpers.phpIch habe es im gleichen Verzeichnis sdk des Projekts app abgelegt . Um verwendet zu werden, muss IpLocation.class.php zum automatischen Laden von classmap in composer.json hinzugefügt werden, damit die darin enthaltenen Klassen Diese Datei kann beim Aufruf automatisch geladen werden (wenn Sie nicht wissen, warum sie automatisch geladen werden kann, lesen Sie bitte das Prinzip des automatischen Ladens von Laravel Composer).

<?php

function get_ip_location($ip){
    $ip_driver = new \Org\Net\IpLocation(&#39;UTFWry.dat&#39;);
    $location = $ip_driver->getlocation($ip);
    $location = $location[&#39;country&#39;]; //广东省深圳市

    // 如果没有查询到的默认返回值
    $default = [&#39;p_id&#39;=>1,&#39;c_id&#39;=>0,&#39;locname&#39;=>&#39;北京&#39;];

    // 如果有市 那么市后边的字符删除 只保留到市
    $city_strpos = mb_strpos($location, &#39;市&#39;);
    if($city_strpos){
        $location = mb_substr($location, 0, $city_strpos + 1);
    }

    // 如果是直辖市,若匹配到直接返回,不继续匹配 “区”
    $spacial = [&#39;北京&#39;,&#39;上海&#39;,&#39;天津&#39;,&#39;重庆&#39;];//北京市/天津市/重庆市/上海市徐汇区
    foreach ($spacial as $bj) {
        if( strpos($location, $bj) !== false ){
            $province_name = $bj;
            $province_id = DB::table(&#39;loc_province&#39;)->where(&#39;name&#39;,$province_name)->value(&#39;province_id&#39;);
            return [&#39;p_id&#39;=>$province_id,&#39;c_id&#39;=>0,&#39;locname&#39;=>$bj.&#39;市&#39;];
        }
    }

    // 其他标准查询
    $expect_ids = [36,37,38,39,69]; //排除北京、、以及想要排除的地区
    $province_name = $city_name = &#39;&#39;; //初始化
    $province_id = $city_id = 0;
    // 所有省数据
    $all_province = DB::table(&#39;loc_province&#39;)->whereNotIn(&#39;id&#39;, $expect_ids)->get();
    foreach ($all_province as $prov) {
        $name = $prov->name;
        $prov_pos = mb_strpos($location, $name);
        // 如果匹配到目标
        if( $prov_pos !== false ){
            $province_id = $prov->province_id;
            $province_name = $name;
            // 从字符串中去除省名称,并把省字去掉
            $location = mb_substr($location, $prov_pos + mb_strlen($name));
            $location = str_replace(&#39;省&#39;,&#39;&#39;,$location);
            // 如果有“市”,那么就提取出市的名称
            if($location && mb_strpos($location, &#39;市&#39;)){
                $city_name = rtrim($location, &#39;市&#39;);
            }
            if($city_name){
                $city_id = DB::table(&#39;loc_city&#39;)->where(&#39;name&#39;,$city_name)->value(&#39;cid&#39;);
            }else{
                $city_id = 1; // 默认省会
            }

            break;
        }
    }

    if($province_name){
        return  [&#39;p_id&#39;=>$province_id,&#39;c_id&#39;=>$city_id,&#39;locname&#39;=>$province_name.$city_name];
    }else{
        return $default;
    }
}
Nach dem Login kopieren

Führen Sie nach dem Hinzufügen composer dump-autoload

Grundlegende Verwendung

$testips = [
    &#39;223.104.3.155&#39;,//北京市 
    &#39;223.104.7.155&#39;,//天津市 
    &#39;223.104.25.155&#39;,//重庆市 
    &#39;223.104.5.200&#39;,//上海市徐汇区 

    &#39;223.104.15.100&#39;,//内蒙古呼和浩特市 
    &#39;223.104.29.100&#39;,//宁夏银川市 
    &#39;223.104.30.100&#39;,//新疆乌鲁木齐市 
    &#39;211.139.74.100&#39;,//西藏拉萨市 
    &#39;218.204.63.100&#39;,//广西百色市 

    &#39;1.32.192.100&#39;,//香港 
    &#39;60.246.49.100&#39;,//澳门

    &#39;223.104.1.100&#39;, //广东省深圳市
];
echo "<pre class="brush:php;toolbar:false">";
foreach ($testips as $ip) {
    print_r(get_ip_location($ip));
}
Nach dem Login kopieren

1 aus Wert


Nehmen wir als Beispiel die IP von Shenzhen, Guangdong
Array
(
    [p_id] => 1
    [c_id] => 0
    [locname] => 北京市
)
Array
(
    [p_id] => 3
    [c_id] => 0
    [locname] => 天津市
)
Array
(
    [p_id] => 4
    [c_id] => 0
    [locname] => 重庆市
)
Array
(
    [p_id] => 2
    [c_id] => 0
    [locname] => 上海市
)
Array
(
    [p_id] => 7
    [c_id] => 1
    [locname] => 内蒙古呼和浩特
)
Array
(
    [p_id] => 29
    [c_id] => 1
    [locname] => 宁夏银川
)
Array
(
    [p_id] => 31
    [c_id] => 1
    [locname] => 新疆乌鲁木齐
)
Array
(
    [p_id] => 26
    [c_id] => 1
    [locname] => 西藏拉萨
)
Array
(
    [p_id] => 21
    [c_id] => 13
    [locname] => 广西百色
)
Array
(
    [p_id] => 32
    [c_id] => 1
    [locname] => 香港
)
Array
(
    [p_id] => 33
    [c_id] => 1
    [locname] => 澳门
)
Array
(
    [p_id] => 20
    [c_id] => 2
    [locname] => 广东深圳
)
Nach dem Login kopieren

2. Der Rückgabewert ist in den einzelnen Regionen unterschiedlich. Die linke Seite ist die Demonstrations-IP und die rechte Seite ist der Name der Rückgaberegion rrreee

kapselt eine Rückgaberegions-ID. Wenn die Methodenfunktion

rrreeeTest🎜rrreee🎜Überprüfen Sie die Ergebnisse 🎜rrreee🎜Originaladresse: https://learnku .com/articles/52456🎜🎜🎜🎜🎜               🎜                                                                                 

Das obige ist der detaillierte Inhalt vonErhalten Sie Provinz- und Städtenamen basierend auf IP im Laravel-Projekt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:learnku.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!