{"id":228941,"date":"2022-11-06T17:06:00","date_gmt":"2022-11-06T14:06:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228941"},"modified":"2022-11-09T04:53:18","modified_gmt":"2022-11-09T01:53:18","slug":"szerokosc-i-dlugosc-geograficzna-w-php-kilka-przydatnych-praktyk","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/szerokosc-i-dlugosc-geograficzna-w-php-kilka-przydatnych-praktyk\/","title":{"rendered":"Szeroko\u015b\u0107 i d\u0142ugo\u015b\u0107 geograficzna w PHP: kilka przydatnych praktyk"},"content":{"rendered":"\n<p>W poprzednich postach sporo pisa\u0142em o pracy z <a href=\"https:\/\/tommcfarlin.com\/tag\/google-maps-api\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Google Maps API<\/a>. Prawd\u0119 m\u00f3wi\u0105c, nie pracowa\u0142em z tym od tamtego postu.<\/p>\n<p>Jednak musia\u0142em pracowa\u0107 z szeroko\u015bci\u0105 i d\u0142ugo\u015bci\u0105 geograficzn\u0105 w PHP i zacz\u0105\u0142em stosowa\u0107 pewne praktyki, kt\u00f3re moim zdaniem mog\u0105 nam dobrze s\u0142u\u017cy\u0107 podczas pracy ze wsp\u00f3\u0142rz\u0119dnymi lub og\u00f3lnie warto\u015bciami zmiennoprzecinkowymi.<\/p>\n<p>W nast\u0119pnym fragmencie kodu opisz\u0119 podej\u015bcie, kt\u00f3rego u\u017cy\u0142em i dlaczego to zrobi\u0142em. Ale chc\u0119 wyja\u015bni\u0107, \u017ce je\u015bli czytasz to w zwi\u0105zku z interfejsem API Map Google, niewiele mog\u0119 zaoferowa\u0107 w zakresie sposobu dzia\u0142ania i bie\u017c\u0105cej wersji ich interfejsu API.<\/p>\n<h2>Szeroko\u015b\u0107 i d\u0142ugo\u015b\u0107 geograficzna w PHP<\/h2>\n<p>Kiedykolwiek pracujesz z szeroko\u015bci\u0105 i d\u0142ugo\u015bci\u0105 geograficzn\u0105 w PHP, pracujesz z warto\u015bciami zmiennoprzecinkowymi, prawda? Wi\u0119c nigdy nie chcesz ich analizowa\u0107 na co\u015b mniejszego ni\u017c to; w przeciwnym razie tracisz dane i nie b\u0119dziesz w stanie zlokalizowa\u0107 tego, co pr\u00f3bujesz zlokalizowa\u0107.<\/p>\n<p>Tak wi\u0119c dla wszystkich zamierze\u0144 i cel\u00f3w za\u0142\u00f3\u017cmy, \u017ce masz informacje przychodz\u0105ce do serwera i musisz z nimi pracowa\u0107 za pomoc\u0105 PHP.<\/p>\n<p>Dwie rzeczy, o kt\u00f3rych chcesz pami\u0119ta\u0107, to:<\/p>\n<ol>\n<li>zdezynfekuj przychodz\u0105ce dane,<\/li>\n<li>upewnij si\u0119, \u017ce jest przekonwertowany na warto\u015b\u0107 zmiennoprzecinkow\u0105.<\/li>\n<\/ol>\n<p>Mo\u017cna to zrobi\u0107 za pomoc\u0105 funkcji <a href=\"https:\/\/php.net\/manual\/en\/function.filter-var.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">filter_var<\/a> i <a href=\"https:\/\/php.net\/manual\/en\/function.floatval.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">floatval<\/a> PHP, o kt\u00f3rych powiem za chwil\u0119. Zauwa\u017c jednak, \u017ce je\u015bli wynik <strong>floatval<\/strong> nie zwraca liczby zmiennoprzecinkowej, musisz mie\u0107 wdzi\u0119czny spos\u00f3b na radzenie sobie z tym.<\/p>\n<p>Zgodnie z instrukcj\u0105, <strong>floatval<\/strong> mo\u017ce zwr\u00f3ci\u0107 nast\u0119puj\u0105ce elementy:<\/p>\n<blockquote>\n<p>Warto\u015b\u0107 zmiennoprzecinkowa danej zmiennej. Puste tablice zwracaj\u0105 0, niepuste tablice zwracaj\u0105 1. Ci\u0105gi najprawdopodobniej zwr\u00f3c\u0105 0, chocia\u017c zale\u017cy to od skrajnych lewej znak\u00f3w ci\u0105gu. Obowi\u0105zuj\u0105 wsp\u00f3lne zasady rzucania na sp\u0142awik.<\/p>\n<\/blockquote>\n<p>W dalszej cz\u0119\u015bci postu przyjrzymy si\u0119, jak radzi\u0107 sobie z tym z wdzi\u0119kiem.<\/p>\n<h3>Analiza przychodz\u0105cej szeroko\u015bci i d\u0142ugo\u015bci geograficznej<\/h3>\n<p>Za\u0142\u00f3\u017cmy, \u017ce przychodz\u0105ce warto\u015bci znajduj\u0105 si\u0119 w kolekcji PHP <a href=\"https:\/\/php.net\/manual\/en\/reserved.variables.request.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">$_REQUEST<\/a> (kt\u00f3ra odnosi si\u0119 do \u017c\u0105da\u0144 HTTP przychodz\u0105cych do serwera) z kluczami <strong>acme-demo-latitude<\/strong> i <strong>acme-demo-longitude.\u00a0<\/strong><\/p>\n<p>Mo\u017cemy je pobra\u0107 w <a href=\"https:\/\/gist.github.com\/anonymous\/99e718375ec9ad9bbdd6d4c366a40752#file-00-retrieving-floating-point-values-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ten<\/a> spos\u00f3b :<\/p>\n<pre><code>&lt;?php\n\n$latitude  = $_REQUEST['acme-demo-latitude'];\n$longitude = $_REQUEST['acme-demo-longitude'];<\/code><\/pre>\n<p>Ale to nie wystarczy. Najpierw musimy u\u017cy\u0107 <strong>filter_var<\/strong>, aby upewni\u0107 si\u0119, \u017ce dane s\u0105 oczyszczone i zgodne <a href=\"https:\/\/gist.github.com\/anonymous\/99e718375ec9ad9bbdd6d4c366a40752#file-01-filtering-floating-point-values-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ze schematem zmiennoprzecinkowym<\/a> :<\/p>\n<pre><code>&lt;?php\n\n$latitude  = filter_var(\n    $_REQUEST['acme-demo-latitude'],\n    FILTER_SANITIZE_NUMBER_FLOAT\n);\n\n$longitude = filter_var(\n    $_REQUEST['acme-demo-longitude'],\n    FILTER_SANITIZE_NUMBER_FLOAT\n);<\/code><\/pre>\n<p>Nast\u0119pnie uwa\u017cam, \u017ce pomocne jest u\u017cycie <strong>floatval<\/strong> do przeanalizowania wyniku jako warto\u015bci zmiennoprzecinkowej. Pozostawia to nast\u0119puj\u0105cy blok kodu wygl\u0105daj\u0105cy <a href=\"https:\/\/gist.github.com\/anonymous\/99e718375ec9ad9bbdd6d4c366a40752#file-02-parse-the-floating-point-values-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tak<\/a> :<\/p>\n<pre><code>&lt;?php\n\n$latitude  = floatval(\n  filter_var(\n    $_REQUEST['acme-demo-latitude'],\n    FILTER_SANITIZE_NUMBER_FLOAT) );\n\n$longitude = floatval(\n  filter_var(\n    $_REQUEST['acme-demo-latitude'],\n    FILTER_SANITIZE_NUMBER_FLOAT) );<\/code><\/pre>\n<p>Po czym mo\u017cesz z niego korzysta\u0107. Pami\u0119taj jednak, \u017ce nadal musimy upewni\u0107 si\u0119, \u017ce zwracane warto\u015bci s\u0105 warto\u015bciami zmiennoprzecinkowymi.<\/p>\n<h3>Walidacja danych<\/h3>\n<p>Teraz, gdy mamy informacje, musimy upewni\u0107 si\u0119, \u017ce wygl\u0105da dobrze. A je\u015bli nie, musimy odpowiednio si\u0119 tym zaj\u0105\u0107. Je\u015bli tak nie jest, mo\u017cemy po prostu:<\/p>\n<ol>\n<li>zwraca false z funkcji, z kt\u00f3rej jest zawarty,<\/li>\n<li>wyrzu\u0107 wyj\u0105tek i pozw\u00f3l wywo\u0142uj\u0105cemu obs\u0142u\u017cy\u0107 go tak, jak uzna za stosowne.<\/li>\n<\/ol>\n<p>Ka\u017cdy z tych przyk\u0142ad\u00f3w mo\u017ce wygl\u0105da\u0107 <a href=\"https:\/\/gist.github.com\/anonymous\/99e718375ec9ad9bbdd6d4c366a40752#file-03-validating-values-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tak<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/\/ Return false...\nif (! (is_float( $latitude) &amp;&amp; is_float( $longitude) )) {\n  return false;\n}\n\n\/\/ Or throw an exception...\nif (! (is_float( $latitude) &amp;&amp; is_float( $longitude) )) {\n  throw new Exception('Latitude and longitude are not valid floating point values.');\n}\n<\/code><\/pre>\n<p>Ostatecznie jednak decyzja, jak obs\u0142u\u017cy\u0107 warto\u015bci, gdy nie s\u0105 one w odpowiednim formacie po ich przeanalizowaniu, nale\u017cy do Ciebie.<\/p>\n<h2>Czy to s\u0105 najlepsze praktyki?<\/h2>\n<p>Szczerze m\u00f3wi\u0105c, w\u0105tpi\u0119 w to. Wiem, \u017ce s\u0105 to rzeczy, kt\u00f3rych u\u017cywam i kt\u00f3re okaza\u0142y si\u0119 przydatne. Zapewnia r\u00f3wnie\u017c defensywny, odporny spos\u00f3b na upewnienie si\u0119, \u017ce twoje warto\u015bci s\u0105 prawid\u0142owe.<\/p>\n<p>Ale je\u015bli istniej\u0105 lepsze sposoby na zrobienie tego, to jestem otwarty na ich wys\u0142uchanie w komentarzach.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pracowa\u0142em z szeroko\u015bci\u0105 i d\u0142ugo\u015bci\u0105 geograficzn\u0105 w PHP. S\u0105dz\u0119, \u017ce istniej\u0105 praktyki, kt\u00f3re dobrze nam s\u0142u\u017c\u0105 podczas pracy z warto\u015bciami zmiennoprzecinkowymi.<\/p>\n","protected":false},"author":1,"featured_media":166466,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[919,845,866],"tags":[1169],"class_list":["post-228941","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-inny","category-samouczki","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/228941","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/comments?post=228941"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/228941\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/166466"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=228941"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=228941"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=228941"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}