static function nearest($lat, $lon) { return Buzzstmt::construct(get_called_class(), "\n SELECT *\n FROM `city`\n ORDER BY\n ROUND(SQRT(\n POW('?' - `lat`, 2) +\n POW('?' - `lon`, 2)\n )) ASC\n ", $lat, $lon)->one(); }
<?php $smarty->contentType('text', 'json'); $select = array("`venue`.*", "`hours`.`open`", "`hours`.`close`"); $from = array("`venue`", "`hours`"); $where = array("`venue`.`id` = `hours`.`venue_id`", "`hours`.`weekday` LIKE '%" . strtolower(date('D')) . "%'"); $order = array(); if (isset($_POST['state'])) { $where[] = ($_POST['state'] == "closed" ? "NOT" : "") . sprintf("\n IF(\n `hours`.`open` < `hours`.`close`,\n '%s' BETWEEN `hours`.`open` AND `hours`.`close`,\n '%s' NOT BETWEEN `hours`.`close` AND `hours`.`open`\n )\n ", date('H:m:s'), date('H:m:s')); } if (isset($_POST['lat'], $_POST['lon'])) { $city = city::nearest($_POST['lat'], $_POST['lon']); $select[] = sprintf("\n ROUND(SQRT(\n POW('%u' - `venue`.`lat`, 2) +\n POW('%u' - `venue`.`lon`, 2)\n )) AS `distance`\n ", $_POST['lat'], $_POST['lon']); $where[] = sprintf("\n `venue`.`city_id` = '%u'\n ", $city->id); $order[] = "\n `distance` ASC\n "; } $order[] = "`venue`.`id` ASC"; echo json_encode(Buzzstmt::construct("\n SELECT " . implode(",", $select) . "\n FROM " . implode(",", $from) . "\n WHERE " . implode(" AND ", $where) . "\n ORDER BY " . implode(",", $order) . "\n LIMIT 10\n ")->many());