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);