The new version that I hacked together stores number of visits per country and shows the totals when a user clicks a countrys' marker. Visits are stored in an SQLite database, which, as you may know, makes things very easy as there is no server to look after etc. I was thinking of using Berkeley DB, because in an app like this, all that SQL is simply unnecessary sugar, but was lazy in the end (as usual).
Update: Added country flags in place of the same default icon for every country (see: Custom Icons section in Google Maps API).
Update 2: Added tooltip-like functionality, which shows country details in a transient window (label) instead of the default info window. See GxMarker for additional info.
Continuing here from where last nights' script ended. This is just the PHP side of things; Google Maps API examples can be found elsewhere. First we open an SQLite database and create a table for our visitor data if table does not exist:
try {
$db = new PDO('sqlite:' . $_SERVER['DOCUMENT_ROOT'] . '/../db/visitor-locator.sqlite3');
} catch(PDOException $exception) {
die($exception->getMessage());
}
$stmt = $db->query('SELECT name FROM sqlite_master WHERE type = \'table\'');
$result = $stmt->fetchAll();
if(sizeof($result) == 0) {
$db->beginTransaction();
$db->exec('CREATE TABLE visits (country TEXT, visits INTEGER, lat TEXT, lng TEXT);');
$db->commit();
}
Next, check if the country is already in the table and if it is, increment the 'visits' field:
$stmt = $db->query('SELECT country, visits FROM visits WHERE country = \'' . $countryname . '\'');
$result = $stmt->fetch();
if($result['country']) {
$db->beginTransaction();
$stmt = $db->prepare('UPDATE visits SET visits=:visits, lat=:lat, lng=:lng WHERE country=:country');
$stmt->bindParam(':country', $countryname, PDO::PARAM_STR);
$visits = $result['visits'] + 1;
$stmt->bindParam(':visits', $visits, PDO::PARAM_INT);
$stmt->bindParam(':lat', $lat, PDO::PARAM_STR);
$stmt->bindParam(':lng', $lng, PDO::PARAM_STR);
$stmt->execute();
$db->commit();
}
If country was not in the table, create a row for it:
else {
$db->beginTransaction();
$stmt = $db->prepare('INSERT INTO visits (country, visits, lat, lng) VALUES (:country, :visits, :lat, :lng)');
$stmt->bindParam(':country', $countryname, PDO::PARAM_STR);
$visits = 1;
$stmt->bindParam(':visits', $visits, PDO::PARAM_INT);
$stmt->bindParam(':lat', $lat, PDO::PARAM_STR);
$stmt->bindParam(':lng', $lng, PDO::PARAM_STR);
$stmt->execute();
$db->commit();
}
And lastly, fetch all rows and form a Javascript array for our client-side script to use:
$result = $db->query('SELECT country, visits, lat, lng FROM visits');
echo "<script type=\"text/javascript\">\n";
echo "//<![CDATA[\n";
echo "var tbl_country = []; var tbl_visits = []; var tbl_lat = []; var tbl_lng = []; var count = 0;\n";
foreach($result->fetchAll() as $row) {
echo 'tbl_country[count] = \'' . $row['country'] . '\'; ';
echo 'tbl_visits[count] = \'' . $row['visits'] . '\'; ';
echo 'tbl_lat[count] = \'' . $row['lat'] . '\'; ';
echo 'tbl_lng[count] = \'' . $row['lng'] . '\';';
echo " count++;\n";
}
echo "//]]>\n";
echo "</script>\n";