Anna Опубликовано 10 Августа 2005 Жалоба Поделиться Опубликовано 10 Августа 2005 (изменено) Это лично мой взгляд на фичу списка со странами. Мод малость тормозной, однако работает и не требует никаких баз данных - в нем уже вшит список двухбуквенных кодов стран.Получение кода страны из IP адреса делается путем выдергивания соответствующей строчки из WHOIS запроса. Говорят можно на свой сервер установить какую-то приблуду для таких запросов, но я в этом плохо разбираюсь, поэтому использую удаленный сервер.Главная проблема заключается в том, чтобы получить именно то, что нужно. Представленный мод достаточно универсализирован под разные whois-сервисы - у каждого есть свои особенности (где-то вставляют зачем-то, а где-то искомая строчка начинается с заглавной буквы).Для дополнительной универсализации потребовалась функция регистро-независимой замены - ее нет в PHP младше 5, поэтому я вышла из положения добавив ее аналог, потыренный на php.net для PHP версии 4. Хватит разговоров короче.... вот. Жду предложений. В sources/classes/ кладем файл whois.php следующего вида:<? // mixed str_ireplace ( mixed search, mixed replace, mixed subject, int &count] ) // Case-insensitive version of str_replace. // If someone knows how to pass the $count paramater as a reference without // requiring it, please let me know. I tried func_get_arg() already. Lines // to do with $count have been commented out by "// >>" if ( !function_exists('str_ireplace') ) { function str_ireplace ($search, $replace, $subject) // >> , &$count) { //Loop back until done if using a subject array if ( is_array($subject) ) { $array_keys = array_keys($subject); while ( true ) { // This is done here rather than in the while() statement because 0 evaluates as false $key = array_pop($array_keys); // If $key is null then there are no more subjects if ( $key === NULL) { return $subject; } $subject[$key] = str_ireplace($search, $replace, $subject[$key]); // >> , $count); } return $subject; } // Loop back until done if using a search array if ( is_array($search) ) { //Only need to check this once $is_array = is_array($replace); while ( true ) { $needle = array_pop($search); // If needle is null then there are no more searches to process if ( $needle === NULL ) { return $subject; } // If no needle, don't even bother // In PHP, empty(0) returns true, so the second check is needed if ( empty($needle) && (string)$needle !== "0" ) { continue; } if ( $is_array == true ) { // If no replacements are left, use empty string instead if ( count($replace) ) { $replacement = array_pop($replace); } else { $replacement = ''; } } else { // If replacement is not an array, use the same value each time $replacement = $replace; } $subject = str_ireplace($needle, $replacement, $subject); // >> , $count); } return $subject; } // Now begins the meat of the function // Define some variables - compiler throws 'E_NOTICE undefined variable' if you don't $newsubject = ''; $end = ''; $offset = 0; // Only need to do this once $lowerneedle = strtolower($search); $lowersubject = strtolower($subject); // Keep going until I say so while ( true ) { // $pos will either be the position of the needle (can be 0) or FALSE $pos = strpos($lowersubject, $lowerneedle, $offset); // Operator === also checks against types, 0 == FALSE, 0 !== FALSE if ($pos === false) { // Tack on the rest $end = substr($subject, $offset); $newsubject .= $end; return $newsubject; } // Get the data before the needle $front = substr($subject, $offset, $pos); // Append the next piece and the replacement $newsubject .= $front . $replace; // Set offset to search beyond needle next time // This is important because the replacement may contain the needle $offset = $pos + strlen($search); // Pretty self explanatory // >> $count++; } // This should never happen, but it's here in case return $subject; } } class class_country_ip { var $country = array( 'AC' => 'Ascension Island (остров Вознесения)', 'AD' => 'Andorra (Андорра)', 'AE' => 'United Arab Emirates (Объединенные Арабские Эмираты)', 'AF' => 'Afghanistan (Афганистан)', 'AG' => 'Antigua and Barbuda (Антигуа и Барбуда)', 'AI' => 'Anguilla', 'AL' => 'Albania (Албания)', 'AM' => 'Armenia (Армения)', 'AN' => 'Netherlands Antilles (Голланские Антильские острова)', 'AO' => 'Angola (Ангола)', 'AQ' => 'Antarctica (Антарктика)', 'AR' => 'Argentina (Аргентина)', 'AS' => 'American Samoa (Американское Самоа)', 'AT' => 'Austria (Австрия)', 'AU' => 'Australia (Австралия)', 'AW' => 'Aruba (Аруба)', 'AX' => 'Aland Islands (Аландские острова)', 'AZ' => 'Azerbaijan (Азербайджан)', 'BA' => 'Bosnia and Herzegovina (Босния и Герцеговина)', 'BB' => 'Barbados (Барбадос)', 'BD' => 'Bangladesh (Бангладеш)', 'BE' => 'Belgium (Бельгия)', 'BF' => 'Burkina Faso (Буркина-Фасо)', 'BG' => 'Bulgaria (Болгария)', 'BH' => 'Bahrain (Бахрейн)', 'BI' => 'Burundi (Бурунди)', 'BJ' => 'Benin (Бенин)', 'BM' => 'Bermuda (Бермудские острова)', 'BN' => 'Brunei Darussalam (Бруней)', 'BO' => 'Bolivia (Боливия)', 'BR' => 'Brazil (Бразилия)', 'BS' => 'Bahamas (Багамские острова)', 'BT' => 'Bhutan (Бутан)', 'BV' => 'Bouvet Island', 'BW' => 'Botswana (Ботсвана)', 'BY' => 'Belarus (Беларусь)', 'BZ' => 'Belize (Белиз)', 'CA' => 'Canada (Канада)', 'CC' => 'Cocos (Keeling) Islands (Кокосовые острова)', 'CD' => 'Congo (Конго)', 'CF' => 'Central African Republic (Центральноафриканская Республика)', 'CG' => 'Congo (Конго)', 'CH' => 'Switzerland (Швейцария)', 'CI' => 'Cote d`Ivoire (Кот-д`Ивуар)', 'CK' => 'Cook Islands (острова Кука)', 'CL' => 'Chile (Чили)', 'CM' => 'Cameroon (Камерун)', 'CN' => 'China (Китай)', 'CO' => 'Colombia (Колумбия)', 'CR' => 'Costa Rica (Коста-Рика)', 'CS' => 'Serbia and Montenegro (Сербия и Черногория)', 'CU' => 'Cuba (Куба)', 'CV' => 'Cape Verde (Кабо-Верде)', 'CX' => 'Christmas Island (остров Рождества)', 'CY' => 'Cyprus (Кипр)', 'CZ' => 'Czech Republic (Чехия)', 'DE' => 'Germany (Германия)', 'DJ' => 'Djibouti (Джибути)', 'DK' => 'Denmark (Дания)', 'DM' => 'Dominica (Доминика)', 'DO' => 'Dominican Republic (Доминиканская Республика)', 'DZ' => 'Algeria (Алжир)', 'EC' => 'Ecuador (Эквадор)', 'EE' => 'Estonia (Эстония)', 'EG' => 'Egypt (Египет)', 'EH' => 'Western Sahara (Западная Сахара)', 'ER' => 'Eritrea (Эритрея)', 'ES' => 'Spain (Испания)', 'ET' => 'Ethiopia (Эфиопия)', 'FI' => 'Finland (Финляндия)', 'FJ' => 'Fiji (Фиджи)', 'FK' => 'Falkland Islands (Фолклендские острова)', 'FM' => 'Micronesia (Микронезия)', 'FO' => 'Faroe Islands (Фарерские острова)', 'FR' => 'France (Франция)', 'GA' => 'Gabon (Габон)', 'GB' => 'United Kingdom (Соединенное Королевство Великобритании и Северной Ирландии)', 'GD' => 'Grenada (Гренада)', 'GE' => 'Georgia (Грузия)', 'GF' => 'French Guiana (Французская Гвиана)', 'GG' => 'Guernsey (остров Гернси)', 'GH' => 'Ghana (Гана)', 'GI' => 'Gibraltar (Гибралтар)', 'GL' => 'Greenland (Гренландия)', 'GM' => 'Gambia (Гамбия)', 'GN' => 'Guinea (Гвинея)', 'GP' => 'Guadeloupe (Гваделупа)', 'GQ' => 'Equatorial Guinea (Экваториальная Гвинея)', 'GR' => 'Greece (Греция)', 'GS' => 'South Georgia and the South Sandwich Islands (Южная Джорджия и Южные Сандвичевы острова)', 'GT' => 'Guatemala (Гватемала)', 'GU' => 'Guam (Гуам)', 'GW' => 'Guinea-Bissau (Гвинея-Бисау)', 'GY' => 'Guyana (Гайана)', 'HK' => 'Hong Kong (Гонконг)', 'HM' => 'Heard and McDonald Islands', 'HN' => 'Honduras (Гондурас)', 'HR' => 'Croatia/Hrvatska (Хорватия)', 'HT' => 'Haiti (Гаити)', 'HU' => 'Hungary (Венгрия)', 'ID' => 'Indonesia (Индонезия)', 'IE' => 'Ireland (Ирландия)', 'IL' => 'Israel (Израиль)', 'IM' => 'Isle of Man (остров Мэн)', 'IN' => 'India (Индия)', 'IO' => 'British Indian Ocean Territory', 'IQ' => 'Iraq (Ирак)', 'IR' => 'Iran (Иран)', 'IS' => 'Iceland (Исландия)', 'IT' => 'Italy (Италия)', 'JE' => 'Jersey (остров Джерси)', 'JM' => 'Jamaica (Ямайка)', 'JO' => 'Jordan (Иордания)', 'JP' => 'Japan (Япония)', 'KE' => 'Kenya (Кения)', 'KG' => 'Kyrgyzstan (Кыргызстан)', 'KH' => 'Cambodia (Камбоджа)', 'KI' => 'Kiribati (Кирибати)', 'KM' => 'Comoros (Коморские острова)', 'KN' => 'Saint Kitts and Nevis (Сент-Китс и Невис)', 'KP' => 'Korea (Северная Корея)', 'KR' => 'Korea (Южная Корея)', 'KW' => 'Kuwait (Кувейт)', 'KY' => 'Cayman Islands (Каймановы острова)', 'KZ' => 'Kazakhstan (Казахстан)', 'LA' => 'Lao (Лаос)', 'LB' => 'Lebanon (Ливан)', 'LC' => 'Saint Lucia (Сент-Люсия)', 'LI' => 'Liechtenstein (Лихтенштейн)', 'LK' => 'Sri Lanka (Шри-Ланка)', 'LR' => 'Liberia (Либерия)', 'LS' => 'Lesotho (Лесото)', 'LT' => 'Lithuania (Литва)', 'LU' => 'Luxembourg (Люксембург)', 'LV' => 'Latvia (Латвия)', 'LY' => 'Libya (Ливия)', 'MA' => 'Morocco (Марокко)', 'MC' => 'Monaco (Монако)', 'MD' => 'Moldova (Молдова)', 'MG' => 'Madagascar (Мадагаскар)', 'MH' => 'Marshall Islands (Маршалловы острова)', 'MK' => 'Macedonia (Македония)', 'ML' => 'Mali (Мали)', 'MM' => 'Myanmar (Мьянма)', 'MN' => 'Mongolia (Монголия)', 'MO' => 'Macau (Макао)', 'MP' => 'Northern Mariana Islands (Северные Марианские острова)', 'MQ' => 'Martinique (Мартиника)', 'MR' => 'Mauritania (Мавритания)', 'MS' => 'Montserrat (Монтсеррат)', 'MT' => 'Malta (Мальта)', 'MU' => 'Mauritius (Маврикий)', 'MV' => 'Maldives (Мальдивы)', 'MW' => 'Malawi (Малави)', 'MX' => 'Mexico (Мексика)', 'MY' => 'Malaysia (Малайзия)', 'MZ' => 'Mozambique (Мозамбик)', 'NA' => 'Namibia (Намибия)', 'NC' => 'New Caledonia (Новая Каледония)', 'NE' => 'Niger (Нигер)', 'NF' => 'Norfolk Island (Норфолк)', 'NG' => 'Nigeria (Нигерия)', 'NI' => 'Nicaragua (Никарагуа)', 'NL' => 'Netherlands (Нидерланды)', 'NO' => 'Norway (Норвегия)', 'NP' => 'Nepal (Непал)', 'NR' => 'Nauru (Науру)', 'NU' => 'Niue', 'NZ' => 'New Zealand (Новая Зеландия)', 'OM' => 'Oman (Оман)', 'PA' => 'Panama (Панама)', 'PE' => 'Peru (Перу)', 'PF' => 'French Polynesia (Французская Полинезия)', 'PG' => 'Papua New Guinea (Папуа - Новая Гвинея)', 'PH' => 'Philippines (Филиппины)', 'PK' => 'Pakistan (Пакистан)', 'PL' => 'Poland (Польша)', 'PM' => 'Saint Pierre and Miquelon (Сен-Пьер и Микелон)', 'PN' => 'Pitcairn Island (остров Питкэрн)', 'PR' => 'Puerto Rico (Пуэрто-Рико)', 'PS' => 'Palestine (Палестина)', 'PT' => 'Portugal (Португалия)', 'PW' => 'Palau (Палау)', 'PY' => 'Paraguay (Парагвай)', 'QA' => 'Qatar (Катар)', 'RE' => 'Reunion Island (остров Реюньон)', 'RO' => 'Romania (Румыния)', 'RU' => 'Russian Federation (Россия)', 'RW' => 'Rwanda (Руанда)', 'SA' => 'Saudi Arabia (Саудовская Аравия)', 'SB' => 'Solomon Islands (Соломоновы Острова)', 'SC' => 'Seychelles (Сейшельские Острова)', 'SD' => 'Sudan (Судан)', 'SE' => 'Sweden (Швеция)', 'SG' => 'Singapore (Сингапур)', 'SH' => 'Saint Helena (остров Святой Елены)', 'SI' => 'Slovenia (Словения)', 'SJ' => 'Svalbard and Jan Mayen Islands', 'SK' => 'Slovakia (Словакия)', 'SL' => 'Sierra Leone (Сьерра-Леоне)', 'SM' => 'San Marino (Сан-Марино)', 'SN' => 'Senegal (Сенегал)', 'SO' => 'Somalia (Сомали)', 'SR' => 'Suriname (Суринам)', 'ST' => 'Sao Tome and Principe (Сан-Томе и Принсипи)', 'SU' => 'exUSSR (СССР)', 'SV' => 'El Salvador (Сальвадор)', 'SY' => 'Syria (Сирия)', 'SZ' => 'Swaziland (Свазиленд)', 'TC' => 'Turks and Caicos Islands', 'TD' => 'Chad (Чад)', 'TF' => 'French Southern Territories', 'TG' => 'Togo (Того)', 'TH' => 'Thailand (Таиланд)', 'TJ' => 'Tajikistan (Таджикистан)', 'TK' => 'Tokelau (Токелау)', 'TL' => 'Timor-Leste', 'TM' => 'Turkmenistan (Туркменистан)', 'TN' => 'Tunisia (Тунис)', 'TO' => 'Tonga (Тонга)', 'TP' => 'East Timor (Восточный Тимор)', 'TR' => 'Turkey (Турция)', 'TT' => 'Trinidad and Tobago (Тринидад и Тобаго)', 'TV' => 'Tuvalu (Тувалу)', 'TW' => 'Taiwan (Тайвань)', 'TZ' => 'Tanzania (Танзания)', 'UA' => 'Ukraine (Украина)', 'UG' => 'Uganda (Уганда)', 'UK' => 'United Kingdom (Соединенное Королевство Великобритании и Северной Ирландии)', 'UM' => 'United States Minor Outlying Islands', 'US' => 'United States (США)', 'UY' => 'Uruguay (Уругвай)', 'UZ' => 'Uzbekistan (Узбекистан)', 'VA' => 'Holy See, Vatican (Ватикан)', 'VC' => 'Saint Vincent and the Grenadines (Сент-Винсент и Гренадины)', 'VE' => 'Venezuela (Венесуэла)', 'VG' => 'Virgin Islands, British (Виргинские острова, Британские)', 'VI' => 'Virgin Islands, US (Виргинские острова, США)', 'VN' => 'Vietnam (Вьетнам)', 'VU' => 'Vanuatu (Вануату)', 'WF' => 'Wallis and Futuna Islands', 'WS' => 'Western Samoa (Западное Самоа)', 'YE' => 'Yemen (Йемен)', 'YT' => 'Mayotte', 'YU' => 'Yugoslavia (Югославия)', 'ZA' => 'South Africa (ЮАР)', 'ZM' => 'Zambia (Замбия)', 'ZW' => 'Zimbabwe (Зимбабве)', '--' => 'Неизвестная страна', ); var $ip; var $field = "country:"; function class_country_ip() { //CONSTRUCTOR //echo $this->country("127.0.0.1"); } function country($tmp_ip) { $this->ip = $tmp_ip; if ((ip2long($this->ip)==-1) or (ip2long($this->ip)===FALSE)) { return $this->country['--'].' (некорректный ip)'; } //на этом сервере стоит какая-то защита от такого метода. возвращается 403, хотя при открытии браузером никаких проблем нет //$fp = @file("http://www.ripe.net/whois?form_type=simple&full_query_string=&searchtext={$this->ip}"); //$fp = @file("http://ripe.net/fcgi-bin/whois?form_type=advanced&full_query_string=&searchtext={$this->ip}&do_search=Search&inverse_attributes=None&ip_search_lvl=Default%28nearest+match%29&alt_database=RIPE&object_type=All"); $fp = @file("http://nic.ru/whois/?ip={$this->ip}"); if (!is_array($fp)) { $this->country['--'].' (не могу открыть канал)'; } $lineaok = array(); $i = 0; while (list ($line_num, $line) = each ($fp)) { if(stristr($line,$this->field)!=""){ // find field $i++; $lineaok[$i]['line']=$line; $sign = substr(trim(str_replace(" ","",str_ireplace($this->field,"",$line))),0,2); $lineaok[$i]['value']=$sign; $lineaok[$i]['note']=$this->country[$sign]; } } if (count($lineaok)<1) { //no matchs return $this->country['--'].' (нет записи о стране)'; } else { foreach ($lineaok as $entry) { if (is_array($entry)) { // is a really match if (strlen($entry['note'])>0) { //got a country name in match return $entry['note']; } else { $result = $this->country['--'].' (неизвестный код: '.$entry['value'].')'; } } else { $result = $this->country['--'].' (структура нарушена)'; //incorrect structure } } } return $result; } } //end class ?> в рутовом index.php находимrequire KERNEL_PATH."class_converge.php"; и НИЖЕ вставляем:require ROOT_PATH."sources/classes/whois.php"; $ip_base = new class_country_ip(); теперь идем в /sources/online.php и находим function list_all() { global $ibforums, $DB, $std, $forums; ЗАМЕНЯЕМ на function list_all() { global $ibforums, $DB, $std, $forums, $ip_base; потом находим$sess['where_line'] = $line; и НИЖЕ вставляем$sess['country'] = "<br />".$ip_base->country($sess['ip_address']); потом находим return $this->html->show_row($sess); и ВЫШЕ вставляем $sess['member_name'] .= $sess['country']; вот такая вот петрушка.теперь по ссылке со списком "кто в онлайне" можно под ником увидеть страну. Изменено 10 Августа 2005 пользователем Anna Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
xren Опубликовано 10 Августа 2005 Жалоба Поделиться Опубликовано 10 Августа 2005 На IPB 2.0 ( Localhost ) не пашет. На меня не пенять - всё скопипастено верно. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Anna Опубликовано 10 Августа 2005 Автор Жалоба Поделиться Опубликовано 10 Августа 2005 До того как ты написал, я забыла вот это: online.phpfunction list_all() { global $ibforums, $DB, $std, $forums, $ip_base; проверь.[1123688439:1123688489]И если не пашет - потрудись написать что именно и что выдается. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
xren Опубликовано 10 Августа 2005 Жалоба Поделиться Опубликовано 10 Августа 2005 Кстати надо бы где-то флаги стран достать достаточно небольшие и четкие... Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Anna Опубликовано 10 Августа 2005 Автор Жалоба Поделиться Опубликовано 10 Августа 2005 Вот тебе база:http://www.flags.net/fullindex.htmесли сделаешь зип с картинками и массивчик со ссылками типа array( 'RU' => '/images/ru.gif', ... ); я тебе буду безмерно благодарна![1123688779:1123689378]У меня вопрос - есть ли предложения по тому, как сделать этот мод быстрее, потому что при большом кол-ве пользователь он у меня иногда даже не укладывается в 30 секунд. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
GiV Опубликовано 10 Августа 2005 Жалоба Поделиться Опубликовано 10 Августа 2005 использовать готовые базы, а не WHOIS сервера... которые еще и лимиты имеют на количество запросов в день. P.S. для справедливости авторов идеи указывать стоит. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Anna Опубликовано 10 Августа 2005 Автор Жалоба Поделиться Опубликовано 10 Августа 2005 Да-да. Прошу прощения.Вобщем идея такой модификации принадлежит IBresource (не знаю кому именно).Верно? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
GiV Опубликовано 10 Августа 2005 Жалоба Поделиться Опубликовано 10 Августа 2005 Верно. Оптимизация определения страны:$fp = @file("http://nic.ru/whois/?ip=".$this->ip); foreach ( $fp as $line ) { if ( stristr( $line, 'country' ) ) { preg_match( '~([a-z]+)(?=<br>)~i', $line, $match ); $countryCode = strtoupper( $match[1] ); break; } } $countryName = $this->country[ $countryCode ] в общем то и все... Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
DANMASTER Опубликовано 10 Августа 2005 Жалоба Поделиться Опубликовано 10 Августа 2005 А нигде случайно нету бесплатных GeoIP баз?Я думаю основные страны можно забить в базу, а там как Anna, проверять код страны и диапазон IP адерса,тем самым проверка будет моментальная, такой скрипт я и сам дажемогу написать, нужен только файл с диапазонами и кодами. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Dekker Опубликовано 10 Августа 2005 Жалоба Поделиться Опубликовано 10 Августа 2005 >>А нигде случайно нету бесплатных GeoIP баз? а ты чисто случайно не знаешь что есть такое как google.ru ??? находиться аж бегом с первого раза. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Hostem Опубликовано 10 Августа 2005 Жалоба Поделиться Опубликовано 10 Августа 2005 У меня вопрос - есть ли предложения по тому, как сделать этот мод быстрее, потому что при большом кол-ве пользователь он у меня иногда даже не укладывается в 30 секунд.<{POST_SNAPBACK}> использовать готовые базы, а не WHOIS сервера... которые еще и лимиты имеют на количество запросов в день. А может пусть генерирует эту базу (раз уж ГеоАйПи платное) в одну таблицу, которую надо присоединять ЛЕФТ ДЖОЙНом, и если не нашло страны из таблицы, то определять через WhoIs и делать вставку в ту таблицу ) ? Постоянных посетителей не будет проверять по нескольку раз . Хотя вместо одной нагрузки будет другая нагрузка на БД ... Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
xren Опубликовано 10 Августа 2005 Жалоба Поделиться Опубликовано 10 Августа 2005 Какой же вывод? Правильно! Забить на эту чепуху и заниматься полезныит вещами. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
d1pro Опубликовано 10 Августа 2005 Жалоба Поделиться Опубликовано 10 Августа 2005 Внатуре - сделать кэширование и будет вам самообучаемая база данных. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Hostem Опубликовано 10 Августа 2005 Жалоба Поделиться Опубликовано 10 Августа 2005 ага )) попробовать стоит )) Как по вашему мнению лучше предсталять айпи - в виде поля-строки "235.255.251.211" (14 байт) или в виде 4-х полей tinyint unsigned (4 байта)? т.е. в каком случае индексы будут оптимальней...? Или может в одним числовым тут можно обойтись!? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
d1pro Опубликовано 10 Августа 2005 Жалоба Поделиться Опубликовано 10 Августа 2005 Лучше брать по маске подсети, т.е. последнюю цифру лучше не учитывать. А если уж очень хочется цифру, то можно паковать в int, это вроде даже стандартная функция есть. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Hostem Опубликовано 11 Августа 2005 Жалоба Поделиться Опубликовано 11 Августа 2005 А может во время вставки сессии определять и записывать в поле? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
GiV Опубликовано 11 Августа 2005 Жалоба Поделиться Опубликовано 11 Августа 2005 Внатуре - сделать кэширование и будет вам самообучаемая база данных.<{POST_SNAPBACK}>я еще раз повторяю, существует лимит на количество обращений к WHOIS сервису. Базу вы обучать будете несколько лет при таком раскладе. А на форумах с большим кол-вом посещений вы просто будете упираться в лимит. Все что вам нужно это GeoIP база, или mod_geo для Apache. Не выдумывайте, этот вопрос я изучил еще год назад, так что все идеи по этому поводу я уже читал и анализировал. Выход только один - специализированная база. Да для тех кто захочет вытаскивать города из WHOIS, сразу предупреждаю что все базы WHOIS серверов не являются однозначно заполнеными, так что в поле address не обязательно будет содержаться город. Кстати страны тоже не всегда указываются. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
SAT Опубликовано 11 Августа 2005 Жалоба Поделиться Опубликовано 11 Августа 2005 я месяца полтора мучал этот вопрос..... все рашается через кеширование но со специализированной и обработанной базой в инете такого нет как я уже писал раньше все решается с помощью одной прекрассной формулы... Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
GiV Опубликовано 11 Августа 2005 Жалоба Поделиться Опубликовано 11 Августа 2005 Извращенцы! =) Мне вас жалко... Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
SAT Опубликовано 11 Августа 2005 Жалоба Поделиться Опубликовано 11 Августа 2005 Извращенцы! =) Мне вас жалко... может и еще проще решается, все возможно (можно вообще использовать бинарный поиск по файлу c IP, но тоже извращенство) ЗЫ: в первый раз я решил проблемму в двадцать строк, эффектно но эффективно(тест показал), ща подругому все ЗЫЫ: только не подумайте что юзается бесплатная база ip2counrtry Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Vanger Опубликовано 11 Августа 2005 Жалоба Поделиться Опубликовано 11 Августа 2005 да выскожу свое мнение, сам реализовывал такую фичу, но черз WhoIs это медленно и невозможно из-за ограничений как сказад GiV. GeoIP в этом случае самое лучшее решение. Самый лучший вариант это когда на сервере стоит, но GeoIP можно и так использовать но нужна база, которую реально найти.))) Именно через него делал у себя[1123759584:1123760227]Да-да. Прошу прощения.Вобщем идея такой модификации принадлежит IBresource (не знаю кому именно).Верно? <{POST_SNAPBACK}> Вот тебе флаги flags.zip Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
DANMASTER Опубликовано 11 Августа 2005 Жалоба Поделиться Опубликовано 11 Августа 2005 а ты чисто случайно не знаешь что есть такое как google.ru ??? находиться аж бегом с первого раза. Ничего там не находится, 50$ заплати тогда найдётся тебе база. Поэтому и спрашиваю. http://www.maxmind.com/ - здесь кое-что есть, но этот сайт я ещё нашёл довольно давно. там и модули для апача есть. Дану не легче считывать из поля Откуда город или страну и выводить в список онлайн, иначе только лишнии тормоза ИМХО. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Vanger Опубликовано 11 Августа 2005 Жалоба Поделиться Опубликовано 11 Августа 2005 а ты чисто случайно не знаешь что есть такое как google.ru ??? находиться аж бегом с первого раза. Ничего там не находится, 50$ заплати тогда найдётся тебе база. Поэтому и спрашиваю. http://www.maxmind.com/ - здесь кое-что есть, но этот сайт я ещё нашёл довольно давно. там и модули для апача есть. Дану не легче считывать из поля Откуда город или страну и выводить в список онлайн, иначе только лишнии тормоза ИМХО.<{POST_SNAPBACK}>Нет при установленом модуле Апача никаких лишних тормозов. пока не заметил.правда у мя пиковая нагрузка последнее время не более 30 онлайн, но тормозов нет. дабы страна определятся при старте сессии и пишется в таблицу. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
DANMASTER Опубликовано 11 Августа 2005 Жалоба Поделиться Опубликовано 11 Августа 2005 Правильно у тебя на локалке стоит модуль, а для начала нужно попробывать хотябы поставить на хостинге, что там врятли разрешат, и затестить на форумах где в онлайн более 300 человек. =) Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Vanger Опубликовано 11 Августа 2005 Жалоба Поделиться Опубликовано 11 Августа 2005 Правильно у тебя на локалке стоит модуль, а для начала нужно попробывать хотябы поставить на хостинге, что там врятли разрешат, и затестить на форумах где в онлайн более 300 человек. =)<{POST_SNAPBACK}>Ну вон на хостинге все крутится можешь посмотреть, адрес в профиле. Да и при 300 не будет разници, дабы это опеределяется еще как только пользователь пришел на хост. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Рекомендуемые сообщения
Присоединиться к обсуждению
Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.