Wednesday, December 12, 2007

Geo IP - install Maxmind GeoIP using PHP + MySQL

Geo IP Introduction
Maxmind GeoIP addresses database is an excellent reference for learning where your website visitors are located. Once installed simply pass it an IP address or number query and it can return information about Country, Region, City, Longitude and Latitude co-ordinate locations. You can then manipulate this data to your advantage for statistical analysis, targeted regional advertisements, default language, currency and delivery selections the possibilities are really endless.

About Installing GeoIP
Maxmind are kind enough company to offer two solutions that query IP to country all for free, providing you quote ( "This product includes GeoLite data created by MaxMind, available from http://www.maxmind.com/." ) wherever you use their data. This article is focused on installing the CSV format for use with PHP + MySQL.

Personally I struggling to install the Geo IP database using phpMyAdmin on my remote production server and I couldn't find a tutorial for my circumstance, eventually I managed to do it but it was a very time consuming process which I wish never to go through again, you can read the article I wrote on this method here to judge for yourself Maxmind geoip setup tutorial using phpMyAdmin. It was clear that an easier solution was needed especially when Maxmind release new CSV updates at the start of every month, I didn't want to be going through that process everytime. For my benefit and others I took it upon myself to develop a re-usable script that would make maintaining a GeoIP database a simple task. This article explains how to install the re-usable PHP and MySQL script created by Bartomedia to manage your own Maxmind Geo IP database on your web server quickly and easily.

GeoIP Installation Requirements
Before you proceed you should know that this article assumes you have PHP and MySQL already installed on your web server, you should also have permission to create, edit and delete tables in MySQL. FTP access is also required so you can upload a copy of the Maxmind GeoLite Country CSV file and the PHP script to manage the GeoIP database.

PHP + MySQL GeoIP Manager
Step 1
Create a new file and name it something simple like "GeoIPManager.php" then copy the following code from the grey box below and paste it into the page.


<?php

/*==============================================================================

Application: PHP + MySQL GeoIP Manager
Author: Bartomedia - http://bartomedia.blogspot.com/
Date: 14th December 2007
Description: GeoIP Manager for PHP + MySQL easy install script
Version: V1.0

------------------------------------------------------------------------------*/

// DATABASE CONNECTION AND SELECTION
$host = "localhost";
$username = "root";//
$password = "root";//
$database = "geoipdb";//

// DEFINE THE PATH AND NAME TO THE MAXMIND CSV FILE ON YOUR SERVER
$filename = "GeoIPCountryWhois.csv";
$filepath = $_SERVER["DOCUMENT_ROOT"];


// DO NOT EDIT BELOW THIS LINE
//////////////////////////////////////////////////////////////////////////////////
$error_msg = "";
$message = "";
$dependent = 1;

if ( ! ereg( '/$', $filepath ) )
{ $filepath = $filepath."/"; }

// the @ symbol is warning suppression so a warning will not be thrown back
// to the user, be careful not to over-rely on warning suppression, every
// warning suppression should be modified with an if else to catch the
// warning

if ( ! $Config["maindb"] = @mysql_connect($host, $username, $password) )
{
$error_msg.= "There is a problem with the <b>mysql_connect</b>, please check the username and password !<br />";
$dependent = 0;
}
else
{
if ( ! mysql_select_db($database, $Config["maindb"]) )
{
$error_msg.= "There is a problem with the <b>mysql_select_db</b>, please check that a valid database is selected to install the GeoIP database to !<br />";
$dependent = 0;
}
else
{
// CHECK FOR SAFE MODE
if( ini_get('safe_mode') )
{
// Do it the safe mode way
$error_msg.= "Warning Safe Mode is ON, please turn Safe Mode OFF to avoid the script from timing out before fully executing and installing the GeoIP database.<br />";
$dependent = 0;
}
else
{
// MAX EXECUTION TIME OF THIS SCRIPT IN SEC
set_time_limit(0);
// CHECK FOR MAXMIND CSV FILE

if ( ! file_exists($filepath.$filename) )
{
$error_msg.= "The Maxmind GeoLite Countries CSV file could not be found !<br />";
$error_msg.= "Please check the file is located at ".$filepath." of your server and the filename is \"".$filename."\".<br />";
$dependent = 0;
}
else
{
$lines = count(file($filepath.$filename));
$filesize = filesize($filepath.$filename);
$filectime = filectime($filepath.$filename);
$filemtime = filemtime($filepath.$filename);
$fileatime = fileatime($filepath.$filename);
}
}
}
}




// SCRIPT FUNCTIONS
function check_GeoIP_status()
{
global $Config;
global $lines;
$result = mysql_query("SHOW TABLE STATUS LIKE 'ip'", $Config["maindb"]);
if($ip = mysql_fetch_array($result))
{
// Check within 3 rows difference for new CSV
// updates usually feature many more lines of code
if ( $ip["Rows"] > ($lines - 3 ) )
{return "OK";}
else
{return "UPDATE";}
}
else
{return "CREATE";}
}

function load_new_GeoIP_data($filename)
{
global $Config;
global $message;

$query = "DROP TABLE IF EXISTS `csv`"; // EMPTY
if ( ! $result = mysql_query( $query, $Config["maindb"] ) )
{
$message.= "Failed to delete the `csv` table, Please check you have permission to drop tables.<br />";
return false;
}

$query = "CREATE TABLE IF NOT EXISTS `csv` (
`start_ip` char(15)NOT NULL,
`end_ip` char(15)NOT NULL,
`start` int(10) unsigned NOT NULL,
`end` int(10) unsigned NOT NULL,
`cc` char(2) NOT NULL,
`cn` varchar(50) NOT NULL
) TYPE=MyISAM;";
if ( ! $result = mysql_query( $query, $Config["maindb"] ) )
{
$message.= "Failed to create the `csv` table, Please check you have permission to create tables.<br />";
return false;
}

$query = "LOAD DATA LOCAL INFILE \"".$filename."\"

INTO TABLE `csv`
FIELDS
TERMINATED BY \",\"
ENCLOSED BY \"\\\"\"
LINES
TERMINATED BY \"\\n\"
(
start_ip, end_ip, start, end, cc, cn
)";
if ( ! $result = mysql_query( $query, $Config["maindb"] ) )
{
$message.= "Failed to load the Maxmind CSV file into the `csv` table.<br />";
return false;
}

return true;
}


function build_GeoIP_data()
{
global $Config;
global $message;

$query = "DROP TABLE IF EXISTS `cc`"; // DELETE
if ( ! $result = mysql_query( $query, $Config["maindb"] ) )
{
$message.= "Failed to delete the `cc` table, Please check you have permission to drop tables.<br />";
return false;
}

$query = "CREATE TABLE IF NOT EXISTS `cc` (
`ci` tinyint(3) unsigned NOT NULL auto_increment,
`cc` char(2) NOT NULL,
`cn` varchar(50) NOT NULL,
PRIMARY KEY (`ci`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;";
if ( ! $result = mysql_query( $query, $Config["maindb"] ) )
{
$message.= "Failed to create the `cc` table, Please check you have permission to create tables.<br />";
return false;
}

$query = "DROP TABLE IF EXISTS `ip`"; // DELETE
if ( ! $result = mysql_query( $query, $Config["maindb"] ) )
{
$message.= "Failed to delete the `csv` table, Please check you have permission to drop tables.<br />";
return false;
}

$query = "CREATE TABLE IF NOT EXISTS `ip` (
`start` int(10) unsigned NOT NULL,
`end` int(10) unsigned NOT NULL,
`ci` tinyint(3) unsigned NOT NULL,
KEY `start` (`start`),
KEY `end` (`end`)
) TYPE=MyISAM;";
if ( ! $result = mysql_query( $query, $Config["maindb"] ) )
{
$message.= "Failed to create the `ip` table, Please check you have permission to create tables.<br />";
return false;
}

// EXTRACT DATA FROM CSV FILE AND INSERT INTO MYSQL
$query = "INSERT INTO `cc` SELECT DISTINCT NULL, `cc`, `cn` FROM `csv`;";
if ( ! $result = mysql_query( $query, $Config["maindb"] ) )
{
$message.= "Failed to insert data into the `cc` table from the `csv` table, Please check you have permission to insert in tables.<br />";
return false;
}

// OPTIMIZE MYSQL
$query = "INSERT INTO `ip` SELECT `start`, `end`, `ci` FROM `csv` NATURAL JOIN `cc`;";
if ( ! $result = mysql_query( $query, $Config["maindb"] ) )
{
$message.= "Failed to insert data into the `ip` table from the `csv` table, Please check you have permission to insert in tables.<br />";
return false;
}

return true;
}

function cleanup_GeoIP_data()
{
global $Config;
global $message;

$query = "DROP TABLE IF EXISTS `csv`"; // DELETE
if ( ! $result = mysql_query( $query, $Config["maindb"] ) )
{
$message.= "Failed to delete the `csv` table, Please check you have permission to drop tables.<br />";
return false;
}
return true;
}

////////////////////////////////////////////////////////

// FUNCTIONS TO SELECT DATA
function getALLfromIP($addr)
{
global $Config;
// this sprintf() wrapper is needed, because the PHP long is signed by default
$ipnum = sprintf("%u", ip2long($addr));
$query = "SELECT start, cc, cn FROM ip NATURAL JOIN cc WHERE end >= $ipnum ORDER BY end ASC LIMIT 1";
$result = mysql_query($query, $Config["maindb"]);
$data = mysql_fetch_array($result);

if((! $result) || mysql_numrows($result) < 1 || $data['start'] > $ipnum )
{
return false;
}
return $data;
}

function getCCfromIP($addr) {
$data = getALLfromIP($addr);
if($data) return $data['cc'];
return false;
}

function getCOUNTRYfromIP($addr) {
$data = getALLfromIP($addr);
if($data) return $data['cn'];
return false;
}

function getCCfromNAME($name) {
$addr = gethostbyname($name);
return getCCfromIP($addr);
}

function getCOUNTRYfromNAME($name) {
$addr = gethostbyname($name);
return getCOUNTRYfromIP($addr);
}

// EXECUTE SCRIPTING
//////////////////////////////////////////////////////////////


if ( isset ($_REQUEST["command"]) && $_REQUEST["command"] == "cancel" )
{
header( "Location: http://".$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF'] );
exit;
}

if ( $dependent == 0 )
{
$error_msg.= "Please correct the script before continuing !<br />";
}
else
{
// continue with the rest of the script

// CREATE NEW GEOIP DATABASE
if ( ! isset ($_REQUEST["command"]) )
{
$message.= "Current Maxmind GeoIP CSV data<br />";
$message.= "Records = ".$lines." Rows<br />";
$message.= "filesize = ".$filesize." bytes<br />";
$message.= "created = ".date("D j M Y, \a\\t g.i:s a", $filectime)."<br />";
$message.= "modified = ".date("D j M Y, \a\\t g.i:s a", $filemtime)."<br /><br>";

switch (check_GeoIP_status())
{
case "OK":
$message.= "The GeoIP database is fully up to date !<br />";
break;
case "UPDATE":
$message.= "A newer version of the GeoIP country database has been detected !<br />";
$message.= "Would you like to update the GeoIP database ? ";
$message.= "<a href=\"http://".$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']."?command=update\">yes</a><br />";
break;
case "CREATE":
$message.= "The script could not detect a GeoIP country database<br />";
$message.= "Would you like to create a new GeoIP database ? ";
$message.= "<a href=\"http://".$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']."?command=create\">yes</a><br />";
break;
}
}


// CREATE NEW GEOIP DATABASE
if ( isset ($_REQUEST["command"]) && $_REQUEST["command"] == "create" && ! isset ($_REQUEST["confirm"]) )
{
$message.= "Note : Creating a GeoIP database can take as long as 5 minutes depending on you servers processor speed.<br />";
$message.= "After you click 'yes' please wait until the script has finished executing before performing any other action.<br />";
$message.= "Are you sure you would like to create a new GeoIP database ? ";
$message.= "<a href=\"http://".$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']."?command=create&confirm=yes\">yes</a> / ";
$message.= "<a href=\"http://".$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']."?command=cancel\">cancel</a><br />";
}


// UPDATE GEOIP DATABASE
if ( isset ($_REQUEST["command"]) && $_REQUEST["command"] == "update" && ! isset ($_REQUEST["confirm"]) )
{
$message.= "Note : Updating the GeoIP database can take as long as 5 minutes depending on you servers processor speed.<br />";
$message.= "After you click 'yes' please wait until the script has finished executing before performing any other action.<br />";
$message.= "Are you sure you would like to update the GeoIP database ? ";
$message.= "<a href=\"http://".$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']."?command=update&confirm=yes\">yes</a> / ";
$message.= "<a href=\"http://".$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']."?command=cancel\">cancel</a><br />";
}

// CREATE NEW GEOIP DATABASE
if ( isset ($_REQUEST["command"]) && $_REQUEST["command"] == "create" && isset ( $_REQUEST["confirm"]) && $_REQUEST["confirm"] == "yes" )
{
if ( load_new_GeoIP_data($filepath.$filename) )
{
if ( build_GeoIP_data() )
{
if ( cleanup_GeoIP_data() )
{
header( "Location: http://".$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF'] );
exit;
}
}
}
}

// UPDATE GEOIP DATABASE
if ( isset ($_REQUEST["command"]) && $_REQUEST["command"] == "update" && isset ( $_REQUEST["confirm"]) && $_REQUEST["confirm"] == "yes" )
{
if ( load_new_GeoIP_data($filename) )
{
if ( build_GeoIP_data() )
{
if ( cleanup_GeoIP_data() )
{
header( "Location: http://".$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF'] );
exit;
}
}
}
}
}




?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>INSTALL MAXMIND GEOIP COUNTRIES DATABASE</title>
</head>

<body>
<h1>Bartomedia - http://bartomedia.blogspot.com/</h1>

<h3>GEO IP Manager for PHP + MySQL</h3>
<?php

if ( $error_msg != "" )
{
print $error_msg;
}
else
{
print $message;
}

$result = @mysql_query("SELECT * FROM ip LIMIT 1", $Config["maindb"]);
$ip_num_rows = @mysql_num_rows( $result );
$result = @mysql_query("SELECT * FROM cc LIMIT 1", $Config["maindb"]);
$cc_num_rows = @mysql_num_rows( $result );

if ( $ip_num_rows > 0 && $cc_num_rows > 0 )
{
if ( isset( $_POST["ip"] ) && $_POST["ip"] != "" )
{
$ip = $_POST["ip"];
$cc = getCCfromIP($ip);
$cn = getCOUNTRYfromIP($ip);
if ( $cc != false && $cn != false )
{
print "<p>[".$cc."] ".$cn."</p>";
}
else
{
print "<p>IP not found !</p>";
}
}
else
{$ip = "";}
?>

<form action="<?= $_SERVER['PHP_SELF'] ?>" method="post">
<label>IP : <input name="ip" type="text" value="<?= $ip ?>" /></label>

<input name="submit" type="submit" value="submit" />
</form>
<?
}

?>
</body>

</html>


Step 2
When you have created the file adjust the MySQL database connection variables to your own username, password and the name of your own database. Upload the file to the root of your web server by FTP together with the latest copy of the Maxmind Geolite countries CSV file, if you decide to rename the CSV file or upload the two files to a different location you will have to adjust the filename or filepath variables in the script.

Step 3
Open your web browser and access the script you just created and uploaded to your webserver. Follow the simple onscreen instructions to install the database. Within a few minutes you should have your very own GeoIP database up and running. The script also features its own IP querying tool.

If you are having any troubles with this script please leave comments below I will reply as quickly and as best i can.




Querying GeoIP from your script
Create a new php include file, I named mine 'geofunctions.inc.php' appropriately for its purpose, copy and paste into the file the code from the grey box below.

<?php
// FUNCTIONS TO SELECT DATA
function getALLfromIP($addr)
{
global $Config;
// this sprintf() wrapper is needed, because the PHP long is signed by default
$ipnum = sprintf("%u", ip2long($addr));
$query = "SELECT start, cc, cn FROM ip NATURAL JOIN cc WHERE end >= $ipnum ORDER BY end ASC LIMIT 1";
$result = mysql_query($query, $Config["maindb"]);
$data = mysql_fetch_array($result);

if((! $result) || mysql_numrows($result) < 1 || $data['start'] > $ipnum )
{
return false;
}
return $data;
}

function getCCfromIP($addr) {
$data = getALLfromIP($addr);
if($data) return $data['cc'];
return false;
}

function getCOUNTRYfromIP($addr) {
$data = getALLfromIP($addr);
if($data) return $data['cn'];
return false;
}

function getCCfromNAME($name) {
$addr = gethostbyname($name);
return getCCfromIP($addr);
}

function getCOUNTRYfromNAME($name) {
$addr = gethostbyname($name);
return getCOUNTRYfromIP($addr);
}
?>


Upload the 'geofunctions.inc.php' file to the root of your server or to any location you like. You will include this file in all the pages that you require GeoIP querying functions.

From within the page that you require to query GeoIP data use the code in the grey box below as an example.

<?php


// GEO LOCATIONS DATABASE CONNECTION
$Config["geolocationdb"] = mysql_connect("host", "username", "password");
mysql_select_db("geolocationdb", $Config["geolocationdb"]);

include('geofunctions.inc.php');

$remote_address = $_SERVER['REMOTE_ADDR'];

print "<p>".getCCfromIP($remote_address)."</p>\n";
print "<p>".getCOUNTRYfromIP($remote_address)."</p>\n";
?>


Faster GeoIP MySQL Retrieval
Much of my geoip querying is taken from examples at http://vincent.delau.net/php/geoip.html however I have made modifications in my 'geolocations.inc.php' that search and retrieve data faster and more efficiently from comments made at J.Coles weblog following the excellent advice of Andy Skelton, Nikolay Bachiyski and also that of Mark Robson. Nikolay mentions that the GeoLite Country database actually contains lots of gaps so the script returns the country in the nearest range but it may actually be an unassigned gap, his solution was to create a script to fill the gaps with dummy rows and return "-" however this is not essential. Simply query the IP number against the returned start value if you are searching by the end value if it appears outside the range you can simply return "-" or false rather than filling in gaps.

Feel free to use the script wherever you like, if you do use it all I ask for in return is a link back to my Blog

1,071 comments:

«Oldest   ‹Older   1001 – 1071 of 1071
Anonymous said...

Hello! I simply would like to give a huge thumbs up for the good information you might have right
here on this post. I might be coming again to your
blog for more soon.

Stop by my page semoris hotel side antalya

Anonymous said...

Howdy, i read your blog occasionally and i own a similar one and i was just curious if you get a lot of spam comments?

If so how do you stop it, any plugin or anything you can recommend?

I get so much lately it's driving me insane so any help is very much appreciated.

my web blog; oxford ct real estate ()

Anonymous said...

Once some music is in your cloud collection, you can
add a further 2 nights to make sure there are no problems chatting with them in separate incidents.
We throw in a few days. Bottom Closure Rnd 1:
With MC, ch 2, 6 sc in 2nd ch from hook, 2 sc inlast sc, fleshlight ch 1, do not turn.

I told my youngest that we could make snow ice cream
but I think this relationship is going anywhere?

Anonymous said...

Howdy! Someone in my Myspace group shared this website with
us so I came to check it out. I'm definitely loving the information. I'm
bookmarking and will be tweeting this to my followers!
Great blog and great design.

Take a look at my web page: playstation network free redeem codes

Anonymous said...

hello!,I really like your writing so much!
share we keep in touch more about your post on AOL?
I require an expert in this space to resolve my problem.
Maybe that's you! Taking a look forward to look you.

My web-site; Garcinia Cambogia

Anonymous said...

We learn these lessons from the time you are about to live you may be experiencing.
Just remember not to sound to needy or ambitious when you talk to / text / email, those you just casually observe, and those who
are tech-savvy, you can get rid of yeast infection.
Among victims are Mr Buckalew who has been there since before Day One,
and our definitive score of Microsoft's great smartphone hope at version 1. The iPhone 4 S review The iPhone 5 measures 4.

Visit my web site ... fleshlight

Anonymous said...

Nice ρost. I uѕeԁ to be chеcκing соnstantly thіs
blog and I am inѕpirеԁ! Veгy hеlpful іnformation specially the remаіning sectіon :)
ӏ mаintain ѕuch infоrmаtіon a lot.
I useԁ tο be ѕeekіng thіѕ ρaгticular іnfo fоr a long time.
Thank you and goоd luсκ.

my web-ѕite ... Selling Cars For Cash

Anonymous said...

Hey! I just would like to give an enormous thumbs up for the nice
info you have right here on this post. I can be coming back to your weblog for extra
soon.

Also visit my page - sempron 3200+ 64 bit

Anonymous said...

I have been browsing on-line greater than three hours as of late,
yet I never discovered any fascinating article like yours.
It's lovely price sufficient for
me. In my opinion,
if all site owners and bloggers made excellent content material as you probably did, the internet might
be much
more helpful than ever before.

Here is my web-site - san anselmo real estate

Anonymous said...

This paragraph presents clear idea in support of the new users of blogging,
that genuinely how to do running a blog.

My homepage Buy Rejuvenex

Anonymous said...

If you wish for to improve your know-how just keep visiting
this web page and be updated with the newest information posted here.



http://www.naturalweightlosscode.com/exercise-to-lose-weight-and-build-muscles.
html

My web page ... build muscle now :: feedburner.google.com ::

Anonymous said...

I think this is one of the most important info for me.
And i'm glad reading your article. But want to remark on few general things, The web site style is perfect, the articles is really great : D. Good job, cheers

my web site - Louis Vuitton Outlet

Anonymous said...

Hey outstanding blog! Does running a blog such as this require a great deal of work?
I have absolutely no understanding of coding but I was hoping to start
my own blog soon. Anyway, if you have any recommendations or tips for new blog owners please share.
I know this is off subject but I simply had to ask. Kudos!


Here is my web-site; Christian Louboutin - http://ngosummit.com -

Anonymous said...

It might bill consolidate seem on the outside chance that you can borrow more money.
You should know bill consolidate about them, why?

Check out my web page ... web page

Anonymous said...

Hey there! I know this is kinda off topic but I'd figured I'd ask.
Would you be interested in trading links or maybe guest writing a blog post or vice-versa?

My site discusses a lot of the same subjects as yours and I feel we could greatly benefit from each other.
If you might be interested feel free to send me an email.
I look forward to hearing from you! Terrific blog by the way!


Here is my blog; best hosting companies **

Anonymous said...

It's going to be finish of mine day, except before ending I am reading this enormous article to improve my know-how.

Also visit my page ... how to find the value of a car **

Anonymous said...

This can be very confusing, the best thing right now is to stop thinking about your ex ways to attract women would really like.


Also visit my website :: how to attract women

Anonymous said...

Very nice post. I just stumbled upon your weblog and wanted to say that I've truly enjoyed surfing around your blog posts. After all I'll be subscribing to your rss feed and I
hope you write again very soon!

Check out my weblog: im netz casino

Anonymous said...

Somanabolic Muscle Maximizer program is optimized for the U.
5- The actuality about whenever and tips on how to work with both
of those dumbbells and equipments to place on high level of quality muscle quickly.
It will never feature large degrees of filler information,
or even lengthy explanations.

Also visit my web page: Somanabolic Muscle Maximizer Reviews

Anonymous said...

An impressive share! I've just forwarded this onto a coworker who had been conducting a little research on this. And he actually bought me lunch because I stumbled upon it for him... lol. So let me reword this.... Thank YOU for the meal!! But yeah, thanx for spending the time to talk about this subject here on your site.

My page :: and dvd-ram; video cd (vcd) and dvd-audio

Anonymous said...

Ηаve you eveг considегed publiѕhing an еbook or guest authoring on other blogs?
І hаve a blog based on the sаme ideaѕ you diѕсuѕs and woulԁ really like to hаve you share some storіes/іnformаtion.
I know my vіsitοrs wοuld aрρreсiate yοur wοrk.

If yοu arе even rеmotely interеѕted, feel free
to shoοt me аn e mаil.

my blog post http://diettolosebellyfat.webs.com/

Anonymous said...

Hi there I am so thrilled I found your webpage, I really found you by mistake,
while I was researching on Google for something else, Nonetheless I am here now and would just like to say cheers
for a incredible post and a all round enjoyable blog (I also love
the theme/design), I don’t have time to go through it all at the minute but I have bookmarked it and also added in
your RSS feeds, so when I have time I will be back to read a great deal more,
Please do keep up the awesome work.

Look at my blog - find

Anonymous said...

This paragraph will assist the internet users for setting up new web site or even a blog from start to end.


Feel free to visit my homepage: league of legends hack - www.dailymotion.com -

Anonymous said...

Hey I know this is off topic but I was wondering if you knew of any widgets I could
add to my blog that automatically tweet my newest twitter updates.
I've been looking for a plug-in like this for quite some time and was hoping maybe you would have some experience with something like this. Please let me know if you run into anything. I truly enjoy reading your blog and I look forward to your new updates.

Feel free to visit my homepage: hd video recorder

Anonymous said...

Hello mates, how is everything, and what you would like to say
concerning this post, in my view its in fact remarkable in favor of me.


Visit my web site; xerox 8560 specs

Anonymous said...

Magnificent site. A lot of helpful information here.
I am sending it to a few friends ans also sharing in delicious.

And certainly, thanks in your sweat!

Check out my web page; Nike Blazers High

Anonymous said...

Very good website you have here but I was wondering if
you knew of any community forums that cover the same topics discussed in this article?
I'd really like to be a part of online community where I can get suggestions from other experienced people that share the same interest. If you have any suggestions, please let me know. Thanks a lot!

Feel free to surf to my webpage Mulberry Outlet UK

Anonymous said...

Woah! I'm really loving the template/theme of this blog. It's simple,
yet effective. A lot of times it's very hard to get that "perfect balance" between usability and visual appeal. I must say that you've done a fantastic job with this.

Also, the blog loads super quick for me on Chrome.
Exceptional Blog!

Take a look at my site best allergy medicine

Anonymous said...

Whats up! I'm about to begin my own blog and was wondering if you know where the best place to acquire a blog url is? I am not even sure if that's
what its called? (I'm new to this) I'm referring to "http://www.blogger.com/comment.g?blogID=44297570575622545&postID=3277077064544829634".
How do I go about getting one of these for the website I'm building? Thanks a lot

Feel free to surf to my page - helpful resources ()

Anonymous said...

That is really attention-grabbing, You are an
excessively skilled blogger. I've joined your feed and look forward to in the hunt for extra of your great post. Additionally, I have shared your site in my social networks

Look at my page; Buy Splendyr

Anonymous said...

You can definitely see your enthusiasm within the
work you write. The arena hopes for more passionate writers such as you who aren't afraid to say how they believe. Always follow your heart.

Feel free to visit my blog post; KD Shoes

Anonymous said...

Nice response in return of this query with real arguments
and explaining all regarding that.

Feel free to visit my site :: casinos Online

Anonymous said...

Ѕpοt on with this write-up, I actually think
thiѕ web site neеds a great deal more attеntion.
I'll probably be returning to read through more, thanks for the info!

Take a look at my blog: comparatif ssd

Anonymous said...

Hello, after reading this awesome piece of writing i am as well delighted to
share my know-how here with mates.

Here is my web blog: Casinos Online

Anonymous said...

adult dating on-line http://loveepicentre.com on-line video dating
free houston tx dating sites [url=http://loveepicentre.com/articles/]who is tim kang dating[/url] long hair dating
dating video angry [url=http://loveepicentre.com/]dating id number[/url] adult dating saganaw mi area [url=http://loveepicentre.com/user/sharon_durrell/]sharon_durrell[/url] ariane dating cheats

Anonymous said...

Today, I went to the beachfront with my children. I found
a sea shell and gave it to my 4 year old daughter and said "You can hear the ocean if you put this to your ear." She put the shell to her ear and screamed.
There was a hermit crab inside and it pinched her ear.

She never wants to go back! LoL I know this is completely off topic but I had
to tell someone!

My blog - http://www.2ndhandsale.com/pg/profile/MattieSCN

Anonymous said...

I really like what you guys are usually up too. This kind
of clever work and reporting! Keep up the good works guys I've added you guys to my blogroll.

Also visit my web site :: online casinos

Anonymous said...

Greеtings! Quісk queѕtion that's entirely off topic. Do you know how to make your site mobile friendly? My web site looks weird when browsing from my apple iphone. I'm trying tο find a tеmplate or plugіn that might
be able to fix this problem. If you haνe any recommendations, ρleаse
share. With thanks!

Alsο vіsit my website; disque ssd

Anonymous said...

Howdy! I could have sworn I've been to this website before but after reading through some of the post I realized it's new to me.
Nonetheless, I'm definitely delighted I found it and I'll be
bookmarking and checking back often!

Feel free to visit my webpage; Auravaie Reviews

Anonymous said...

Hey very nice blog!

Feel free to surf to my homepage buy 5HTP

Anonymous said...

It can help you in your business life, school, or personal life.
This removes mold, dirt, fungi or other debris from entering the home.

This keeps your unit from having to work so hard to heat the water.


Feel free to visit my webpage nest learning thermostat

Anonymous said...

But, with the most recent turn of events, the i - Phone 5 has made a
landmark in the smartphone industry. The Galaxy S has a great 5
MP camera with a resolution of 2592 x 1944 pixels. Fastest
mobile data connections (mobile Internet) are supported:.


Visit my blog post ... samsung galaxy s4

Anonymous said...

Excellent post. I was checking continuously this weblog and I am impressed!
Extremely helpful info specially the ultimate part :) I maintain such information much.
I used to be looking for this certain info for a long time.
Thanks and good luck.

my site :: Tory Burch Shoes

Anonymous said...

Manу caг ownerѕ aгe afraid to еntertain thеse thoughts foг
fear that they maу haρрen. Mаintаin
a pеrfect record anԁ you may be rewardеd wіth
a rеduceԁ ρremium. While thiѕ number ԁoes sometimеs varу from one insurer to anothеr, four aԁditiοnal ог
nameԁ driveгs are typically allowed.


Hеre is mу web site vehicle insurance

Anonymous said...

Hey very nice blog!

Look at my web page Blast Xl and Grow XL

Anonymous said...

Hello, this weekend is fastidious in favor of me, as this occasion i am
reading this fantastic informative paragraph here at my residence.


Here is my weblog :: Kobe Bryant Shoes

Anonymous said...

This program is intended to recover lost passwords
for RAR/WinRAR archives of versions 2.xx and 3.xx. http://www.
winrarpasswordremover.tk/ The free professional solution for recovering lost passwords to RAR and WinRAR archives.


I got this web page from my friend who shared with me on the topic
of this web page and now this time I am browsing
this site and reading very informative content at this time.


my homepage; Rar Cracker

Anonymous said...

I understand that those are the products designed by manufacturers to make them money and if they are endorsed
by winning popular professionals, sales will be high.
Say you're doing as well at Chemistry, and as you are doing at Maths Extension 2, then instead of splitting your study time equally between the two (just because they are both worth 2 units each), you should spend more time on Extension 2, simply because it scales higher. Are you a Kansas City Chiefs or Pittsburgh Steelers fan.

my web site :: spielespielen24.de ()

Anonymous said...

Magnificent website. Lots of helpful info here.

I am sending it to some buddies ans also
sharing in delicious. And of course, thank you in your sweat!


My weblog ... Christian Louboutin Heels

Anonymous said...

Whats up! I simply would like to give an enormous thumbs up
for the good info you will have right here on this post. I will likely be coming again to your weblog for extra soon.


Feel free to surf to my blog post: seoul garden menu grand rapids mi

Anonymous said...

I know this if off topic but I'm looking into starting my own weblog and was curious what all is needed to get setup? I'm
assuming having a blog like yours would cost a pretty penny?
I'm not very web savvy so I'm not 100% certain. Any suggestions or advice
would be greatly appreciated. Appreciate it

Also visit my web blog Nike Air Max

Anonymous said...

I got this site from my friend who told me concerning
this site and now this time I am visiting this web site and reading very informative articles or reviews at this place.



e-cig facts

Anonymous said...

My coder is trying to persuade me to move to .net from PHP.
I have always disliked the idea because of the costs. But he's tryiong none the less. I've been using Movable-type on numerous websites for about a year and am
worried about switching to another platform.
I have heard great things about blogengine.
net. Is there a way I can transfer all my wordpress content into it?

Any kind of help would be greatly appreciated!


Review my site: Air Jordan Pas Cher

Anonymous said...

Awesome blog! Is your theme custom made or did you download it from somewhere?
A theme like yours with a few simple tweeks would really make my blog shine.
Please let me know where you got your design. Thanks

Also visit my webpage :: Nike Blazers Women ()

Anonymous said...

Thank you a bunch for sharing this with all of us you
actually recognise what you are talking approximately!

Bookmarked. Kindly also talk over with my web site =).

We can have a link trade agreement among us

Here is my blog post :: Boutique Air Max

Anonymous said...

An outstanding share! I have just forwarded this onto a friend who has been doing a little homework on this.
And he actually ordered me breakfast simply because I found it for him.
.. lol. So let me reword this.... Thanks for the meal!!

But yeah, thanks for spending time to talk about this topic here on your site.


my homepage :: voyance

Anonymous said...

ghana dating scammers http://loveepicentre.com/contact/ arab brows dating friends
about me dating [url=http://loveepicentre.com/map/]online dating in brazil[/url] david hughes dating web carol stream
dating military [url=http://loveepicentre.com/testimonials/]buxom ladies dating[/url] japanese women dating mexican men [url=http://loveepicentre.com/user/Maks10003/]Maks10003[/url] free dating site nz

Anonymous said...

Have you ever considered about adding a little bit more than
just your articles? I mean, what you say is valuable and
everything. But just imagine if you added some great pictures or
video clips to give your posts more, "pop"! Your content is excellent but with pics and clips, this site could certainly be one of the very best in its field.

Fantastic blog!

my web site: Online Tv Series

Anonymous said...

Thanks for ones marvelous posting! I actually enjoyed
reading it, you will be a great author.I will make sure to bookmark
your blog and will often come back in the foreseeable future.
I want to encourage you continue your great work, have a nice evening!


Check out my webpage ... 100 Day Loans Online

Anonymous said...

What's up everyone, it's my first pay a visit at this
site, and article is actually fruitful for me, keep up posting these types of posts.


My blog post - Gucci Sito Ufficiale

Anonymous said...

A fascinating discussion is worth comment. I do think that you ought to
write more about this topic, it might not be a taboo matter
but typically people do not discuss such subjects.
To the next! Kind regards!!

Also visit my website; free unblocked games at school

Anonymous said...

saint pierre and miquelon dating site http://loveepicentre.com/success_stories/ dating sites member name kristine
isochron dating [url=http://loveepicentre.com/map/]married man couple dating woman[/url] dating phoenician coins
theology on tap dayton dating july [url=http://loveepicentre.com/articles/]bbw free dating nc[/url] real transgender dating [url=http://loveepicentre.com/user/dfgfg/]dfgfg[/url] catholic teen dating

Anonymous said...

Thank you for the auspicious writeup. It in fact was a amusement account it.
Look advanced to far added agreeable from you! However, how could we communicate?



Stop by my web page: Pain gone pen England

Anonymous said...

Valuable info. Fortunate me I found your website accidentally, and I'm stunned why this coincidence didn't happened earlier!
I bookmarked it.

Also visit my homepage voyance

Anonymous said...

I just couldn't leave your site before suggesting that I actually loved the standard info an individual provide on your visitors? Is going to be again often to investigate cross-check new posts

My web site: Coffee PUre Cleanse Diet ()

Anonymous said...

This is a unusual looking cooking lid is made of soft silicone.
There are different gestures for different moments, moods and each gesture is unique in its own way.
Listed below are just a few other flavours you may like to consider choosing from:
.

Feel free to visit my web blog :: dallas cake affairs ()

Anonymous said...

Heya are using Wordpress for your site platform?
I'm new to the blog world but I'm trying to get started and set up my own.
Do you need any coding knowledge to make your own blog? Any help would be greatly appreciated!


my page; make money from home

Unknown said...
This comment has been removed by the author.
Unknown said...

wow amazing post.The key points you mentioned here related to maintenance of car is really awesome.Checking all fluid

levels,changing and of course the regular service of the car which is necessary to maintain our vehicle.Thank you for the

information.
AWS Training in Chennai

Unknown said...

It's very exciting to read this post because i get to know facebook is doing lot of measures in application development and it's a good initiative. Thank you so much for sharing.

Hadoop Training in Chennai

Unknown said...

It's very exciting to read this post because i get to know facebook is doing lot of measures in application development and it's a good initiative. Thank you so much for sharing.

Hadoop Training in Chennai

«Oldest ‹Older   1001 – 1071 of 1071   Newer› Newest»