получить данные из JSON с помощью класса php

0

Мне нужно использовать JSON, сгенерированный из API этого сайта

Я создал класс PHP для извлечения данных в качестве простейшего решения, основанного здесь, что это:

function ip_details($ip) {
    $json = file_get_contents("http://ipinfo.io/{$ip}"); 
    $details = json_decode($json);
    return $details;
}

$details = ip_details('8.8.8.8'); 

echo $details->ip . '<br />';
echo $details->city . '<br />';     
echo $details->region . '<br />';
echo $details->country . '<br />';  
echo $details->loc . '<br />';
echo $details->hostname . '<br />'; 
echo $details->org . '<br />';      
echo $details->postal . '<br />';

он вообще не работает на моем сервере. Он работает только локально. Я хочу показать, что мой хост отлично работает как с функцией fsockopen() (хотя она ограничена портами 80 и 443), так и библиотекой cURL.

Фактически, я уже использую класс PHP, который отлично работает с cURL, чтобы извлечь все данные, которые мне нужны из файла JSON этого сайта: www.geoplugin.com

Теперь я попытался создать класс PHP самостоятельно, но я делаю некоторые ошибки, которых я не могу найти. Я так много пробовал... Я был на нем 2 дня, но все равно у меня не было никакого решения!

У меня есть файл, я назвал geo.php, где я перезвоню и использую (попробуйте использовать, должен сказать) мой класс, таким образом:

require_once 'geo.class.php';
$geo = new Geolocalize('8.8.8.8');

echo $geo->ip . '<br />';
echo $geo->city . '<br />';
echo $geo->region . '<br />';
echo $geo->country . '<br />';
echo $geo->loc . '<br />';
echo $geo->hostname . '<br />';
echo $geo->org . '<br />';
echo $geo->postal . '<br />';

Вот мой класс. Спасибо всем заранее.

class Geolocalize {
    public $host = 'http://ipinfo.io/{IP}';

    public $ip;
    public $city;     
    public $region;
    public $country;
    public $loc;
    public $hostname; 
    public $org;      
    public $postal;

    public function __construct($ip) {
        $host = str_replace('{IP}', $ip, $this->host);
        $data = array();

        $response = $this->fetch($host);

        $data = $response;

        //set the vars
        $this->ip = $data['ip'];
        $this->city = $data['city'];
        $this->region = $data['region'];
        $this->country= $data['country'];
        $this->loc = $data['loc'];
        $this->hostname = $data['hostname'];
        $this->org = $data['org'];
        $this->postal = $data['postal'];
    }

    public function fetch($host) {
        if ( function_exists('curl_init') ) {       
            // use cURL to fetch data
            $ch = curl_init();

            curl_setopt($ch, CURLOPT_URL, $host);

            // if deactivated (with 0) you see the json from the API
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

            $response = curl_exec($ch);

            curl_close ($ch);
        } else if ( ini_get('allow_url_fopen') ) {
            //fall back to fopen()
            $response = file_get_contents($host, 'r');
        }

        return $response;
    }

}
  • 0
    Вы получили какую-либо ошибку на сервере? тот факт, что он работает на вашей локальной машине, заставляет меня думать, что это проблема окружающей среды, а не чего-либо еще.
Теги:
curl

2 ответа

1

Попробуйте что-то вроде этого:

<?php

class IpInfo
{
    protected $apiUrl = 'http://ipinfo.io';

    private $ip;
    private $city;
    private $region;
    private $country;
    private $loc;
    private $hostname;
    private $org;
    private $postal;

    public function __construct($user_ip)
    {
        // Check if required function exists
        if (!function_exists('file_get_contents'))
            throw new Exception('file_get_contents php function does not exists');

        // Load ip data from remote server
        $ip_data = @file_get_contents($this->apiUrl . '/'. $user_ip);
        if (empty($ip_data))
            throw new Exception('failed to load ip info from remote server');

        // Parse ip data
        $ip_data = @json_decode($ip_data);
        if (!$ip_data)
            throw new Exception('failed to parse ip data from remote server response');
        else {
            $this->ip = $ip_data->ip;
            $this->city = $ip_data->city;
            $this->region = $ip_data->region;
            $this->country = $ip_data->country;
            $this->loc = $ip_data->loc;
            $this->hostname = $ip_data->hostname;
            $this->org = $ip_data->org;
        }
    }

    public function ip() { return $this->ip; }
    public function city() { return $this->city; }
    public function region() { return $this->region; }
    public function country() { return $this->country; }
    public function loc() { return $this->loc; }
    public function hostname() { return $this->hostname; }
    public function org() { return $this->org; }
}

?>

Применение

<?php

$user_ip = '74.125.71.138'; // or $_SERVER['REMOTE_ADDR'];

try
{
    $ip_info = new IpInfo($user_ip);

    echo $ip_info->city(); // Mountain View
}
catch (Exception $ex)
{
    echo $ex->getMessage();
}
  • 0
    Я попробовал ваш класс, но локально с Xampp (в разработке) он прекрасно работает. Проблема в том, что он находится на моем веб-сайте: я получил ответ: не удалось проанализировать данные ip из ответа удаленного сервера. Я действительно не знаю почему. Кажется, класс не может извлечь дату из файла JSON с помощью функции file_get_contents (). Я должен использовать библиотеку cURL, как я уже делал с другим классом PHP, который я нашел на www.geoplugin.com для аналогичного сервиса. У вас есть предложение, чтобы мой класс cURL работал?
0

Я делаю свой класс cURL, но только локально !!!!

Я заметил ошибку, и теперь она работает нормально, но не в Интернете, а не на моем сайте. Вот:

class Geolocalize

{
public $host = 'http://ipinfo.io/{IP}';

public $ip;
public $city;     
public $region;
public $country;
public $loc;
public $hostname; 
public $org;      
public $postal;

public function __construct($ip)
    {
        $host = str_replace('{IP}', $ip, $this->host);

        $response = $this->fetch($host);

        // decode the JSON into an associative array, setting the option true
        $data = json_decode($response, true);

        //set the vars
        $this->ip = $data['ip'];
        $this->city = $data['city'];
        $this->region = $data['region'];
        $this->country= $data['country'];
        $this->loc = $data['loc'];
        $this->hostname = $data['hostname'];
        $this->org = $data['org'];
        $this->postal = $data['postal'];
    }

public function fetch($host) 
    {

        if ( function_exists('curl_init') ) 
            {       
                // use cURL to fetch data
                $ch = curl_init();

                curl_setopt($ch, CURLOPT_URL, $host);

                // if deactivated (with 0) you see the json from the API
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

                $response = curl_exec($ch);

                curl_close ($ch);
            } 
        else if ( ini_get('allow_url_fopen') ) 
            {
                //fall back to fopen()
                $response = file_get_contents($host, 'r');
            }

        return $response;
    }

}

то я использую его таким образом, как я сказал выше:

require_once 'geo.class.php';

$geo = new Geolocalize('74.125.71.138'); // 74.125.71.138

echo var_dump($geo->ip) . '<br />';
echo $geo->city . '<br />';
echo $geo->region . '<br />';
echo $geo->country . '<br />';
echo $geo->loc . '<br />';
echo $geo->hostname . '<br />';
echo $geo->org . '<br />';
echo $geo->postal . '<br />';

Как вы видите, я даже пытаюсь поймать ошибки с помощью var_dump(), но я вижу только запись NULL в Production, онлайн.

Угадайте, что это проблема с хостом, который не способен поймать данные из файла JSON. Я попытаюсь связаться с администраторами. Я дам вам знать, если я получу от них новости. Это действительно расстраивает!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню