Maison > cadre php > Laravel > Obtenez le nom de la province et de la ville en fonction de l'adresse IP dans le projet Laravel

Obtenez le nom de la province et de la ville en fonction de l'adresse IP dans le projet Laravel

藏色散人
Libérer: 2020-12-22 09:20:34
avant
2047 Les gens l'ont consulté

Selon pour obtenir la géolocalisation, j'ai essayé le forfait

de

, mais ce n'était pas très précis. Il existe également Obtenez le nom de la province et de la ville en fonction de l'adresse IP dans le projet Laravel qui appelle la méthode d'obtention d'informations géographiques. Afin de réduire les coûts de maintenance, un package en

a finalement été utilisé. Il n'est pas clair s'il est fourni avec le framework TP. Le principe de ce package pour obtenir un positionnement est la base de données provinciale et municipale intégrée

. iplaraveltorann/geoip百度 APIthinkphp3.2UTFWry.dat

Comment utiliser le projet laravel

根据 IP 获取省市名称Je l'ai placé sous le projet

répertoire frère

. Afin de pouvoir l'utiliser, doit être ajouté au chargement automatique afin que les classes contenues dans le fichier puissent être automatiquement chargées lorsqu'elles sont appelées (si vous ne comprenez pas pourquoi il peut être chargé automatiquement , reportez-vous au principe de chargement automatique de Laravel Composer).

"autoload": {
    "classmap": [
        "database/seeds",
        "database/factories",
        "sdk/Org/Net/IpLocation.class.php"
    ]},
Copier après la connexion

Exécuter après l'ajoutappsdkcomposer.jsonIpLocation.class.phpclassmapUtilisation de base

$ip = new \Org\Net\IpLocation('UTFWry.dat');
$location = $ip->getlocation('223.104.1.100');
dd($location);
Copier après la connexion

composer dump-autoloadValeur de retour standard

Nous obtenons L'adresse IP de Shenzhen, Guangdong est utilisée comme exemple
# 打印结果
array:5 [
"ip" => "223.104.1.100"
"beginip" => "223.104.1.0"
"endip" => "223.104.1.255"
"country" => "广东省深圳市"
"area" => "移动"]
Copier après la connexion

2 La valeur de retour est différente selon les régions. Le côté gauche est l'adresse IP de démonstration et le côté droit est le nom de la région renvoyée. 🎜>

# 直辖市
'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',//澳门
Copier après la connexion
Encapsuler un Si la fonction méthode
qui renvoie l'identifiant de région est utilisée fréquemment, elle est généralement placée dans

,

<?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;
    }
}
Copier après la connexion
Test

$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));
}
Copier après la connexion

Vérifiez le résultat

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] => 广东深圳
)
Copier après la connexion
appHelpers.phpAdresse originale : https://learnku.com/articles/52456

                                                                              

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:learnku.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal