Nei post precedenti, ho scritto un bel po’ su come lavorare con l’ API di Google Maps. Sinceramente, non ci ho lavorato da quel post.
Tuttavia, ho dovuto lavorare con la latitudine e la longitudine in PHP e ci sono alcune pratiche che ho iniziato a utilizzare che penso possano essere utili quando si lavora con coordinate o valori in virgola mobile, in generale.
Nel seguente bit di codice, analizzerò l’approccio che ho usato e perché l’ho fatto. Ma voglio essere chiaro che se stai leggendo questo in relazione all’API di Google Maps, non c’è molto che posso offrire sul modo in cui funziona e sulla versione attuale della loro API.
Latitudine e longitudine in PHP
Ogni volta che lavori con latitudine e longitudine in PHP, lavori con valori in virgola mobile, giusto? Quindi non vuoi mai analizzarli in niente di meno; in caso contrario, stai perdendo dati e non sarai in grado di individuare qualsiasi cosa tu stia cercando di individuare.
Quindi, a tutti gli effetti, supponiamo che tu abbia informazioni che entrano nel server e devi lavorarci usando PHP.
Le due cose che vuoi ricordare sono:
- sanificare i dati in entrata,
- assicurati che sia convertito in un valore in virgola mobile.
Questo può essere fatto attraverso l’uso delle funzioni filter_var e floatval di PHP di cui parlerò momentaneamente. Si noti, tuttavia, che se il risultato di floatval non restituisce una virgola mobile, è necessario disporre di un modo grazioso per gestirlo.
Secondo il manuale, floatval può restituire quanto segue:
Il valore float della variabile data. Gli array vuoti restituiscono 0, gli array non vuoti restituiscono 1. Molto probabilmente le stringhe restituiranno 0 sebbene ciò dipenda dai caratteri più a sinistra della stringa. Si applicano le regole comuni della colata flottante.
Vedremo come gestirlo con più grazia più avanti nel post.
Analisi di latitudine e longitudine in entrata
Supponiamo che i valori in entrata siano nella raccolta $_REQUEST di PHP (che si riferisce alle richieste HTTP in arrivo al server) con chiavi acme-demo-latitude e acme-demo-longitude.
Possiamo recuperarli in questo modo :
<?php
$latitude = $_REQUEST['acme-demo-latitude'];
$longitude = $_REQUEST['acme-demo-longitude'];
Ma questo non basta. Innanzitutto, dobbiamo usare filter_var per assicurarci che i dati siano disinfettati e seguano lo schema a virgola mobile :
<?php
$latitude = filter_var(
$_REQUEST['acme-demo-latitude'],
FILTER_SANITIZE_NUMBER_FLOAT
);
$longitude = filter_var(
$_REQUEST['acme-demo-longitude'],
FILTER_SANITIZE_NUMBER_FLOAT
);
Successivamente, trovo utile usare floatval per analizzare il risultato come valore in virgola mobile. Questo lascia il seguente blocco di codice simile a questo :
<?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) );
Dopo di che sei libero di usarlo. Ma ricorda, dobbiamo comunque assicurarci che i valori restituiti siano valori in virgola mobile.
Convalida dei dati
Ora che abbiamo le informazioni, dobbiamo assicurarci che abbiano un bell’aspetto. E in caso contrario, dobbiamo gestirlo in modo appropriato. Se non lo è, allora possiamo semplicemente:
- restituisce false dalla funzione da cui è contenuto,
- lanciare un’eccezione e consentire al chiamante di gestirla come meglio crede.
Ognuno di questi esempi può assomigliare a questo :
<?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.');
}
In definitiva, tuttavia, la decisione è tua su come gestire i valori quando non sono nel formato corretto una volta analizzati.
Queste sono le migliori pratiche?
Ad essere sincero, ne dubito. So che queste sono le cose che ho usato e che ho trovato utili. Fornisce anche un modo difensivo e resiliente per assicurarsi che i tuoi valori siano corretti.
Ma se ci sono modi migliori per farlo, allora sono aperto a sentirli nei commenti.