You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
3.9 KiB
PHP
143 lines
3.9 KiB
PHP
<?php
|
|
|
|
/*
|
|
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
|
|
* Click nbfs://nbhost/SystemFileSystem/Templates/Scripting/EmptyPHP.php to edit this template
|
|
*/
|
|
|
|
$SETTINGS = [
|
|
"debugmode" => true,
|
|
"require_database" => true,
|
|
"result_limit" => 20,
|
|
"database" => [
|
|
// "database_type" => "mysql",
|
|
// "database_name" => "address_autocomplete",
|
|
// "server" => "localhost",
|
|
// "username" => "address_autocomplete",
|
|
// "password" => "address_autocomplete",
|
|
// "charset" => "utf8"
|
|
"database_type" => "sqlite",
|
|
"database" => "/var/www/addressdb.sqlite"
|
|
],
|
|
"memcached" => [
|
|
"enable" => true,
|
|
"server" => "127.0.0.1",
|
|
"port" => 11211,
|
|
"prefix" => "aa"
|
|
]
|
|
];
|
|
|
|
ob_start(); // allow sending headers after content
|
|
// Unicode, solves almost all stupid encoding problems
|
|
header('Content-Type: application/json; charset=utf-8');
|
|
header('X-Powered-By: PHP');
|
|
header("Access-Control-Allow-Origin: *");
|
|
|
|
//
|
|
// Composer
|
|
require __DIR__ . '/vendor/autoload.php';
|
|
|
|
$libs = glob(__DIR__ . "/lib/*.lib.php");
|
|
foreach ($libs as $lib) {
|
|
require_once $lib;
|
|
}
|
|
unset($libs, $lib);
|
|
|
|
use Medoo\Medoo;
|
|
|
|
$database;
|
|
try {
|
|
$database = new Medoo(env("database", []));
|
|
} catch (Exception $ex) {
|
|
if (env("require_database")) {
|
|
http_response_code(500);
|
|
exit('{"status": "ERROR", "msg": "Database error."}');
|
|
}
|
|
}
|
|
|
|
$memcacheconfig = env("memcached", [
|
|
"enable" => false,
|
|
"server" => "127.0.0.1",
|
|
"port" => 11211,
|
|
"prefix" => ""
|
|
]);
|
|
$memcache = new MemcacheDriver($memcacheconfig["enable"], $memcacheconfig["server"], $memcacheconfig["port"], $memcacheconfig["prefix"]);
|
|
unset($memcacheconfig);
|
|
|
|
if (env("debugmode", false)) {
|
|
error_reporting(E_ALL);
|
|
ini_set('display_errors', 'On');
|
|
} else {
|
|
error_reporting(0);
|
|
ini_set('display_errors', 'Off');
|
|
}
|
|
|
|
if (empty($_REQUEST["address"])) {
|
|
exit(json_encode(["status" => "ERROR", "message" => "Empty address"]));
|
|
}
|
|
|
|
if (empty($_REQUEST["zip"])) {
|
|
exit(json_encode(["status" => "ERROR", "message" => "Empty ZIP"]));
|
|
}
|
|
|
|
if (preg_match("/[0-9]{5}-?[0-9]{4}/", $_REQUEST["zip"])) {
|
|
$_REQUEST["zip"] = substr($_REQUEST["zip"], 0, 5);
|
|
}
|
|
|
|
$cacheresp = $memcache->get($_REQUEST["zip"] . "|" . $_REQUEST["address"]);
|
|
if ($cacheresp !== false) {
|
|
exit($cacheresp);
|
|
}
|
|
|
|
$addressparts = explode(" ", $_REQUEST["address"], 2);
|
|
|
|
if (count($addressparts) < 1 || !is_numeric($addressparts[0])) {
|
|
exit(json_encode(["status" => "OK", "results" => []]));
|
|
}
|
|
|
|
if (count($addressparts) == 1) {
|
|
$results = $database->select("addresses",
|
|
["number", "street", "city", "state", "zipcode (zip)"],
|
|
[
|
|
"AND" => ["zipcode" => $_REQUEST["zip"], "number[~]" => $addressparts[0] . "%"],
|
|
"LIMIT" => env("result_limit", 20),
|
|
"ORDER" => ["updated"]
|
|
]
|
|
);
|
|
} else {
|
|
$results = $database->select("addresses",
|
|
["number", "street", "city", "state", "zipcode (zip)"],
|
|
[
|
|
"AND" => ["zipcode" => $_REQUEST["zip"], "number" => $addressparts[0], "street[~]" => $addressparts[1] . "%"],
|
|
"LIMIT" => env("result_limit", 20),
|
|
"ORDER" => ["updated"]
|
|
]
|
|
);
|
|
}
|
|
|
|
|
|
for ($i = 0; $i < count($results); $i++) {
|
|
$results[$i]["address"] = $results[$i]["number"] . " " . $results[$i]["street"];
|
|
}
|
|
|
|
// Remove duplicates
|
|
$finalresults = [];
|
|
for ($i = 0; $i < count($results); $i++) {
|
|
$infinal = false;
|
|
for ($j = 0; $j < count($finalresults); $j++) {
|
|
if ($results[$i]["address"] == $finalresults[$j]["address"]) {
|
|
$infinal = true;
|
|
continue;
|
|
}
|
|
}
|
|
if (!$infinal) {
|
|
$finalresults[] = $results[$i];
|
|
}
|
|
}
|
|
|
|
$resultjson = json_encode(["status" => "OK", "results" => $finalresults]);
|
|
|
|
$memcache->set($_REQUEST["zip"] . "|" . $_REQUEST["address"], $resultjson);
|
|
|
|
exit($resultjson);
|