Eelmistes postitustes kirjutasin hästi Google Mapsi API -ga töötamise kohta. Ausalt öeldes pole ma pärast seda postitust sellega töötanud.
Siiski olen PHP-s pidanud töötama laius- ja pikkuskraadidega ning mõned tavad, mida olen hakanud kasutama, võivad minu arvates meid koordinaatide või ujukomaväärtustega üldiselt hästi kasutada.
Järgmises koodiosas kirjeldan kasutatud lähenemisviisi ja põhjuseid. Kuid ma tahan olla selge, et kui loete seda seoses Google Mapsi API-ga, ei saa ma selle toimimise ja nende API praeguse versiooni osas palju pakkuda.
Laius- ja pikkuskraad PHP-s
Kui töötate PHP-s laius- ja pikkuskraadidega, kasutate ujukoma väärtusi, eks? Nii et te ei soovi kunagi neid millekski vähemaks sõeluda; vastasel juhul kaotate andmeid ja te ei suuda leida seda, mida proovite leida.
Seega eeldame kõigi kavatsuste ja eesmärkide jaoks, et teil on serverisse saabunud teave ja peate sellega töötama PHP-ga.
Kaks asja, mida soovite meeles pidada, on järgmised:
- desinfitseerida sissetulevad andmed,
- veenduge, et see oleks teisendatud ujukoma väärtuseks.
Seda saab teha PHP filter_var ja floatval funktsioonide abil, millest ma räägin kohe. Pange tähele, et kui floatvali tulemus ei tagasta ujukoma, peab teil olema graatsiline viis selle käsitlemiseks.
Juhendi kohaselt võib floatval tagastada järgmised andmed:
Antud muutuja ujuvväärtus. Tühjad massiivid tagastavad 0, mittetühjad massiivid tagastavad 1. Stringid tagastavad suure tõenäosusega 0, kuigi see sõltub stringi kõige vasakpoolsematest tähemärkidest. Kehtivad ujukiheite ühised reeglid.
Kuidas seda graatsilisemalt käsitleda, vaatame hiljem postituses.
Sissetulevate laius- ja pikkuskraadi sõelumine
Oletame, et sissetulevad väärtused on PHP kogus $_REQUEST (mis viitavad serverisse saabuvatele HTTP-päringutele), mis on võtmega acme-demo-latitude ja acme-demo-longitude.
Saame need kätte saada järgmiselt :
<?php
$latitude = $_REQUEST['acme-demo-latitude'];
$longitude = $_REQUEST['acme-demo-longitude'];
Kuid sellest ei piisa. Esiteks peame kasutama filtrit filter_var, et veenduda, et andmed on puhastatud ja järgivad ujukoma skeemi :
<?php
$latitude = filter_var(
$_REQUEST['acme-demo-latitude'],
FILTER_SANITIZE_NUMBER_FLOAT
);
$longitude = filter_var(
$_REQUEST['acme-demo-longitude'],
FILTER_SANITIZE_NUMBER_FLOAT
);
Järgmisena leian, et on kasulik kasutada floatvali, et sõeluda tulemus ujukoma väärtusena. See jätab järgmise koodiploki selliseks :
<?php
$latitude = floatval(
filter_var(
$_REQUEST['acme-demo-latitude'],
FILTER_SANITIZE_NUMBER_FLOAT) );
$longitude = floatval(
filter_var(
$_REQUEST['acme-demo-latitude'],
FILTER_SANITIZE_NUMBER_FLOAT) );
Pärast mida saate seda vabalt kasutada. Kuid pidage meeles, et me peame siiski veenduma, et tagastatud väärtused on ujukoma väärtused.
Andmete kinnitamine
Nüüd, kui meil on teave, peame veenduma, et see näeb hea välja. Ja kui see nii ei ole, peame sellega õigesti tegelema. Kui ei, siis saame lihtsalt:
- tagastab vale funktsioonist, millest see sisaldub,
- teha erand ja lubada helistajal seda oma äranägemise järgi käsitleda.
Kõik need näited võivad välja näha selline :
<?php
// Return false...
if (! (is_float( $latitude) && is_float( $longitude) )) {
return false;
}
// Or throw an exception...
if (! (is_float( $latitude) && is_float( $longitude) )) {
throw new Exception('Latitude and longitude are not valid floating point values.');
}
Lõppkokkuvõttes on siiski teie otsustada, kuidas väärtusi käsitleda, kui need pole pärast sõelumist õiges vormingus.
Kas need on parimad tavad?
Ausalt öeldes ma kahtlen selles. Ma tean, et need on asjad, mida olen kasutanud ja mis on mulle kasulikud olnud. See on ka kaitsev ja vastupidav viis veendumaks, et teie väärtused on õiged.
Aga kui selleks on paremaid viise, siis olen valmis neid kommentaarides kuulma.