Du erklærer denne MySQL-funktion i din applikation, og den forbliver i databasen, indtil databaseserveren genstartes.
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");
Dette bruger MySQL's matematiske funktioner . Aflæsning af denne behandling til databasen er hurtig og effektiv (dataene behøver ikke at rejse hen over ledningen, og du får kun de resultater, du ønsker).
Når du har erklæret dette, kan du bruge det sådan:
$query = "SELECT lat, lon FROM zipcodes WHERE Distance(lat, lon, 0, 0) < 20";
mysql_query($query);
Men hvis din database genstarter, går alle tidligere erklærede funktioner eller procedurer tabt. Det er muligt at håndtere MySQL-fejl 1305 (Function functionName does not exist
) yndefuldt på applikationsniveau.
I din database fejlbehandler:
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;
...