{"id":217,"date":"2011-11-11T19:29:04","date_gmt":"2011-11-11T18:29:04","guid":{"rendered":"http:\/\/localhost\/blog\/?p=217"},"modified":"2013-03-07T11:58:24","modified_gmt":"2013-03-07T10:58:24","slug":"217","status":"publish","type":"post","link":"https:\/\/www.ilbytecidio.it\/?p=217","title":{"rendered":"Trasferimento di dati con JQuery e JSON"},"content":{"rendered":"<p>Questo piccolo esempio si riferisce ovviamente ad AJAX, la tecnologia che consente di aggiornare il contenuto delle pagine Web senza doverle ricaricare, che ha preso piede tanto da essere la tecnologia base dei social network!<!--more--><br \/>\nNello scrivere partir\u00f2 dal presupposto che chi legge abbia gi\u00e0 un&#8217;idea di come funzioni AJAX e di cosa sia JQuery.<br \/>\nSe cos\u00ec non \u00e8, probabilmente l&#8217;argomento risulter\u00e0 un po&#8217; difficile da comprendere, ma anche il principiante si render\u00e0 conto dei vantaggi. In ogni caso, anch&#8217;io uso JQuery da poco, quindi questo articolo \u00e8 frutto del mio percorso di apprendimento \ud83d\ude42<\/p>\n<p>Ecco qualche guida per iniziare:<br \/>\n<a href=\"http:\/\/javascript.html.it\/guide\/leggi\/95\/guida-ajax\/\">http:\/\/javascript.html.it\/guide\/leggi\/95\/guida-ajax\/<\/a><br \/>\n<a href=\"http:\/\/javascript.html.it\/guide\/leggi\/168\/guida-jquery\/\">http:\/\/javascript.html.it\/guide\/leggi\/168\/guida-jquery\/<\/a><\/p>\n<p>Per introdurre il problema, pensiamo al normale uso di AJAX. Quando vogliamo aggiornare una pagina dobbiamo obbligatoriamente chiedere dei dati al server e possiamo farlo normalmente in due modi: <strong>testo<\/strong> puro o <strong>XML<\/strong>. Nel primo caso potremmo pensare anche di trasferire uno spezzone di pagina HTML che ci serve e &#8220;incollarlo&#8221; dove ci serve, come suggerisce anche <a href=\"http:\/\/www.w3schools.com\/ajax\/ajax_database.asp\">questa pagina del w3c<\/a>. Si pu\u00f2 discutere per ore su quanto &#8220;pulito&#8221; sia questo metodo, in relazione alla separazione fra veste grafica e dati, ma il metodo in effetti si usa. Per quanto riguarda l&#8217;XML, la sua utilit\u00e0 e versatilit\u00e0 non si discutono nemmeno. Potremmo vedere <a href=\"http:\/\/www.w3schools.com\/ajax\/ajax_xmlfile.asp\">questo esempio<\/a>, ma \u00e8 bene sapere che non \u00e8 il solo caso d&#8217;uso. Moltissimi Web Service, per esempio, trasferiscono i dati in XML e con AJAX potremmo leggere i dati provenienti da uno di essi. Naturalmente, se abbiamo un classico database, prima di inviare i dati alla pagina dovremmo convertirli in XML.<\/p>\n<p>Questi metodi, usati per grandi quantit\u00e0 di dati, hanno i loro vantaggi, ma anche degli inconvenienti: per entrambi lo spreco di banda e per il testo puro, quasi tutto il carico del lavoro sul server.<br \/>\nIl primo \u00e8 dovuto al fatto che utilizziamo linguaggi di markup, quindi fra client e server dovr\u00e0 per forza esserci il trasferimento di tutti i tag XML o HTML che alla lunga appesantiscono. Il secondo \u00e8 dovuto al fatto che il server prepara gi\u00e0 l&#8217;HTML e lo spedisce al client che si occupa solo di incollarlo al posto giusto, mentre potrebbe ricevere i dati e occuparsi di impostarli come serve.<\/p>\n<p>Un ottimo compromesso \u00e8 quello dell&#8217;utilizzo di <strong>JSON<\/strong>.<br \/>\nJSON \u00e8 un formato alternativo a XML, basato su JavaScript. Guardate <a href=\"http:\/\/json.org\/example.html\">questo esempio<\/a> per avere un assaggio della sua sintassi.<br \/>\nIl suo vantaggio principale \u00e8 la sua leggerezza: al posto dei tag si devono trasferire solo alcuni simboli, il che \u00e8 un vantaggio sull&#8217;XML e i dati ricevuti, che si prestano meglio anche a essere contenuti in cache, si possono inserire nella pagina attraverso JavaScript, alleggerendo il carico sul server.<br \/>\nGrazie alla funzione <a href=\"http:\/\/it.php.net\/manual\/en\/function.json-encode.php\">json_encode<\/a> di PHP e a JQuery, possiamo usare JSON senza alcuna fatica per il trasferimento dei dati.<\/p>\n<p>Ed ecco finalmente l&#8217;esempio vero e proprio.<br \/>\nHo innanzitutto creato un piccolo database con alcuni dati fittizi:<\/p>\n<pre lang=\"SQL\" line=\"1\">\r\n-- Database: `test_json`\r\n\r\nCREATE TABLE IF NOT EXISTS `tab` (\r\n  `ID` int(11) NOT NULL,\r\n  `field` varchar(255) NOT NULL,\r\n  `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\r\n  PRIMARY KEY (`ID`)\r\n);\r\n\r\nINSERT INTO `tab` (`ID`, `field`, `date`) VALUES\r\n(1, 'Una frase a caso', '2011-11-18 17:50:00'),\r\n(2, 'Un''altra frase a caso', '2011-11-19 15:28:03');\r\n<\/pre>\n<p>Poi ho creato la pagina php che avr\u00e0 il compito di leggere il database e codificare i dati in JSON:<\/p>\n<pre lang=\"PHP\" line=\"1\">\r\n<?php\r\n  \/*****************  json_data.php *******************************\/\r\n\r\n  \/* Connessione al database. Sostituisci a HOST, UTENTE e PASSWORD i tuoi dati di accesso a MySQL *\/\r\n  mysql_connect('HOST', 'UTENTE', 'PASSWORD');\r\n  mysql_select_db('test_json');\r\n \r\n  $query = 'SELECT ID, field, date FROM tab';\r\n  $res = mysql_query($query);\r\n\r\n  \/\/Array che conterr\u00e0 i dati letti dal DB\r\n  $data = array();\r\n  \/\/Riempimento dell'array data\r\n  while($record = mysql_fetch_assoc($res)){\r\n    array_push($data, $record);\r\n  }\r\n\r\n  \/\/Restituisce i dati in formato JSON\r\n  echo json_encode($data);\r\n?>\r\n<\/pre>\n<p>Ed infine la pagina che visualizzer\u00e0 i dati:<\/p>\n<pre lang=\"HTML\" line=\"1\">\r\n<!-- index.html -->\r\n<html>\r\n  <head>\r\n    <title>La frase del giorno<\/title>\r\n    <script type=\"text\/javascript\" src=\"http:\/\/ajax.googleapis.com\/ajax\/libs\/jquery\/1.3.2\/jquery.min.js\"><\/script>\r\n  <\/head>\r\n  <body>\r\n    <p>\r\n       <b>La frase del giorno <span id=\"data\"><\/span> &egrave;<\/b>\r\n       <span id=\"frase\" style=\"font-style: italic\"><\/span>.\r\n    <\/p>\r\n    <p>\r\n      <a href=\"#\" onclick=\"cambia_frase()\">Cambia Frase<\/a>\r\n    <\/p>\r\n    <script type=\"text\/javascript\">\r\n      var n = 0;\r\n      function cambia_frase(){\r\n        $.ajax({\r\n          url : \"json_data.php\",\r\n          dataType : \"json\",\r\n          success : function (data, stat) {\r\n            $(\"#data\").html(data[n].date);\r\n            $(\"#frase\").html(data[n].field);\r\n            n = (n + 1) % data.length;\r\n          },\r\n          error : function (richiesta,stato,errori) {\r\n            alert(\"Si \u00e8 verificato un errore. Riprova pi\u00f9 tardi\");\r\n          }\r\n        });\r\n      }\r\n      cambia_frase();\r\n    <\/script>\r\n  <\/body>\r\n<\/html>\r\n<\/pre>\n<p>L&#8217;esempio \u00e8 volutamente stupido per mantenere la semplicit\u00e0: la pagina index.html chiede dei dati a json_data.php che li legge dal database e glieli retituisce codificati in JSON. A questo punto, grazie a JQuery che mette a disposizione un set molto comodo di funzioni, i dati inviati dal server vengono letti attraverso la variabile data e scritti sulla pagina! Semplice, no?<br \/>\nOvviamente in una pagina seria i dati non verranno letti in blocco come ho fatto io, ma anzich\u00e9 ricevere tutto il contenuto della tabella e scegliere lato-client la riga da mostrare, verranno passati dei parametri a json_data.php in modo che filtri e limiti il risultato alle righe che ci servono. Ho preferito per\u00f2 non aggiungere troppa carne al fuoco, perch\u00e9 ci siano poche righe ma comprensibili. Ovviamente se qualcuno ha dei dubbi o delle curiosit\u00e0 pu\u00f2 sempre chiedere.<\/p>\n<p>Buon divertimento!<\/p>\n<p>P.S. Una nota interessante: la richiesta di dati JSON pu\u00f2 essere fatta anche pi\u00f9 velocemente grazie alla funzione getJSON <a href=\"http:\/\/api.jquery.com\/jQuery.getJSON\/\">http:\/\/api.jquery.com\/jQuery.getJSON\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Questo piccolo esempio si riferisce ovviamente ad AJAX, la tecnologia che consente di aggiornare il contenuto delle pagine Web senza doverle ricaricare, che ha preso piede tanto da essere la tecnologia base dei social network!<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[20],"tags":[],"class_list":["post-217","post","type-post","status-publish","format-standard","hentry","category-programmazione-javascript"],"views":228,"_links":{"self":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts\/217","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=217"}],"version-history":[{"count":6,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts\/217\/revisions"}],"predecessor-version":[{"id":461,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts\/217\/revisions\/461"}],"wp:attachment":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=217"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=217"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=217"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}