• DONATE to NULLED!
    Форуму и его команде можно помочь, мотивировать модераторов разделов.
    Помогите модератору этого раздела killoff лично.

Помощь Делаем модуль вывода баннера по стране и городу

Можно перед функцией добавлять знак @ тогда ошибки не выводятся.
А вообще перед выводом не мешало бы проверку делать, а-ля if (!empty)

Может я ошибаюсь, но в вашем случае вместо конструкций:
PHP:
echo 'Country Code: ' . $loc->lookup($ip, IP2Location::COUNTRY_CODE) . '<br />';
Логичнее использовать:
PHP:
$CountryCode = @$loc->lookup($ip, IP2Location::COUNTRY_CODE);
if (!empty($CountryCode)) {
    echo "Country Code: {$CountryCode}<br />";
}

emty это по сути аналог
PHP:
!isset($var) || $var == false
 
О_о Давай, советуй девушке как нельзя программировать...

@Kristinka77, тут надо для начала понять что вообще произошло... Т.е. не определился IP , или такого IP не нашлось в базе?
Если первое - то надо делать проверку ДО вызова класса и не передавать ему ерунду вместо IP.
Если второе - надо в сам класс добавить проверку...

Вообще, честно говоря, мне не очень нравится тот код, который у тебя получается. По сути, на каждой строке у тебя заново дёргаются данные, заново идёт поиск IP и т.д. Нагрузка - непередаваемая...
Логичнее было бы передать IP 1 раз, подгрузить всю информацию о данном IP и возвращать по необходимости.
В этом случае нет лишних обращений в файл базы, нет поиска по гигантскому файлу, а хранится немного лишней информации в оперативке. Немного - это несколько Кб, что по современным меркам ничто. А файл, вангую, весит несколько мегабайт...
 
Так тоже выходит ошибка и сайта нет, белая страница и надпись вверху Catchable fatal error: Object of class IP2LocationRecord could not be converted to string in C:\Users.........\OpenServer\domains\11-2.dle\engine\modules\hello.php on line 15

В строке
PHP:
echo "Country Code: {$CountryCode}<br />";

PHP:
$CountryCode = @$loc->lookup($ip, IP2Location::COUNTRY_CODE);
if (!empty($CountryCode)) {
    echo "Country Code: {$CountryCode}<br />";
}
 
Ну я лишь предложил вариант :)

Т.е. не определился IP , или такого IP не нашлось в базе?
Не помню, если там в системных переменных IP? Или надо свой...
PHP:
if (!empty($_SERVER['HTTP_CLIENT_IP']))
    {
        $ip=$_SERVER['HTTP_CLIENT_IP'];
    }
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
    {
        $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    else
    {
        $ip=$_SERVER['REMOTE_ADDR'];
    }
А далее вплоть до извращенства )
PHP:
if(preg_match("#^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$#i", $ip))
    {
        $r = explode(".", $ip);
        $flag = 1;
        for($i = 0; $i<4; $i++)
        {
            $flag *= ($r[$i] < 256)? 1 : 0; 
        }
        if($flag)
        {
                КОД
        }
}
 
Там в начале скрипта идёт определение айпи

PHP:
$ip = $_SERVER["REMOTE_ADDR"];

И если он скрыт или пуст то вылетает ошибка, а то что у посетителей сайт иногда в логах я вижу отсутствие айпи адреса то такие посетители сайт не увидят, поэтому нужно как то сделать так чтоб у посетителей с неопределённым айпишником сайт не вываливался с ошибкой.
 
Там в начале скрипта идёт определение айпи
И всё? Этого не достаточно... чуть выше есть полноценный кусок кода для определения IP.
Сначала проверяем HTTP_CLIENT_IP, если он пустой - пробуем получить HTTP_X_FORWARDED_FOR, и только в противном случае используем REMOTE_ADDR.
От того у вас и ошибка вылетает.
 
Для просмотра ссылки Войди или Зарегистрируйся, с предыдущими двумя кусками я не поняла куда их вставлять, можно для блондинки полностью пример с моим скриптом ? )))) Вот мой скрипт:

PHP:
<?

$ip = $_SERVER["REMOTE_ADDR"];

require_once ENGINE_DIR.'/modules/IP2Location.php';
$loc = new IP2Location(ENGINE_DIR.'/modules/IP2LOCATION-LITE-DB11.BIN', IP2Location::FILE_IO);

echo 'Ваш ip адрес: ' . $ip . '<br />';

echo 'Country Code: ' . $loc->lookup($ip, IP2Location::COUNTRY_CODE) . '<br />';
echo 'Country Name: ' . $loc->lookup($ip, IP2Location::COUNTRY_NAME) . '<br />';

echo 'Region Name: ' . $loc->lookup($ip, IP2Location::REGION_NAME) . '<br />';
echo 'City Name: ' . $loc->lookup($ip, IP2Location::CITY_NAME) . '<br />';
echo 'Latitude: ' . $loc->lookup($ip, IP2Location::LATITUDE) . '<br />';
echo 'Longitude: ' . $loc->lookup($ip, IP2Location::LONGITUDE) . '<br />';

echo 'Zip Code: ' . $loc->lookup($ip, IP2Location::ZIP_CODE) . '<br />';
echo 'Time Zone: ' . $loc->lookup($ip, IP2Location::TIME_ZONE) . '<br />';

?>

Если тут пусто $_SERVER["REMOTE_ADDR"] то вываливается ошибка.
 
PHP:
<?

if (!empty($_SERVER['HTTP_CLIENT_IP']))
    {
        $ip=$_SERVER['HTTP_CLIENT_IP'];
    }
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
    {
        $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    else
    {
        $ip=$_SERVER['REMOTE_ADDR'];
    }

require_once ENGINE_DIR.'/modules/IP2Location.php';
$loc = new IP2Location(ENGINE_DIR.'/modules/IP2LOCATION-LITE-DB11.BIN', IP2Location::FILE_IO);

echo 'Ваш ip адрес: ' . $ip . '<br />';

echo 'Country Code: ' . $loc->lookup($ip, IP2Location::COUNTRY_CODE) . '<br />';
echo 'Country Name: ' . $loc->lookup($ip, IP2Location::COUNTRY_NAME) . '<br />';

echo 'Region Name: ' . $loc->lookup($ip, IP2Location::REGION_NAME) . '<br />';
echo 'City Name: ' . $loc->lookup($ip, IP2Location::CITY_NAME) . '<br />';
echo 'Latitude: ' . $loc->lookup($ip, IP2Location::LATITUDE) . '<br />';
echo 'Longitude: ' . $loc->lookup($ip, IP2Location::LONGITUDE) . '<br />';

echo 'Zip Code: ' . $loc->lookup($ip, IP2Location::ZIP_CODE) . '<br />';
echo 'Time Zone: ' . $loc->lookup($ip, IP2Location::TIME_ZONE) . '<br />';

?>

Но вообще как упоминал ранее Горбушка, вам следует переписать скрипт. Т.е. извлечь данные по конкретному IP в массив (array). И потом уже ивлекать из массива требуемые данные, а не каждый раз дергать файл. Чем больше посещаемость - тем больше будет нагрузка.

Там, где вы брали свой кусок кода ведь есть примеры...

PHP:
<?php
require_once 'IP2Location.php';

/*
   Cache whole database into system memory and share among other scripts & websites
   WARNING: Please make sure your system have sufficient RAM to enable this feature
*/
// $db = new \IP2Location\Database('./databases/IP-COUNTRY-SAMPLE.BIN', \IP2Location\Database::MEMORY_CACHE);

/*
   Cache the database into memory to accelerate lookup speed
   WARNING: Please make sure your system have sufficient RAM to enable this feature
*/
// $db = new \IP2Location\Database('./databases/IP-COUNTRY-SAMPLE.BIN', \IP2Location\Database::MEMORY_CACHE);


/*
    Default file I/O lookup
*/
$db = new \IP2Location\Database('./databases/IP-COUNTRY-SAMPLE.BIN', \IP2Location\Database::FILE_IO);

$records = $db->lookup('8.8.8.8', \IP2Location\Database::ALL);

echo '<pre>';
echo 'IP Number             : ' . $records['ipNumber'] . "\n";
echo 'IP Version            : ' . $records['ipVersion'] . "\n";
echo 'IP Address            : ' . $records['ipAddress'] . "\n";
echo 'Country Code          : ' . $records['countryCode'] . "\n";
echo 'Country Name          : ' . $records['countryName'] . "\n";
echo 'Region Name           : ' . $records['regionName'] . "\n";
echo 'City Name             : ' . $records['cityName'] . "\n";
echo 'Latitude              : ' . $records['latitude'] . "\n";
echo 'Longitude             : ' . $records['longitude'] . "\n";
echo 'Area Code             : ' . $records['areaCode'] . "\n";
echo 'IDD Code              : ' . $records['iddCode'] . "\n";
echo 'Weather Station Code  : ' . $records['weatherStationCode'] . "\n";
echo 'Weather Station Name  : ' . $records['weatherStationName'] . "\n";
echo 'MCC                   : ' . $records['mcc'] . "\n";
echo 'MNC                   : ' . $records['mnc'] . "\n";
echo 'Mobile Carrier        : ' . $records['mobileCarrierName'] . "\n";
echo 'Usage Type            : ' . $records['usageType'] . "\n";
echo 'Elevation             : ' . $records['elevation'] . "\n";
echo 'Net Speed             : ' . $records['netSpeed'] . "\n";
echo 'Time Zone             : ' . $records['timeZone'] . "\n";
echo 'ZIP Code              : ' . $records['zipCode'] . "\n";
echo 'Domain Name           : ' . $records['domainName'] . "\n";
echo 'ISP Name              : ' . $records['isp'] . "\n";
echo '</pre>';
?>

В частности по заданному IP все выгружается в массив:
PHP:
$records = $db->lookup('8.8.8.8', \IP2Location\Database::ALL);
а далее просто используется конструкция:
PHP:
$records['ИМЯ_ПЕРЕМЕННОЙ']
 
Последнее редактирование:
А этот кусок кода то что ты дал выше, я так поняла проверяет пуст айпи или не пуст ?

PHP:
if(preg_match("#^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$#i", $ip))
{
$r = explode(".", $ip);
$flag = 1;
for($i = 0; $i<4; $i++)
{
$flag *= ($r[$i] < 256)? 1 : 0;
}
if($flag)
{
КОД
}
}

А можно его тоже как то задействовать в моём скрипте, например, если всё таки в $ip пусто то выводит надпись что ВАШ АЙПИ НЕ ОПРЕДЕЛЁН

если всё нормально и айпи определён, то вполняется всё дальше ?
 
Конструкция
PHP:
if(preg_match("#^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$#i", $ip)) {
...........................................
}
Проверяет, соответствует ли полученный IP формату:
[число из 1-3 цифр от 0 до 255].[число из 1-3 цифр от 0 до 255].[число из 1-3 цифр от 0 до 255].[число из 1-3 цифр от 0 до 255]

Т.е. это значения от 0.0.0.0 до 255.255.255.255.

По поводу реализации работы с массивом, примерно в таком формате:
PHP:
<?

if (!empty($_SERVER['HTTP_CLIENT_IP']))
    {
        $ip=$_SERVER['HTTP_CLIENT_IP'];
    }
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
    {
        $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    else
    {
        $ip=$_SERVER['REMOTE_ADDR'];
    }

require_once ENGINE_DIR.'/modules/IP2Location.php';
$loc = new IP2Location(ENGINE_DIR.'/modules/IP2LOCATION-LITE-DB11.BIN', IP2Location::FILE_IO);
$records = $loc->lookup($ip, IP2Location::ALL);

echo 'Ваш ip адрес: ' . $ip . '<br />';

echo 'Country Code: ' . $records['countryCode'] . '<br />';
echo 'Country Name: ' . $records['countryName'] . '<br />';
echo 'Region Name: ' . $records['regionName'] . '<br />';
echo 'City Name: ' . $records['cityName'] . '<br />';
echo 'Latitude: ' . $records['latitude'] . '<br />';
echo 'Longitude: ' . $records['longitude'] . '<br />';

echo 'Zip Code: ' . $records['zipCode'] . '<br />';
echo 'Time Zone: ' . $records['timeZone'] . '<br />';

?>
 
Назад
Сверху