База адресов есть здесь
http://ipgeo-base.ru/
Карту, точнее доступ к карте, можно взять с http://api.google.com
Оттуда же можно взять API и примеры.
для реализации AJAX можно посмотреть http://dklab.ru/lib/JsHttpRequest/ или же
http://jquery.com. Кстати последняя бибилиотека особенно понравится тем, кому лень кодить :)
Shtogrin, я же писал что способ коварный. но это можно обойти например так:
if ((tags.href.substr(0,1)!="/")&&(tags.href.substr(0,13)!="http://site.ru")) if (tags.href.substr(0,7)!="http://") addevt(tags,"click",detect);
Если хочется отслеживать все ссылки, есть коварный способ посредством javascript
//urlwatcher.js function addevt(el, sEvt, PFnc) { if(el) { if(el.addEventListener) el.addEventListener(sEvt, PFnc, false); else el.attachEvent("on" + sEvt, PFnc); } } function processTags() { tags = document.getElementsByTagName("a"); for (i=0;i<tags.length;i++) { addevt(tags,"click",detect); } } function detect(e) { var tmp = document.createElement("script"); tmp.src = "/url_tracker.php?url=" + e.target.href; document.getelementById("head").appendChild(tmp); }
далее подключаешь скрипт в нужной странице и ставишь его в [body onload="processTags();"]
при клике на ссылки будет вызываться url_tracker.php и ему в качестве параметра будет передавать
1. первое что бросается в глаза - контент как бы висит в воздухе, причем из за разности высот колонок аргументов, фактов, изображения бутылочек и того что они скролятся вниз возникает ощущение ненадежности, что вся эта байда вот вот завалится.
Полосатый фон только усиливает эффект.
Кроме того баллончики выглядят плоскими.
2. Далее факты справа можно неверно истолковать как рекламу, точнее антирекламу продукта, о том что "Пылесос не обладает чистящими свойствами, Щетка вталкивает пыль в структуру сукна, Влажная чистка вытягивает сукно" И кому такой может понадобится?
3. В разделе рекомендации предлагают вычислить размер стола в единицах измерения вероятного противника - в футах. Я например не знаю какой это размер - небольшой столик для игры в пул или стол для русского биллиарда. А может это вообще декоративный какой-нибудь столик. В общем тема расхода средства не раскрыта
Все вышеперечисленное разумеется мое личное мнение
Если ты имел в виду принцип действия робота на php, который парсит страницы сайтов, то в общих чертах это выглядит так
1. Робот формирует GET или POST запрос к интересующей странице сайта (при
необходимости проставляются также referrer и cookies)
2. Читает ответ удаленного http сервера
Самый просто и в то же время самый часто используемый вариант это
$f = file_get_contents("http://www.имя_сайта/index.html");
Если необходимо формировать POST запросы можно указать что-то вроде
$fp = fsockopen($urlinfo['host'],80); fputs($fp, "POST ".$urlinfo['path']." HTTP/1.1\r\n"); fputs($fp, "Host: ".$urlinfo['host']."\r\n"); fputs($fp, "Content-Type: application/x-www-form-urlencoded\r\n"); fputs($fp, "Content-length: " . strlen($data) . "\r\n"); fputs($fp, "Connection: close\r\n\r\n"); fputs($fp, $data); while (!feof($fp)) $buf .= fgets($fp,128); fclose($fp);
3. обрабатывает полученный результат
Тут обычно используются регулярные выражения для непосредственно парсинга. в php это функции preg_match, preg_match_all.
примеры использования и документации по регулярным выражениям есть тут
http://www.pcre.ru/
4. Ну а потом все это кладется например в базу данных
:)
<html> <body> <center>Guest Book</center> <?php //Начало описания функции добавления записи в файл function add($nick, $email, $message) // функция получает три значения - ник, и-мейл, сообщение { $content="<br><b>nick:</b>".$nick."<br><b>e-mail:</b>".$email."<br><b>Message:</b><br>".$message."<br><hr><br>"; // в переменную $content заносим данные с форм if ($fp=@fopen('file.txt','a+')) // если файл открыт (если не открыт - открываем сразу же) для добавления, то { $result=fwrite($fp,$content); // результатом будет запись в него содержимого переменной $content fclose($fp); // закрываем файл } else // если файл невозможно открыть { echo 'ошибка в функции'; // выдем сообщение об ошибке } } // Конец описания функции добавления записи в файл // начало программы if (count($HTTP_POST_VARS)>0) // если в глобальном массиве есть любые значения, то: { add($_POST["nickname"],$_POST["email"],$_POST["message"]); // передаем их функции добавления записи в файл (функция add) if ($fp=@fopen('file.txt','r')) // и если файл открыт (если не открыт - открываем сразу же) для чтения { readfile('file.txt'); // читаем его в браузер } else // если файл невозможно открытть { echo 'Ошибка при попытке загрузки данных из глобального массива'; // выдем сообщение об ошибке } } else // если в глобальном масиве нету значений, то просто выводим содержимое файла в браузер: { if ($fp=@fopen('file.txt','r')) { readfile('file.txt'); } else { echo 'ошибка при обычной загрузке из файла'; } } ?> <br> <center><form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="POST"> <!-- форма, которая отсылает данные текущей странице --> nick: <input type="text" name="nickname" ><br> e-mail: <input type="text" name="email"> <br> message: <input type="text" name="message"><br> <input type="submit" value="ok"> </form>></center> </body>
Так будет работать.
1. PHP_SELF надо было брать в кавычки в глобальном массиве $_SERVER
2. file_put_contents записывает в файл по имени. т.е. надо использовать либо fwrite либо file_put_contents("file.txt",$content)
Можно через output buffer.
function docache($filename) { $f = fopen($filename,"w"); fwrite($f,ob_get_contents()); fclose($f); } //в самом начале ставите проверку на существование кеша $filename = (int)$_GET["id"]; if (file_exists($filename)) { include "$filename.tmp"; } else { ob_start() // начинаем кеширован выводимые данные //ваш скрипт // .... //ваш скрипт docache("$filename.tmp") ob_end_flush(); }
В коде возможны баги и дырки, т.к. пишу по памяти :)
p.s. сейчас вот перечитал ваше сообщение, если нужна статистика управление кешем пожалуй лучше выбрать более основательные решения типа cache_lite из поста товарища Shtogrin