Du deklarerar denna MySQL-funktion i din applikation, och den kommer att finnas kvar i databasen tills databasservern startas om.
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");
Detta använder MySQL:s matematiska funktioner . Att ladda ner denna bearbetning till databasen är snabbt och effektivt (data behöver inte gå över tråden, och du får bara de resultat du vill ha).
När du har deklarerat detta kan du använda det så här:
$query = "SELECT lat, lon FROM zipcodes WHERE Distance(lat, lon, 0, 0) < 20";
mysql_query($query);
Men om din databas startar om går alla funktioner eller procedurer som tidigare deklarerats förlorade. Det är möjligt att hantera MySQL-fel 1305 (Function functionName does not exist
) graciöst på applikationsnivå.
I din databasfelhanterare:
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;
...