Вие декларирате тази MySQL функция във вашето приложение и тя ще остане в базата данни, докато сървърът на базата данни не бъде рестартиран.
mysql_query("CREATE FUNCTION Distance(LAT_A INT, LON_A INT, LAT_B INT, LON_B INT, )
RETURNS INT
READS SQL DATA
DETERMINISTIC
BEGIN
DECLARE radius, deltaLat, deltaLon, result, distance BIGINT;
SET radius=3956;
SET deltaLat=LAT_B-LAT_A;
SET deltaLon=LON_B-LON_A;
SET result=POW(SIN(deltaLat/2), 2) + (COS(LAT_A) * COS(LAT_B) * POW(SIN(deltaLon/2.0), 2));
SET distance=radius * 2 * ATAN2(SQRT(result), SQRT(1 - result));
RETURN distance;
END");
Това използва математически функции на MySQL . Разтоварването на тази обработка в базата данни е бързо и ефективно (данните не трябва да се движат по кабела и вие получавате само резултатите, които искате).
След като декларирате това, можете да го използвате по следния начин:
$query = "SELECT lat, lon FROM zipcodes WHERE Distance(lat, lon, 0, 0) < 20";
mysql_query($query);
Въпреки това, ако вашата база данни се рестартира, всички функции или процедури, декларирани по-рано, се губят. Възможно е да се обработва MySQL грешка 1305 (Function functionName does not exist
) изящно на ниво приложение.
В манипулатора на грешки в базата данни:
switch (mysql_errno()):
case 1305:
if (false === $database->_declareStoredProcedureFlag) {
if ($c = preg_match_all("/FUNCTION [a-zA-Z0-9]+\." .
"([a-zA-Z0-9_]*) does not exist/is",
mysql_error(), $matches)
) {
$storedFunctionName = $matches[1][0];
$database->_declareStoredProcedureFlag = true;
if (true === $database->declareStoredFunction($storedFunctionName)) {
$result = mysql_query($query);
}
}
}
break;
...