【问题标题】:PHP errors when trying to apply geo location尝试应用地理位置时出现 PHP 错误
【发布时间】:2014-09-18 04:52:15
【问题描述】:

我正在尝试进行一些地理定位以在我的 WordPress 网站的标题中显示某些电话号码。不幸的是,当我应用下面的代码时,我得到了以下 PHP 错误:

[2014 年 9 月 17 日 19:48:16 UTC] PHP 警告:strpos() [function.strpos]:/home/domain/public_html/wp-content/themes/Avada/framework/headers/ 中的空针第 87 行的 header-v4.php

[2014 年 9 月 17 日 19:48:16 UTC] PHP 警告:strpos() [function.strpos]:/home/domain/public_html/wp-content/themes/Avada/framework/headers/ 中的空针第 90 行的 header-v4.php

<?php
    $ip = $_SERVER['REMOTE_ADDR'];
    $url = "http://freegeoip.net/json/" . $ip;
    $json = file_get_contents($url);
    $data = json_decode($json, TRUE);
    $city = print_r($data['city'], true);
    $state = print_r($data['region_code'], true);
    $kings_orlando = "Altamonte Springs Apopka Casselberry College Park Heathrow Lake Mary Longwood Maitland Orlando Oviedo Windermere Winter Park Winter Springs";
     
    if ((strpos($kings_orlando,$city) !== false) AND ($state == "FL")) {
        echo '<a href="tel:1-407-270-2112">1-407-270-2112</a>';
    }
    else {
        echo '<a href="tel:1-954-753-9436">1-954-753-9436</a>';
    }
?>

我不仅会收到错误消息,而且我的页脚也会消失。谁能告诉我我做错了什么?

提前致谢

【问题讨论】:

  • 向我们展示 header-v4.php 文件,第 85 到 92 行。
  • if 语句之前的$city 的值是多少?您是否正在验证 freegeoip.net 是否正在传回合法数据?很多时候,如果这些服务无法找到某些信息,它会返回一个空字符串作为占位符,从而导致上述错误消息没有经过适当的检查。尝试echo $city; 或print_r($data); 查看返回的数据概览。 $city 可能是一个空字符串...
  • 你有一根空针,把它修好。除了错误消息中的内容之外,还有什么要说的?
  • @SverriM.Olsen,第 85 - 92 行已经在提供的代码中。它是 if 语句一直到提供的代码的结尾。
  • @War10ck 谢谢,我会试试的。

标签: php wordpress


【解决方案1】:

我在这里猜测一下:您正在本地尝试此操作。因此,您的 IP 地址是 127.0.0.1。

对于这个 IP,freegeoip.net - 显然 - 不知道一个城市。您只需查看输出即可看到这一点:https://freegeoip.net/json/127.0.0.1

所以你必须期待$city 是空的。这样做可以解决这个问题:

if (!empty($city) AND (strpos($kings_orlando,$city) !== false) AND ($state == "FL")) {

(当然,“真实”IP 地址也可能发生这种情况——freegeoip.net 使用的 GeoLite 数据库还远未完成,尤其是在城市层面。)

【讨论】:

    【解决方案2】:
    1. 首先,使用这个 freegeoip.net 服务是错误的 :) (只要你需要的不仅仅是一个国家)。它非常不准确并且经常不可用,但即使在一个小型初创网站中,也可能只有我一个人遇到了很多问题。

    2. 其次 - 使用 $city = print_r($data['city'], true); 是错误的。

      即使那样,你也应该只做$city = $data['city'];。

    您收到的那些警告意味着 $city 变量为空,这很有可能(请参阅:我的回答的第 1 点;)。尝试其他地理定位服务或确保您处理返回的 JSON 中未提供城市的情况。

    【讨论】:

    • 感谢 Kleskowy。您是否推荐其他地理定位服务?
    • MaxMind's solution 看起来很有前途,但我自己没有测试过。
    • 这两行做同样的事情.. 那里没有问题codepad.org/9p21dQ9m。他只需要像错误所说的那样对他的输入进行错误检查。按步骤: 1) 确认错误,检查错误提示的变量为空或类型错误。 2)在尝试使用它之前,调查它为什么是空的并修复那个案例或解释这个条件。
    猜你喜欢
    • 2020-09-22
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 2016-04-20
    • 2017-09-28
    • 2019-10-03
    • 1970-01-01
    • 2016-12-23
    相关资源
    最近更新 更多