<?
/* ############################################# */
# #
# Because Water - Drop In App API #
# Designed and Developed at Boston University #
# #
/* ############################################# */
/* API KEY AUTHENTICATION */
$apiKey = '7yEgyaKqGTEyX7wqtGHwX';
if (stripcslashes($_GET['api']) != $apiKey) { # Make sure requester is using a valid API Key }
/* ACTIONS */
if ($action == 'get') {
if ($lat == null or $lng == null) {
}
getData($radius, $lat, $lng);
} else if ($action == 'push') {
if ($name == null or $address == null or $category == null or $lat == null or $lng == null) {
}
pushData($name, $address, $category, $lat, $lng, $details,$locationName,$personName );
} else {
}
/* FUNCTIONS */
function getData($radius, $lat, $lng) {
# Retrieves drop data from the database
# Inputs:
# $radius: Radius to show
# $lat: User's latitude
# $lng: User's longitude
if ($radius == null) { # If radius was not specified
$radius = 5;
}
$con = mysqli_connect("localhost","becausf5","BlueRush.993","becausf5_DropIn_Geolocation") or
die("Error " . mysqli_error($con)); # Connect to database
// Updated Lat/Lng Formula Code from Easement: http://stackoverflow.com/questions/2296824/php-mysql-compare-long-and-lat-return-ones-under-10-miles
$sql = mysqli_query($con, "select *, ((acos(sin($lat * pi() / 180) * sin(lat * pi() / 180) + cos($lat * pi() / 180) * cos(lat * pi() / 180) * cos(($lng - lng) * pi() / 180)) * 180 / pi()) * 60 * 1.1515) AS distance from markers1 where visible = 1 having distance < $radius order by distance limit 30") or
die(mysqli_error($con)); # Select rows
$data['success'] = 'true';
}
if ($data == null) { # If SQL returned null
$data = array('success' => 'false','error' => 'There are no drops within the given radius'); }
echo cleanupJson($json); # Echo json
}
function pushData($name, $address, $category, $lat, $lng, $details, $locationName,$personName) {
# Adds new drop data to the database
# Inputs:
# $name: Friendly name of drop location
# $address: Street address of drop location
# $category: Type of drop (Public Bubbler, Concord on Tap, etc.)
# $lat: Latitude coordinate of drop location
# $lng: Longitude coordinate of drop location
# $details: Description of drop
/* Still need to implement: Check for duplicates */
$categoryArray = array('0' => 'Concord on Tap', '1' => 'Drop In', '2' => 'Public Fountain', '3' => 'User Submitted');
$con = mysqli_connect("localhost","becausf5","BlueRush.993","becausf5_DropIn_Geolocation") or
die("Error " . mysqli_error($con)); # Connect to database $sql = mysqli_query($con, "insert into markers1 (name, address, category, lat, lng, details, visible, locationName, personName) values ('{$name}', '{$address}', '{$categoryArray[{$category}]}', '{$lat}', '{$lng}', '{$details}', '1','{$locationName}','{$personName}')") or
die(mysqli_error($con)); # Insert rows if ($sql) { # If insert was successful
} else { # If insert was NOT successful
}
}
function cleanupJson($json) {
# Cleans up json by indenting and formatting the json into a more readable format
# Inputs:
# $json: A json array
// Code from Edi Budimilic: http://stackoverflow.com/questions/6672656/how-can-i-beautify-json-programmatically
return str_replace(array("{", "}", '","'), array("{<br /> ", "<br />}", '",<br /> "'), $json);
} else {
return $json;
}
}
?>
PD8KCS8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAqLwoJIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCgkjCUJlY2F1c2UgV2F0ZXIgLSBEcm9wIEluIEFwcCBBUEkgICAgICAgICAgICAgICAjCgkjICAgRGVzaWduZWQgYW5kIERldmVsb3BlZCBhdCBCb3N0b24gVW5pdmVyc2l0eSAgICMKCSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwoJLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICovCgkKCS8qIEFQSSBLRVkgQVVUSEVOVElDQVRJT04gKi8KCQoJJGFwaUtleSA9ICc3eUVneWFLcUdURXlYN3dxdEdId1gnOwoJCglpZiAoc3RyaXBjc2xhc2hlcygkX0dFVFsnYXBpJ10pICE9ICRhcGlLZXkpIHsgIyBNYWtlIHN1cmUgcmVxdWVzdGVyIGlzIHVzaW5nIGEgdmFsaWQgQVBJIEtleQoJCWRpZShjbGVhbnVwSnNvbihqc29uX2VuY29kZShhcnJheSgnc3RhdHVzJyA9PiAnZmFsc2UnLCAnZXJyb3InID0+ICdJbnZhbGlkIEFQSSBLZXknKSkpKTsKCX0KCgkvKiBBQ1RJT05TICovCgkJCgkkYWN0aW9uID0gc3RyaXBzbGFzaGVzKCRfR0VUWydhY3Rpb24nXSk7CgkKCWlmICgkYWN0aW9uID09ICdnZXQnKSB7CgkJJHJhZGl1cyA9IHN0cmlwc2xhc2hlcygkX0dFVFsncmFkaXVzJ10pOwoJCSRsYXQgPSBzdHJpcHNsYXNoZXMoJF9HRVRbJ2xhdCddKTsKCQkkbG5nID0gc3RyaXBzbGFzaGVzKCRfR0VUWydsbmcnXSk7CgkJCgkJaWYgKCRsYXQgPT0gbnVsbCBvciAkbG5nID09IG51bGwpIHsKCQkJZGllKGNsZWFudXBKc29uKGpzb25fZW5jb2RlKGFycmF5KCdzdGF0dXMnID0+ICdmYWxzZScsICdlcnJvcicgPT4gJ0ludmFsaWQgcGFyYW1ldGVycycpKSkpOwkKCQl9CgkJCgkJZ2V0RGF0YSgkcmFkaXVzLCAkbGF0LCAkbG5nKTsKCQkKCX0gZWxzZSBpZiAoJGFjdGlvbiA9PSAncHVzaCcpIHsJCQoJCSRuYW1lID0gc3RyaXBzbGFzaGVzKCRfR0VUWyduYW1lJ10pOwoJCSRhZGRyZXNzID0gc3RyaXBzbGFzaGVzKCRfR0VUWydhZGRyZXNzJ10pOwoJCSRjYXRlZ29yeSA9IHN0cmlwc2xhc2hlcygkX0dFVFsnY2F0ZWdvcnknXSk7CgkJJGxhdCA9IHN0cmlwc2xhc2hlcygkX0dFVFsnbGF0J10pOwoJCSRsbmcgPSBzdHJpcHNsYXNoZXMoJF9HRVRbJ2xuZyddKTsKCQkkZGV0YWlscyA9IHN0cmlwc2xhc2hlcygkX0dFVFsnZGV0YWlscyddKTsKCSAJJGxvY2F0aW9uTmFtZT0gc3RyaXBzbGFzaGVzKCRfR0VUWydsb2NhdGlvbk5hbWUnXSk7CiAgICAgIAkJJHBlcnNvbk5hbWUgPSBzdHJpcHNsYXNoZXMoJF9HRVRbJ3BlcnNvbk5hbWUnXSk7CgkJCgkJaWYgKCRuYW1lID09IG51bGwgb3IgJGFkZHJlc3MgPT0gbnVsbCBvciAkY2F0ZWdvcnkgPT0gbnVsbCBvciAkbGF0ID09IG51bGwgb3IgJGxuZyA9PSBudWxsKSB7CgkJCWRpZShjbGVhbnVwSnNvbihqc29uX2VuY29kZShhcnJheSgnc3RhdHVzJyA9PiAnZmFsc2UnLCAnZXJyb3InID0+ICdJbnZhbGlkIHBhcmFtZXRlcnMnKSkpKTsJCgkJfQoJCQoJCXB1c2hEYXRhKCRuYW1lLCAkYWRkcmVzcywgJGNhdGVnb3J5LCAkbGF0LCAkbG5nLCAkZGV0YWlscywkbG9jYXRpb25OYW1lLCRwZXJzb25OYW1lICk7CgkJCgl9IGVsc2UgewoJCWRpZShjbGVhbnVwSnNvbihqc29uX2VuY29kZShhcnJheSgnc3RhdHVzJyA9PiAnZmFsc2UnLCAnZXJyb3InID0+ICdJbnZhbGlkIHJlcXVlc3QnKSkpKTsKCX0JCgoJLyogRlVOQ1RJT05TICovCgkJCglmdW5jdGlvbiBnZXREYXRhKCRyYWRpdXMsICRsYXQsICRsbmcpIHsKCQkjIFJldHJpZXZlcyBkcm9wIGRhdGEgZnJvbSB0aGUgZGF0YWJhc2UKCQkjIElucHV0czoKCQkjCSRyYWRpdXM6IFJhZGl1cyB0byBzaG93CgkJIwkkbGF0OiBVc2VyJ3MgbGF0aXR1ZGUKCQkjCSRsbmc6IFVzZXIncyBsb25naXR1ZGUKCQkKCQlpZiAoJHJhZGl1cyA9PSBudWxsKSB7ICMgSWYgcmFkaXVzIHdhcyBub3Qgc3BlY2lmaWVkCgkJCSRyYWRpdXMgPSA1OwoJCX0KCQkKCQkkY29uID0gbXlzcWxpX2Nvbm5lY3QoImxvY2FsaG9zdCIsImJlY2F1c2Y1IiwiQmx1ZVJ1c2guOTkzIiwiYmVjYXVzZjVfRHJvcEluX0dlb2xvY2F0aW9uIikgb3IgZGllKCJFcnJvciAiIC4gbXlzcWxpX2Vycm9yKCRjb24pKTsgIyBDb25uZWN0IHRvIGRhdGFiYXNlCgkJCgkJLy8gVXBkYXRlZCBMYXQvTG5nIEZvcm11bGEgQ29kZSBmcm9tIEVhc2VtZW50OiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzIyOTY4MjQvcGhwLW15c3FsLWNvbXBhcmUtbG9uZy1hbmQtbGF0LXJldHVybi1vbmVzLXVuZGVyLTEwLW1pbGVzCgkJJHNxbCA9IG15c3FsaV9xdWVyeSgkY29uLCAic2VsZWN0ICosICgoYWNvcyhzaW4oJGxhdCAqIHBpKCkgLyAxODApICogc2luKGxhdCAqIHBpKCkgLyAxODApICsgY29zKCRsYXQgKiBwaSgpIC8gMTgwKSAqIGNvcyhsYXQgKiBwaSgpIC8gMTgwKSAqIGNvcygoJGxuZyAtIGxuZykgKiBwaSgpIC8gMTgwKSkgKiAxODAgLyBwaSgpKSAqIDYwICogMS4xNTE1KSBBUyBkaXN0YW5jZSBmcm9tIG1hcmtlcnMxIHdoZXJlIHZpc2libGUgPSAxIGhhdmluZyBkaXN0YW5jZSA8ICRyYWRpdXMgb3JkZXIgYnkgZGlzdGFuY2UgbGltaXQgMzAiKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb24pKTsgIyBTZWxlY3Qgcm93cwoJCQkJCQoJCSRkYXRhID0gYXJyYXkoKTsKCQl3aGlsZSgkcm93ID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRzcWwpKSB7ICMgTG9vcCB0aHJvdWdoIGFuZCBhZGQgZWFjaCByb3cgdG8gYXJyYXkKCQkJJGRhdGFbJ3N1Y2Nlc3MnXSA9ICd0cnVlJzsKCQkJJGRhdGFbXSA9IGFycmF5X21hcCgnaHRtbGVudGl0aWVzJywkcm93KTsKCQl9CgkJCQoJCWlmICgkZGF0YSA9PSBudWxsKSB7ICMgSWYgU1FMIHJldHVybmVkIG51bGwKCQkJJGRhdGEgPSBhcnJheSgnc3VjY2VzcycgPT4gJ2ZhbHNlJywnZXJyb3InID0+ICdUaGVyZSBhcmUgbm8gZHJvcHMgd2l0aGluIHRoZSBnaXZlbiByYWRpdXMnKTsKCQl9CQkgCgkJCgkJJGpzb24gPSBqc29uX2VuY29kZSgkZGF0YSk7ICMgRW5jb2RlIGFycmF5IGFzIGpzb24KCQllY2hvIGNsZWFudXBKc29uKCRqc29uKTsgIyBFY2hvIGpzb24KCX0KCQoJCgkKCWZ1bmN0aW9uIHB1c2hEYXRhKCRuYW1lLCAkYWRkcmVzcywgJGNhdGVnb3J5LCAkbGF0LCAkbG5nLCAkZGV0YWlscywgJGxvY2F0aW9uTmFtZSwkcGVyc29uTmFtZSkgewoJCSMgQWRkcyBuZXcgZHJvcCBkYXRhIHRvIHRoZSBkYXRhYmFzZQoJCSMgSW5wdXRzOgoJCSMJJG5hbWU6IEZyaWVuZGx5IG5hbWUgb2YgZHJvcCBsb2NhdGlvbgoJCSMJJGFkZHJlc3M6IFN0cmVldCBhZGRyZXNzIG9mIGRyb3AgbG9jYXRpb24KCQkjCSRjYXRlZ29yeTogVHlwZSBvZiBkcm9wIChQdWJsaWMgQnViYmxlciwgQ29uY29yZCBvbiBUYXAsIGV0Yy4pCgkJIwkkbGF0OiBMYXRpdHVkZSBjb29yZGluYXRlIG9mIGRyb3AgbG9jYXRpb24KCQkjCSRsbmc6IExvbmdpdHVkZSBjb29yZGluYXRlIG9mIGRyb3AgbG9jYXRpb24KCQkjCSRkZXRhaWxzOiBEZXNjcmlwdGlvbiBvZiBkcm9wCgkJCgkJLyogU3RpbGwgbmVlZCB0byBpbXBsZW1lbnQ6IENoZWNrIGZvciBkdXBsaWNhdGVzICovCgkJCgkJJGNhdGVnb3J5QXJyYXkgPSBhcnJheSgnMCcgPT4gJ0NvbmNvcmQgb24gVGFwJywgJzEnID0+ICdEcm9wIEluJywgJzInID0+ICdQdWJsaWMgRm91bnRhaW4nLCAnMycgPT4gJ1VzZXIgU3VibWl0dGVkJyk7CgkJCgkJJGNvbiA9IG15c3FsaV9jb25uZWN0KCJsb2NhbGhvc3QiLCJiZWNhdXNmNSIsIkJsdWVSdXNoLjk5MyIsImJlY2F1c2Y1X0Ryb3BJbl9HZW9sb2NhdGlvbiIpIG9yIGRpZSgiRXJyb3IgIiAuIG15c3FsaV9lcnJvcigkY29uKSk7ICMgQ29ubmVjdCB0byBkYXRhYmFzZQoJCSRzcWwgPSBteXNxbGlfcXVlcnkoJGNvbiwgImluc2VydCBpbnRvIG1hcmtlcnMxIChuYW1lLCBhZGRyZXNzLCBjYXRlZ29yeSwgbGF0LCBsbmcsIGRldGFpbHMsIHZpc2libGUsIGxvY2F0aW9uTmFtZSwgcGVyc29uTmFtZSkgCgkJdmFsdWVzICgneyRuYW1lfScsICd7JGFkZHJlc3N9JywgJ3skY2F0ZWdvcnlBcnJheVt7JGNhdGVnb3J5fV19JywgJ3skbGF0fScsICd7JGxuZ30nLCAneyRkZXRhaWxzfScsICcxJywneyRsb2NhdGlvbk5hbWV9JywneyRwZXJzb25OYW1lfScpIikgb3IgZGllKG15c3FsaV9lcnJvcigkY29uKSk7ICMgSW5zZXJ0IHJvd3MKCQlpZiAoJHNxbCkgeyAjIElmIGluc2VydCB3YXMgc3VjY2Vzc2Z1bAoJCQllY2hvIGpzb25fZW5jb2RlKGFycmF5KCdzdWNjZXNzJyA9PiAndHJ1ZScpKTsKCQl9IGVsc2UgeyAjIElmIGluc2VydCB3YXMgTk9UIHN1Y2Nlc3NmdWwKCQkJZWNobyBqc29uX2VuY29kZShhcnJheSgnc3VjY2VzcycgPT4gJ2ZhbHNlJykpOwoJCX0KCX0KCQoJCgkKCWZ1bmN0aW9uIGNsZWFudXBKc29uKCRqc29uKSB7CgkJIyBDbGVhbnMgdXAganNvbiBieSBpbmRlbnRpbmcgYW5kIGZvcm1hdHRpbmcgdGhlIGpzb24gaW50byBhIG1vcmUgcmVhZGFibGUgZm9ybWF0CgkJIyBJbnB1dHM6CgkJIwkkanNvbjogQSBqc29uIGFycmF5CgkJCgkJaWYgKHN0cmlwc2xhc2hlcygkX0dFVFsncmVhZGFibGUnXSkgPT0gJ3RydWUnKSB7CgkJCgkJCS8vIENvZGUgZnJvbSBFZGkgQnVkaW1pbGljOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzY2NzI2NTYvaG93LWNhbi1pLWJlYXV0aWZ5LWpzb24tcHJvZ3JhbW1hdGljYWxseQoJCQkkanNvbiA9IHN0cl9yZXBsYWNlKCdccicsICcgJywgJGpzb24pOwoJCQlyZXR1cm4gc3RyX3JlcGxhY2UoYXJyYXkoInsiLCAifSIsICciLCInKSwgYXJyYXkoIns8YnIgLz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsiLCAiPGJyIC8+fSIsICciLDxiciAvPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyInKSwgJGpzb24pOwoJCQkKCQl9IGVsc2UgewoJCQkkanNvbiA9IHN0cl9yZXBsYWNlKCdccicsICcgJywgJGpzb24pOwoJCQlyZXR1cm4gJGpzb247CgkJfQoJfQo/Pg==
<?
/* ############################################# */
# #
# Because Water - Drop In App API #
# Designed and Developed at Boston University #
# #
/* ############################################# */
/* API KEY AUTHENTICATION */
$apiKey = '7yEgyaKqGTEyX7wqtGHwX';
if (stripcslashes($_GET['api']) != $apiKey) { # Make sure requester is using a valid API Key
die(cleanupJson(json_encode(array('status' => 'false', 'error' => 'Invalid API Key'))));
}
/* ACTIONS */
$action = stripslashes($_GET['action']);
if ($action == 'get') {
$radius = stripslashes($_GET['radius']);
$lat = stripslashes($_GET['lat']);
$lng = stripslashes($_GET['lng']);
if ($lat == null or $lng == null) {
die(cleanupJson(json_encode(array('status' => 'false', 'error' => 'Invalid parameters'))));
}
getData($radius, $lat, $lng);
} else if ($action == 'push') {
$name = stripslashes($_GET['name']);
$address = stripslashes($_GET['address']);
$category = stripslashes($_GET['category']);
$lat = stripslashes($_GET['lat']);
$lng = stripslashes($_GET['lng']);
$details = stripslashes($_GET['details']);
$locationName= stripslashes($_GET['locationName']);
$personName = stripslashes($_GET['personName']);
if ($name == null or $address == null or $category == null or $lat == null or $lng == null) {
die(cleanupJson(json_encode(array('status' => 'false', 'error' => 'Invalid parameters'))));
}
pushData($name, $address, $category, $lat, $lng, $details,$locationName,$personName );
} else {
die(cleanupJson(json_encode(array('status' => 'false', 'error' => 'Invalid request'))));
}
/* FUNCTIONS */
function getData($radius, $lat, $lng) {
# Retrieves drop data from the database
# Inputs:
# $radius: Radius to show
# $lat: User's latitude
# $lng: User's longitude
if ($radius == null) { # If radius was not specified
$radius = 5;
}
$con = mysqli_connect("localhost","becausf5","BlueRush.993","becausf5_DropIn_Geolocation") or die("Error " . mysqli_error($con)); # Connect to database
// Updated Lat/Lng Formula Code from Easement: http://stackoverflow.com/questions/2296824/php-mysql-compare-long-and-lat-return-ones-under-10-miles
$sql = mysqli_query($con, "select *, ((acos(sin($lat * pi() / 180) * sin(lat * pi() / 180) + cos($lat * pi() / 180) * cos(lat * pi() / 180) * cos(($lng - lng) * pi() / 180)) * 180 / pi()) * 60 * 1.1515) AS distance from markers1 where visible = 1 having distance < $radius order by distance limit 30") or die(mysqli_error($con)); # Select rows
$data = array();
while($row = mysqli_fetch_assoc($sql)) { # Loop through and add each row to array
$data['success'] = 'true';
$data[] = array_map('htmlentities',$row);
}
if ($data == null) { # If SQL returned null
$data = array('success' => 'false','error' => 'There are no drops within the given radius');
}
$json = json_encode($data); # Encode array as json
echo cleanupJson($json); # Echo json
}
function pushData($name, $address, $category, $lat, $lng, $details, $locationName,$personName) {
# Adds new drop data to the database
# Inputs:
# $name: Friendly name of drop location
# $address: Street address of drop location
# $category: Type of drop (Public Bubbler, Concord on Tap, etc.)
# $lat: Latitude coordinate of drop location
# $lng: Longitude coordinate of drop location
# $details: Description of drop
/* Still need to implement: Check for duplicates */
$categoryArray = array('0' => 'Concord on Tap', '1' => 'Drop In', '2' => 'Public Fountain', '3' => 'User Submitted');
$con = mysqli_connect("localhost","becausf5","BlueRush.993","becausf5_DropIn_Geolocation") or die("Error " . mysqli_error($con)); # Connect to database
$sql = mysqli_query($con, "insert into markers1 (name, address, category, lat, lng, details, visible, locationName, personName)
values ('{$name}', '{$address}', '{$categoryArray[{$category}]}', '{$lat}', '{$lng}', '{$details}', '1','{$locationName}','{$personName}')") or die(mysqli_error($con)); # Insert rows
if ($sql) { # If insert was successful
echo json_encode(array('success' => 'true'));
} else { # If insert was NOT successful
echo json_encode(array('success' => 'false'));
}
}
function cleanupJson($json) {
# Cleans up json by indenting and formatting the json into a more readable format
# Inputs:
# $json: A json array
if (stripslashes($_GET['readable']) == 'true') {
// Code from Edi Budimilic: http://stackoverflow.com/questions/6672656/how-can-i-beautify-json-programmatically
$json = str_replace('\r', ' ', $json);
return str_replace(array("{", "}", '","'), array("{<br /> ", "<br />}", '",<br /> "'), $json);
} else {
$json = str_replace('\r', ' ', $json);
return $json;
}
}
?>