
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>informatica&#38;tlc.it - Blog &#187; Programmazione</title>
	<atom:link href="http://www.informaticaetlc.it/blog/category/programmazione/feed" rel="self" type="application/rss+xml" />
	<link>http://www.informaticaetlc.it/blog</link>
	<description>Portale dedicato all&#039;informatica e alle telecomunicazioni</description>
	<lastBuildDate>Fri, 12 Aug 2011 20:49:11 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Utilizzare lightbox su immagini caricate con innerHTML</title>
		<link>http://www.informaticaetlc.it/blog/utilizzare-lightbox-da-immagini-caricate-con-innerhtml.html</link>
		<comments>http://www.informaticaetlc.it/blog/utilizzare-lightbox-da-immagini-caricate-con-innerhtml.html#comments</comments>
		<pubDate>Sun, 24 Jul 2011 12:50:56 +0000</pubDate>
		<dc:creator>ilos37</dc:creator>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[funzione]]></category>
		<category><![CDATA[initLightbox]]></category>
		<category><![CDATA[innerHTML]]></category>
		<category><![CDATA[lightbox]]></category>
		<category><![CDATA[onclick]]></category>
		<category><![CDATA[tag]]></category>

		<guid isPermaLink="false">http://www.informaticaetlc.it/blog/?p=277</guid>
		<description><![CDATA[Il lightbox è un&#8217;applicazione javascript per la visualizzazione delle immagini in maniera elegante. Per maggiori informazioni sull&#8217;utilizzo e per il download dei files andate qui.
Il lightbox è uno strumento molto utilizzato. Di recente mi è capitato di dover utilizzare il lightbox su immagini caricate dinamicamente all&#8217;interno di un div; dopo svariate prove sono giunto a [...]]]></description>
			<content:encoded><![CDATA[<p>Il <strong>lightbox </strong>è un&#8217;applicazione <em>javascript </em>per la visualizzazione delle immagini in maniera elegante. Per maggiori informazioni sull&#8217;utilizzo e per il download dei files andate <a rel="nofollow" href="http://www.lokeshdhakar.com/projects/lightbox2/" target="_blank">qui</a>.</p>
<p>Il lightbox è uno strumento molto utilizzato. Di recente mi è capitato di dover utilizzare il lightbox su immagini caricate <em>dinamicamente </em>all&#8217;interno di un div; dopo svariate prove sono giunto a utilizzare la seguente funzione javascript:</p>
<pre class="brush:javascript;">&lt;script type="text/javascript" language="javascript"&gt;
function showImage(w,h,image) {
 var obj=document.getElementById("id_div");
 obj.innerHTML="";
 obj.innerHTML+="&lt;a href='"+image+"' rel='lightbox'&gt;&lt;img src='"+image+"' width='"+w+"' height='"+h+"'&gt;&lt;/a&gt;";
 initLightbox();
 }
&lt;/script&gt;

&lt;div id="id_div"&gt;
&lt;/div&gt;</pre>
<p>La funzione<strong> showImage()</strong> va a scrivere all&#8217;interno del div con id uguale a &#8220;<strong>id_div</strong>&#8221; inserendo sia il tag <em>&lt;a&gt;</em> che il tag <em>&lt;img&gt;</em> con il metodo <strong>innerHTML</strong>, passando anche l&#8217;altezza e la larghezza che dovrà avere l&#8217;immagine. Ovviamente per poter far funzionare il lightbox bisogna inserire all&#8217;interno del tag <em>&lt;a&gt;</em> l&#8217;attributo <strong>rel=&#8221;lightbox&#8221;</strong>.<br />
Dopodiché bisogna reinizializzare il lightbox tramite la funzione<strong> initLightbox()</strong>, questo accade perché ogni variazione dinamica dell&#8217;HTML sul codice delle immagini richiede la reinizializzazione del lightbox.<br />
Nota: il primo innerHTML con argomento vuoto serve a evitare che le chiamate della funzione successive alla prima abbiano come effetto la sovrapposizione delle immagini precedentemente caricate.</p>
<p>Un&#8217;altra soluzione molto simile alla prima è la seguente:</p>
<pre class="brush:js;">&lt;script type="text/javascript" language="javascript"&gt;
function showImage(w,h,image) {
 var obj=document.getElementById("linkID");
 var objIMG=document.getElementById("imgID");
 obj.href=image;
 objIMG.src=image;
 objIMG.width=w;
 objIMG.height=h;
 initLightbox();
 }
&lt;/script&gt;

&lt;div id="id_div"&gt;
&lt;a id="linkID" rel="lightbox"&gt;&lt;img id="imgID"  /&gt;&lt;/a&gt;
&lt;/div&gt;</pre>
<p>La differenza rispetto al caso precedente sta nell&#8217;inserire a priori all&#8217;interno del div i tag <em>&lt;a&gt;</em> e <em>&lt;img&gt;</em> e nell&#8217;inserire dinamicamente i contenuti degli attributi.<br />
L&#8217;utilizzo della funzione è molto semplice, basta richiamarla in un qualsiasi punto della pagina web, ad esempio tramite <em>onclick </em>dentro un tag.</p>
<p>Entrambe le soluzioni proposte sono state testate su firefox 4/5 e su IE9.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.informaticaetlc.it/blog/utilizzare-lightbox-da-immagini-caricate-con-innerhtml.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Inserire codice youtube in sito web senza errori di validazione W3C</title>
		<link>http://www.informaticaetlc.it/blog/inserire-codice-youtube-in-sito-web-senza-errori-di-validazione-w3c.html</link>
		<comments>http://www.informaticaetlc.it/blog/inserire-codice-youtube-in-sito-web-senza-errori-di-validazione-w3c.html#comments</comments>
		<pubDate>Wed, 08 Jun 2011 18:07:01 +0000</pubDate>
		<dc:creator>ilos37</dc:creator>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[embed]]></category>
		<category><![CDATA[iframe]]></category>
		<category><![CDATA[object]]></category>
		<category><![CDATA[validator]]></category>
		<category><![CDATA[W3C]]></category>
		<category><![CDATA[youtube]]></category>

		<guid isPermaLink="false">http://www.informaticaetlc.it/blog/?p=270</guid>
		<description><![CDATA[L&#8217;inserimento dei video youtube all&#8217;interno di un sito web è un&#8217;operazione molto semplice: youtube stesso, infatti, definisce il codice da incorporare all&#8217;interno della pagina web. Il codice può essere del tipo:
&#60;iframe width="560" height="349" src="http://www.youtube.com/embed/xxxxxxxxxxx" frameborder="0" allowfullscreen&#62;&#60;/iframe&#62;
oppure
&#60;object width="560" height="349"&#62;&#60;param name="movie" value="http://www.youtube.com/v/xxxxxxxxxx?version=3&#38;amp;hl=it_IT"&#62;&#60;/param&#62;&#60;param name="allowFullScreen" value="true"&#62;&#60;/param&#62;&#60;param name="allowscriptaccess" value="always"&#62;&#60;/param&#62;&#60;embed src="http://www.youtube.com/v/xxxxxxxxxxx?version=3&#38;amp;hl=it_IT" type="application/x-shockwave-flash" width="560" height="349" allowscriptaccess="always" allowfullscreen="true"&#62;&#60;/embed&#62;&#60;/object&#62;
Cosa accade però se il sito [...]]]></description>
			<content:encoded><![CDATA[<p>L&#8217;inserimento dei video <em>youtube </em>all&#8217;interno di un sito web è un&#8217;operazione molto semplice: youtube stesso, infatti, definisce il codice da incorporare all&#8217;interno della pagina web. Il codice può essere del tipo:</p>
<pre class="brush:html;">&lt;iframe width="560" height="349" src="http://www.youtube.com/embed/xxxxxxxxxxx" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;</pre>
<p>oppure</p>
<pre class="brush:html;">&lt;object width="560" height="349"&gt;&lt;param name="movie" value="http://www.youtube.com/v/xxxxxxxxxx?version=3&amp;amp;hl=it_IT"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/xxxxxxxxxxx?version=3&amp;amp;hl=it_IT" type="application/x-shockwave-flash" width="560" height="349" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;/object&gt;</pre>
<p><span style="text-decoration: underline;">Cosa accade però se il sito deve essere accessibile?</span><br />
In questo caso la situazione si complica.</p>
<p>Purtroppo, così come sono i due codici daranno errore sul <strong>W3C Validator</strong>, il primo per l&#8217;utilizzo del tag <em>&lt;iframe&gt;</em> e del tag <em>&lt;embed&gt;</em>, il secondo solo per l&#8217;utilizzo del tag <em>&lt;embed&gt;</em>. Non essendo possibile modificare il primo bisogna cercare di modificare il secondo codice togliendo il tag <em>&lt;embed</em>&gt;.<br />
La soluzione è quella di usare il seguente codice:</p>
<pre class="brush:html;">&lt;object width="560" height="349" type="application/x-shockwave-flash" data="http://www.youtube.com/v/xxxxxxxxxx"&gt;&lt;p&gt;Descrizione&lt;/p&gt;&lt;param name="movie" value="http://www.youtube.com/v/xxxxxxxxxxx"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;/object&gt;</pre>
<p>Ovviamente al posto delle xxxxxxxxxxx va inserito il codice del video. In questo modo potrete inserire i video di youtube anche in siti accessibili.<br />
<strong>NB</strong>: ricordatevi di inserire la descrizione del video all&#8217;interno del tag <em>&lt;object&gt;</em> e prima del tag <em>&lt;param&gt;</em>; essa serve nei casi in cui il video non può essere caricato.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.informaticaetlc.it/blog/inserire-codice-youtube-in-sito-web-senza-errori-di-validazione-w3c.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Classe per l&#8217;invio di file tramite il protocollo FTP in PHP</title>
		<link>http://www.informaticaetlc.it/blog/classe-per-linvio-di-file-tramite-il-protocollo-ftp-in-php.html</link>
		<comments>http://www.informaticaetlc.it/blog/classe-per-linvio-di-file-tramite-il-protocollo-ftp-in-php.html#comments</comments>
		<pubDate>Sun, 22 May 2011 17:12:59 +0000</pubDate>
		<dc:creator>ilos37</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[class]]></category>
		<category><![CDATA[classe]]></category>
		<category><![CDATA[file transfer protocol]]></category>
		<category><![CDATA[ftp]]></category>
		<category><![CDATA[remoto]]></category>
		<category><![CDATA[server]]></category>

		<guid isPermaLink="false">http://www.informaticaetlc.it/blog/?p=256</guid>
		<description><![CDATA[In questo articolo vedremo una classe creata per l&#8217;utilizzo delle funzioni php per il trasferimento di file attraverso il protocollo FTP (File Transfer Protocol). Ho cercato di semplificare la classe per far eseguire le funzioni elementari utili per lo scambio di file con un server FTP remoto, utilizzando anche meccanismi per la verifica dei file [...]]]></description>
			<content:encoded><![CDATA[<p>In questo articolo vedremo una classe creata per l&#8217;utilizzo delle funzioni php per il trasferimento di file attraverso il protocollo <strong>FTP</strong> (<strong>File Transfer Protocol</strong>). Ho cercato di semplificare la classe per far eseguire le funzioni elementari utili per lo scambio di file con un server FTP remoto, utilizzando anche meccanismi per la verifica dei file che controllino che il file sia già presente sul server o meno.</p>
<p>Come al solito posto tutto il codice e, successivamente, verrà commentato. Ho chiamato la classe simpleFtp.</p>
<pre class="brush:php;">&lt;?php

class simpleFtp {

 //dati per l'accesso
 var $ftp_host = ''; //indirizzo server ftp
 var $username = ''; //nome utente per l'accesso ftp
 var $pwd = '';      //password per l'accesso ftp
 var $connect;
 var $login;
 var $source_file;
 var $destination_file;

 //nel costruttore effettuo connessione e login
 function simpleFtp(){
 //effettuo la connessione
 $this-&gt;connect = ftp_connect($this-&gt;ftp_host) or die("Si è verificato un errore durante la connessione al server ftp");

 //effettuo il login
 $this-&gt;login = ftp_login($this-&gt;connect, $this-&gt;username, $this-&gt;pwd) or die("Si è verificao un errore durante l'accesso al server ftp");

 }

 //funzione per il trasferimento dei file
 function trasferisci($sorgente, $destinazione){
 //file da trasferire
 $this-&gt;source_file = $sorgente;
 //va indicato il percorso e il nome del file
 $this-&gt;destination_file = $destinazione;
 //verifico che il file non esista già altrimenti modifico il nome
 $this-&gt;destination_file = $this-&gt;verificaFile($this-&gt;destination_file, 'put'); 

 ftp_put($this-&gt;connect, $this-&gt;destination_file, $this-&gt;source_file, FTP_BINARY) or die("Errore durante l'upload del file $source_file nel server ftp");

 }

 function preleva($destinazione, $sorgente){
 if($this-&gt;verificaEsistenza($sorgente)){
 //file da trasferire dal server remoto
 $this-&gt;source_file = $sorgente;
 //percorso e nome locale da dare al file
 $this-&gt;destination_file = $destinazione;
 //verifico che il file non esista già altrimenti modifico il nome
 $this-&gt;destination_file = $this-&gt;verificaFile($this-&gt;destination_file, 'get');        

 ftp_get($this-&gt;connect, $this-&gt;destination_file, $this-&gt;source_file, FTP_BINARY) or die("Errore durante il download del file $source_file nel server ftp");

 }else
 echo "File non trovato.";
 }

 //cancella un file sul server remoto
 function cancella($file){
 if($this-&gt;verificaEsistenza($file))
 ftp_delete($this-&gt;connect, $file) or die("Errore durante la cancellazione del file dal server ftp");
 else
 echo "File non trovato";
 }

 //cambia la directory sul server remoto
 function cambiaDirectory($dir){
 ftp_chdir($this-&gt;connect,$dir) or die('Errore durante il cambio di directory');
 }

 //restituisce la directory corrente
 function directoryCorrente(){
 return ftp_pwd($this-&gt;connect);
 }

 //cambia i permessi su un file, i permessi devono essere a 4 cifre. Es.: 0755
 function cambiaPermessiFile($permessi, $file){
 if($this-&gt;verificaEsistenza($file) &amp;&amp; is_numeric($permessi))
 ftp_chmod($this-&gt;connect, $permessi, $file);
 else
 echo "File non trovato";
 }

 //rinomina un file sul server remoto
 function rinomina($old, $new){
 if($this-&gt;verificaEsistenza($old)){
 $new = $this-&gt;verificaFile($new, 'put');
 ftp_rename($this-&gt;connect, $old, $new);
 }
 else
 echo "File non trovato";
 }

 //restituisce un array con i nomi dei file nella directory passata
 function visualizzaFile($dir){
 $result = ftp_nlist($this-&gt;connect, $dir);
 return $result;
 }

 //crea una directory sul server remoto a partire dalla directory corrente
 function creaDirectory($dir){
 @ftp_mkdir($this-&gt;connect, $dir) or die('La directory esiste già o non hai i permessi per crearne una.');

 }

 //elimina una directory dal server remoto a partire dalla directory corrente
 function eliminaDirectory($dir){
 @ftp_rmdir($this-&gt;connect, $dir) or die('La directory non esiste o non hai i permessi per eliminarla.');

 }

 //chiudo la connessione
 function close(){
 ftp_quit($this-&gt;connect) or die("Si è verificato un errore durante la chiusura della connessione al server ftp");
 }

 //Verifico il tipo di file in base all'estensione
 function verificaFile($nomeFile, $tipo){
 $ext = explode('.', trim($nomeFile));
 $num = count($ext);
 if($ext[$num-1]=='jpg' || $ext[$num-1]=='pdf')
 if($tipo=='put')
 return $this-&gt;verifica($nomeFile, $ext[$num-1]);
 elseif($tipo=='get')
 return $this-&gt;verificaLocale($nomeFile, $ext[$num-1]);
 }

 //funzione che modifica i caratteri speciali e cambia il nome del file se dovesse già esistere sul server
 function verifica($nomeFile, $ext){
 $nomeFile=stripcslashes($nomeFile);
 $nomeFile=str_replace("'"," ",$nomeFile);
 $nomeFile=str_replace("`"," ",$nomeFile);
 $nomeFile=str_replace("\\"," ",$nomeFile);
 $nomeFile=str_replace("&amp;"," ",$nomeFile);
 $nomeFile=str_replace("%"," ",$nomeFile);
 $nomeFile=str_replace("\""," ",$nomeFile);
 $nomeFile=str_replace("à","a",$nomeFile);
 $nomeFile=str_replace("è","e",$nomeFile);
 $nomeFile=str_replace("é","e",$nomeFile);
 $nomeFile=str_replace("ì","i",$nomeFile);
 $nomeFile=str_replace("ò","o",$nomeFile);
 $nomeFile=str_replace("ù","u",$nomeFile);

 if($this-&gt;verificaEsistenza($nomeFile)){
 $temp=substr($nomeFile, 0, -4);
 if($ext=='jpg'){
 $nomeFile=$temp.'_.jpg';
 }
 elseif($ext=='pdf'){
 $nomeFile=$temp.'_.pdf';
 }
 $nomeFile=$this-&gt;verifica($nomeFile, $ext);
 }
 return $nomeFile;

 }

 /*
 Verifico che un file esista già sul server a cui mi collego, la funzione ftp_size restituisce la dimensione del file se trova un file con quel nome nella directory indicata, altrimenti restituisce -1
 */
 function verificaEsistenza($file){
 $verifica = ftp_size($this-&gt;connect, $file);
 if($verifica==-1)
 return false;
 else
 return true;
 }

 //funzione che modifica i caratteri speciali e cambia il nome del file se dovesse già esistere in locale
 function verificaLocale($nomeFile, $ext){

 if(file_exists($nomeFile)){
 $temp=substr($nomeFile, 0, -4);
 if($ext=='jpg'){
 $nomeFile=$temp.'_.jpg';
 }
 elseif($ext=='pdf'){
 $nomeFile=$temp.'_.pdf';
 }
 $nomeFile=$this-&gt;verificaLocale($nomeFile, $ext);
 }
 return $nomeFile;

 }

}
?&gt;</pre>
<p>La classe utilizza le funzioni messe a disposizione da PHP per il trasferimento file utilizzando il protocollo FTP; in aggiunta, ho inserito delle funzioni per la verifica che un file si trovi già sul server (<em>verificaEsistenza()</em>) o, se stiamo prelevando dal server, se il file esiste in locale (<em>verificaLocale()</em>). Non utilizzando tali funzioni i file, se già esistenti, vengono sovrascritti senza alcun output per l&#8217;utente.<br />
Inoltre, sono state implementate le funzioni <em>verifica()</em> e <em>verificaFile()</em> che hanno il compito di modificare il nome del file evitando i caratteri speciali e le lettere accentate e, se il file si trova già sul server, modificandone il nome inserendo degli underscore dopo il nome e prima dell&#8217;estensione. Naturalmente il bisogna conoscere il tipo di file, infatti la classe è impostata per il trasferimento di file immagini (<em>jpg</em>) e <em>pdf</em>. La classe gestisce questi 2 tipi di file ma è possibile adattarla facilmente per tipi di file qualsiasi in base alle necessità.</p>
<p>Gli unici parametri che vanno inseriti all&#8217;interno della classe sono i dati per l&#8217;accesso FTP al server remoto, tutto il resto verrà effettuato tramite funzioni d&#8217;accesso. Il costruttore <em>simpleFtp()</em> ha il compito di effettuare la connessione al server FTP e la relativa login. Seguono le funzioni principali per l&#8217;utilizzo della classe, ovvero <em>trasferisci()</em>, <em>preleva()</em> e <em>cancella()</em>. Tutte queste funzioni leggono il percorso del file sul server FTP a partire dalla root, quindi è necessario inserire il percorso completo al file oppure spostarsi, prima di tali operazioni, sulla directory di lavoro con la funzione <em>cambiaDirectory()</em>.</p>
<p>Successivamente sono state implementate altre funzioni molto utili in alcuni ambiti, e sono la funzione <em>cambiaPermessiFile()</em> e <em>rinomina()</em>. La prima serve per modificare i permessi d&#8217;accesso al file, ad esempio si può impostare un file con i permessi 0777; la seconda serve per rinominare un fle remoto. Ovviamente, per entrambe le funzioni, si verifica prima se il file sul server esista.</p>
<p>La funzione <em>directoryCorrente()</em> restituisce il percorso della cartella del server su cui si sta lavorando mentre le funzioni <em>creaDirectory()</em> ed <em>eliminaDirectory()</em> sono utilizzate, rispettivamente, per creare ed eliminare cartelle sul server FTP; <em>visualizzaFile()</em>, invece, restituisce un array con la lista dei file presenti nella direcotory passata.<br />
Infine, la funzione <em>close()</em> termina la connessione con il server FTP.</p>
<p>Per rendere maggiormente utilizzabile la classe è possibile modificarne il costruttore in modo da prendere dall&#8217;esterno i parametri per la connessione. In altri articoli, se ce ne sarà bisogno, integrerò la classe per l&#8217;utilizzo di connessioni cifrate per lo scambio di dati in FTP.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.informaticaetlc.it/blog/classe-per-linvio-di-file-tramite-il-protocollo-ftp-in-php.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Script Php per ricerche fulltext con MySQL</title>
		<link>http://www.informaticaetlc.it/blog/script-php-per-ricerche-fulltext-con-mysql.html</link>
		<comments>http://www.informaticaetlc.it/blog/script-php-per-ricerche-fulltext-con-mysql.html#comments</comments>
		<pubDate>Sat, 23 Apr 2011 12:35:22 +0000</pubDate>
		<dc:creator>ilos37</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[classe]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[fulltext]]></category>
		<category><![CDATA[ricerche]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://www.informaticaetlc.it/blog/?p=232</guid>
		<description><![CDATA[Nel precedente articolo abbiamo visto la sintassi SQL per l&#8217;utilizzo degli indici fulltext nelle ricerche sul database. In questo articolo vedremo un semplice script per l&#8217;utilizzo pratico di tale ricerca utilizzando una classe appositamente scritta.
Supponiamo di avere un form con un campo di ricerca del tipo:
&#60;form name="cerca" method="post" id="cerca" action="esito_ricerca.php"&#62;
&#60;input type="text" name="campo" /&#62;
&#60;input type="submit" name="invia" [...]]]></description>
			<content:encoded><![CDATA[<p>Nel precedente <a href="http://www.informaticaetlc.it/blog/motore-di-ricerca-per-mysql-con-indici-fulltext.html">articolo</a> abbiamo visto la sintassi SQL per l&#8217;utilizzo degli indici fulltext nelle ricerche sul database. In questo articolo vedremo un semplice script per l&#8217;utilizzo pratico di tale ricerca utilizzando una classe appositamente scritta.</p>
<p>Supponiamo di avere un form con un campo di ricerca del tipo:</p>
<pre class="brush:html;">&lt;form name="cerca" method="post" id="cerca" action="esito_ricerca.php"&gt;
&lt;input type="text" name="campo" /&gt;
&lt;input type="submit" name="invia" /&gt;&lt;/form&gt;</pre>
<p>Al submit si aprirà una nuova pagina php nella quale riprenderemo i valori passati ed eseguiremo le operazioni necessarie per la ricerca e la visualizzazione dei risultati. Per semplificare le cose utilizzeremo la seguente classe:</p>
<pre class="brush:php;">&lt; ?php

class Ricerca
{
var $campi;
var $tabella;
var $key;
var $tuple;

function Ricerca($key, $tabella, $campi)
{
$this-&gt;key = $key;
if($tabella!=&quot;&quot;)
$this-&gt;tabella = $tabella;
if($campi!=&quot;&quot;)
$this-&gt;campi = $campi;
$this-&gt;pulisciStringa();
}

function Query()
{

$query = &quot;SELECT *, MATCH($this-&gt;campi) AGAINST(&#039;$this-&gt;key&#039; IN BOOLEAN MODE) AS attinenza FROM $this-&gt;tabella WHERE MATCH($this-&gt;campi) AGAINST(&#039;$this-&gt;key&#039; IN BOOLEAN MODE) ORDER BY attinenza DESC&quot;;

$this-&gt;tuple = mysql_query($query);

}

function pulisciStringa()
{
$keyMod = strip_tags($this-&gt;key);
$keyMod = mysql_real_escape_string($keyMod);
$this-&gt;key = trim($keyMod);
}

function ricercaParole()
{
$word = explode(&#039; &#039;, trim($this-&gt;key));
$num = count($word);

$i=0;
while($i&lt; $num){
$word[$i] = &#039;+&#039;.$word[$i];
$i++;
}
$this-&gt;key = implode(&#039; &#039;,$word);
}

function ricercaFrase()
{
$word = $this-&gt;key;
$word = &#039;&quot;&#039;.$word.&#039;&quot;&#039;;
$this-&gt;key = $word;
}

}

?&gt;
</pre>
<p>La classe è abbastanza semplice, la funzione <em>Ricerca()</em> ha il compito di inizializzare alcuni parametri necessari per l&#8217;esecuzione della ricerca, in particolare riceve in ingresso le chiavi di ricerca, la tabella su cui effettuare la query e i campi fulltext da analizzare.<br />
La funzione <em>Query()</em> effettua la query vera e propria riportando i valori ordinati per attinenza. La funzione <em>pulisciStringa()</em> serve per ripulire il codice e aumentarne la sicurezza. In tale funzione si possono fare tutti i controlli e le sostituzioni di caratteri che si vogliono. Se all&#8217;interno del database i caratteri sono codificati nelle loro rispettive entità html (situazione che capita spesso se si usa un editor wysiwyg) allora è possibile utilizzare al posto di <em>mysql_real_escape_string()</em> la funzione <em>htmlentities()</em>.<br />
Ho inserito nella classe anche 2 funzioni che possono essere molto utili. La prima è <em>ricercaParole()</em> che ha il compito di inserire davanti a ogni parola il segno &#8220;+&#8221;. Utilizzare tale parametro equivale a effettuare una ricerca di &#8220;tutte le parole&#8221; passate, ovvero tra i risultati ci saranno soltanto tuple che contengono tutte le parole di ricerca passate. La seconda è, invece, <em>ricercaFrase()</em> che ha il compito di restituire tra i risultati solamente tuple che contengono la chiave di ricerca così com&#8217;è. E&#8217; utile per ricercare una &#8220;frase esatta&#8221; all&#8217;interno dei campi e si attua inserendo la chiave di ricerca all&#8217;interno di doppi apici.</p>
<p>Vediamo come utilizzare la classe in una ricerca utilizzando il form precedente. Supponiamo che la connessione al database sia già stata effettuata, avremo:</p>
<pre class="brush:php;">$campo=$_POST['campo'];

$search = new Ricerca($campo, 'tabella', 'campo1, campo2');
$search-&gt;Query();
$cont = mysql_num_rows($search-&gt;tuple);

if($cont&lt;1)
echo "Non vi sono risultati per la ricerca selezionata";
else{
while ($row = mysql_fetch_array($search-&gt;tuple))
{
echo $row['campo1'];
}
}</pre>
<p>Si riprende il campo e si inizializza la classe attraverso il costruttore passandogli la chiave di ricerca, la tabella e i campi da analizzare. Successivamente effettuiamo la query e procediamo alla visualizzazione dei risultati.</p>
<p>Per avere tra i risultati della ricerca solo i risultati che contengono tutte le parole passate inseriamo prima della Query() la funzione ricercaParole():</p>
<pre class="brush:php;">$search = new Ricerca($campo, 'tabella', 'campo1, campo2');
$search-&gt;ricercaParole();
$search-&gt;Query();</pre>
<p>mentre per ricercare una frase esatta:</p>
<pre class="brush:php;">$search = new Ricerca($campo, 'tabella', 'campo1, campo2');
$search-&gt;ricercaFrase();
$search-&gt;Query();</pre>
<p>La classe vista finora è molto semplice e funzionale, può essere ampliata a piacimento per implementare funzioni che possono essere d&#8217;aiuto nel personalizzarla a seconda dei propri scopi.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.informaticaetlc.it/blog/script-php-per-ricerche-fulltext-con-mysql.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Motore di ricerca per MySQL con indici fulltext</title>
		<link>http://www.informaticaetlc.it/blog/motore-di-ricerca-per-mysql-con-indici-fulltext.html</link>
		<comments>http://www.informaticaetlc.it/blog/motore-di-ricerca-per-mysql-con-indici-fulltext.html#comments</comments>
		<pubDate>Sat, 23 Apr 2011 09:08:52 +0000</pubDate>
		<dc:creator>ilos37</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[against]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[fulltext]]></category>
		<category><![CDATA[in boolean mode]]></category>
		<category><![CDATA[like]]></category>
		<category><![CDATA[match]]></category>
		<category><![CDATA[myisam]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[query]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[text]]></category>
		<category><![CDATA[varchar]]></category>

		<guid isPermaLink="false">http://www.informaticaetlc.it/blog/?p=222</guid>
		<description><![CDATA[In questo articolo vedremo come creare un semplice motore di ricerca in php utilizzando gli indici fulltext di MySQL. Gli indici fulltext sono un meccanismo che consente di velocizzare le ricerche le quali risultano così molto più efficienti rispetto l&#8217;utilizzo del comando LIKE. Inoltre, con questo meccanismo, i risultati saranno visualizzati in ordine di attinenza [...]]]></description>
			<content:encoded><![CDATA[<p>In questo articolo vedremo come creare un semplice motore di ricerca in <strong>php</strong> utilizzando gli indici <strong>fulltext</strong> di <strong>MySQL</strong>. Gli indici fulltext sono un meccanismo che consente di <em>velocizzare le ricerche</em> le quali risultano così molto più efficienti rispetto l&#8217;utilizzo del comando <em>LIKE</em>. Inoltre, con questo meccanismo, i risultati saranno visualizzati in ordine di attinenza con le chiavi di ricerca.<br />
Affinché si possano utilizzare le ricerche fulltext bisogna prima preparare il database e, successivamente, il codice per effettuare le ricerche.</p>
<p><strong><span style="text-decoration: underline;">Preparazione del database</span></strong><br />
Condizione necessaria per l&#8217;utilizzo di questo tipo di ricerche è l&#8217;impostazione dei campi con indice fulltext. Tale impostazione può essere effettuata al momento della creazione della tabella o successivamente. Vediamo degli esempi.<br />
Per impostare i campi fulltext alla creazione della tabella basta inserire nella query SQL la stringa <em>FULLTEXT (campo1, campo2)</em>, dove i campi possono essere 1, 2 o più e sono separati da virgole. Es:</p>
<p>CREATE TABLE tabella(<br />
id INT AUTOINCREMENT NOT NULL PRIMARY KEY<br />
campo1 VARCHAR(255),<br />
campo2 TEXT,<strong><br />
<em>FULLTEXT (campo1, campo2)<br />
</em></strong><em>);</em></p>
<p>Per inserire gli indici in una tabella già esistente basta invece utilizzare la sintassi:</p>
<p>ALTER TABLE tabella ADD FULLTEXT(campo1,campo2);</p>
<p>Se non avete voglia di scrivere la query a mano potete anche utilizzare l&#8217;interfaccia di phpmyadmin per impostare i campi: selezionate la tabella su cui aggiungere i campi, selezionate &#8220;struttura&#8221; e nella riga del campo da impostare troverete come ultima opzione una casellina che dice FULLTEXT (testo completo).</p>
<p><span style="text-decoration: underline;">Nota</span>: affinché si possano utilizzare gli indici fulltext è necessario che la tabella utilizzi l&#8217;engine <strong>MyISAM</strong> e che i campi siano campi di testo (VARCHAR, TEXT&#8230;..).</p>
<p><span style="text-decoration: underline;"><strong>Sintassi per le ricerche</strong></span><br />
Il cuore delle ricerche fulltext è rappresentato dai comandi MATCH(&#8230;.) e AGAINST(&#8230;.) nei quali vanno inseriti rispettivamente il nome dei campi da analizzare e le chiavi di ricerca. Un esempio pratico è il seguente:</p>
<p>SELECT *<br />
FROM tabella<br />
WHERE MATCH(campo1, campo2) AGAINST(&#8217;key&#8217;);</p>
<p>Vi saranno risultati solo se vi sarà un valore di attinenza con la chiave di ricerca. MATCH e AGAINST producono un valore di attinenza in virgola mobile, se tale valore è zero non vi saranno risultati. La query così formata però ha il difetto di non riportare i risultati ordinati per attinenza. Quella che segue è una query più completa e funzionale.</p>
<p>SELECT *, MATCH(campo1, campo2) AGAINST(&#8217;key&#8217;, IN BOOLEAN MODE) AS attinenza<br />
FROM tabella<br />
WHERE MATCH(campo1, campo2) AGAINST(&#8217;key&#8217;, IN BOOLEAN MODE)<br />
ORDER BY attinenza DESC;</p>
<p>Tale query restituisce i risultati ordinati per attinenza per come viene calcolata dai comandi MATCH e AGAINST. Nella clausola AGAINST viene utilizzato altresì la dicitura <strong>IN BOOLEAN MODE</strong>, che permette di utilizzare operatori booleani per personalizzare e migliorare le ricerche.</p>
<p><strong>Operatori di ricerca</strong><br />
Oltre ai normali operatori AND e OR logici, nelle ricerche fulltest possono essere inseriti altri tipi di operatori per meglio filtrare i risultati, tra cui:</p>
<ul>
<li> <strong>Operatore +</strong>: indica che la parola a cui è anteposto deve essere presente in ogni record restituito;</li>
<li> <strong>Operatore -</strong>: indica che la parola a cui è anteposto non deve essere presente in alcun record restituito;</li>
<li> <strong>Operatori &lt; e &gt;</strong>: sono utilizzati per variare il contributo che la parola dona alla rilevanza (score) di un singolo record;</li>
<li> <strong>Operatori ()</strong>: le parentesi sono utili al fine di raggruppare tra loro sotto-espressioni che avranno un più alto grado di precedenza;</li>
<li> <strong>Operatore ~</strong>: viene utilizzato per segnare una  parola in modo che questa diminuisca l&#8217;attinenza di un record (viene  utilizzato per marcare le cosidette bad words);</li>
<li> <strong>Operatore *</strong>:  è l&#8217;unico operatore che può essere posto  alla fine della parola o di una parte di essa. Serve ad indicare che  caratteri qualsiasi possono seguire la parola o precederla;</li>
<li> <strong>Operatore &#8220;</strong>: le parole o frasi racchiuse tra apici  doppi obbligheranno MySQL ad effettuare ricerche sulla frase completa e  non su ogni singola parola.</li>
</ul>
<p>Nel prossimo <a href="http://www.informaticaetlc.it/blog/script-php-per-ricerche-fulltext-con-mysql.html">articolo</a> vedremo come usare praticamente le ricerche fulltext con php utilizzando una semplice classe.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.informaticaetlc.it/blog/motore-di-ricerca-per-mysql-con-indici-fulltext.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Prelevare codice video youtube da URL o da codice incorporato con object o iframe</title>
		<link>http://www.informaticaetlc.it/blog/prelevare-codice-video-youtube-da-url-o-da-codice-incorporato-con-object-o-iframe.html</link>
		<comments>http://www.informaticaetlc.it/blog/prelevare-codice-video-youtube-da-url-o-da-codice-incorporato-con-object-o-iframe.html#comments</comments>
		<pubDate>Tue, 01 Feb 2011 14:05:41 +0000</pubDate>
		<dc:creator>ilos37</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[id video]]></category>
		<category><![CDATA[iframe]]></category>
		<category><![CDATA[incorporare]]></category>
		<category><![CDATA[object]]></category>
		<category><![CDATA[url]]></category>
		<category><![CDATA[youtube]]></category>

		<guid isPermaLink="false">http://www.informaticaetlc.it/blog/?p=189</guid>
		<description><![CDATA[Mi è capitato spesso, nell&#8217;ultimo periodo, di dover inserire dei video youtube in siti web che richiedevano però modifiche del player, in particolare della sua dimensione. Per semplificare le cose ho scelto di incorporare nelle pagine uno stesso codice già personalizzato e passare a tale codice l&#8217;id del video scelto dal cliente.
Visto che ogni cliente [...]]]></description>
			<content:encoded><![CDATA[<p>Mi è capitato spesso, nell&#8217;ultimo periodo, di dover inserire dei video youtube in siti web che richiedevano però modifiche del player, in particolare della sua dimensione. Per semplificare le cose ho scelto di incorporare nelle pagine uno stesso codice già personalizzato e passare a tale codice l&#8217;id del video scelto dal cliente.<br />
Visto che ogni cliente ha un pensiero a sé stante, ho dovuto personalizzare il tutto in base alla scelta dell&#8217;utente di inserire l&#8217;URL del video, il vecchio codice di incorporamento o il nuovo codice utilizzato da youtube con il tag &lt;iframe&gt;. Per chi non lo sapesse, youtube ha da poco modificato il tipo di codice da incorporare con un codice che utilizza &lt;iframe&gt;; tale soluzione permette all&#8217;utente finale di visualizzare il video con tecnologia flash oppure HTML5 ed è particolarmente indicato per la visualizzazione dei video su dispositivi mobile. Tuttavia, il vecchio codice (tag &lt;object&gt;) è ancora disponibile su richiesta spuntando la voce &#8220;Utilizza vecchio codice di incorporamento&#8221; posto poco sotto il codice da incorporare.</p>
<p>Ho implementato una piccola funzione per l&#8217;estrazione dell&#8217;id del video in tutti e tre i casi. La riporto di seguito.</p>
<pre class="brush:php;">&lt;?php
function estraiCodice($codice){
$codMod = $codice;
$tipo='';
$idVideo='';

//Verifico il tipo di codice
if(strstr($codMod, 'iframe'))
$tipo='iframe';
elseif(strstr($codMod, 'object'))
$tipo='object';
elseif(strstr($codMod, 'watch?v='))
$tipo='link';

//Operazioni nel caso di codice tradizionale con object
if($tipo=='object'){
$part = explode('?', $codice);
$cod = explode('.com/v/',$part[0]);
$idVideo = $cod[1];
}
//Operazioni nel caso di nuovo codice con iframe
elseif($tipo=='iframe'){
$part = explode('embed/', $codice);
$cod = explode('"',$part[1]);
$idVideo = $cod[0];
}
//Operazioni nel caso di inserimento di URL
elseif($tipo=='link'){
$part = explode('?v=', $codice);
if(strstr($part[1], '&amp;')){
$cod = explode('&amp;',$part[1]);
$idVideo = $cod[0];
}else{
$idVideo=$part[1];
}
}

return $idVideo;
}
?&gt;</pre>
<p>Il codice è molto semplice. Per prima cosa verifico il tipo di incorporamento che è stato inserito e, successivamente, effettuo le operazioni necessarie per estrarre l&#8217;id, che è il risultato che voglio ottenere.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.informaticaetlc.it/blog/prelevare-codice-video-youtube-da-url-o-da-codice-incorporato-con-object-o-iframe.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SEO &#8211; L&#8217;head, i tag meta e il file robots.txt</title>
		<link>http://www.informaticaetlc.it/blog/seo-lhead-i-tag-meta-e-il-file-robots-txt.html</link>
		<comments>http://www.informaticaetlc.it/blog/seo-lhead-i-tag-meta-e-il-file-robots-txt.html#comments</comments>
		<pubDate>Mon, 12 Jul 2010 07:28:40 +0000</pubDate>
		<dc:creator>ilos37</dc:creator>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[content]]></category>
		<category><![CDATA[description]]></category>
		<category><![CDATA[follow]]></category>
		<category><![CDATA[head]]></category>
		<category><![CDATA[keyword]]></category>
		<category><![CDATA[keywords]]></category>
		<category><![CDATA[meta]]></category>
		<category><![CDATA[motore di ricerca]]></category>
		<category><![CDATA[no follow]]></category>
		<category><![CDATA[pagina web]]></category>
		<category><![CDATA[robots]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[serp]]></category>
		<category><![CDATA[tag]]></category>
		<category><![CDATA[title]]></category>

		<guid isPermaLink="false">http://www.informaticaetlc.it/blog/?p=90</guid>
		<description><![CDATA[Per un buon posizionamento nei motori di ricerca è importante strutturare la prima parte della pagina Web in maniera appropriata popolando la parte &#60;head&#62; attraverso i principali tag. Tra questi citeremo i tag &#60;title&#62; e &#60;meta&#62;.

&#60;title&#62;
Il più importante tra i tag dell&#8217;&#60;head&#62; è sicuramente il tag &#60;title&#62; che deve contenere il titolo della pagina Web. [...]]]></description>
			<content:encoded><![CDATA[<p>Per un buon posizionamento nei motori di ricerca è importante strutturare la prima parte della pagina Web in maniera appropriata popolando la parte <em>&lt;head&gt;</em> attraverso i principali tag. Tra questi citeremo i tag <em>&lt;title&gt; </em>e<em> &lt;meta&gt;.<br />
</em></p>
<p><strong>&lt;title&gt;</strong></p>
<p>Il più importante tra i tag dell&#8217;<em>&lt;head&gt;</em> è sicuramente il tag <em>&lt;title&gt;</em> che deve contenere il <em>titolo</em> della pagina Web. E&#8217; un parametro molto utilizzato dai motori di ricerca per l&#8217;indicizzazione della pagina quindi le parole contenute al suo interno devono rispecchiare le principali keyword contenute nella pagina.</p>
<p><strong>&lt;meta&gt;</strong></p>
<p>Vi sono diversi parametri che si possono impostare attraverso il tag <em>&lt;meta&gt;</em>, tra di essi però quelli che interessano maggiormente il SEO sono i parametri <strong>description</strong>, <strong>keywords </strong>e <strong>robots</strong>. Il loro utilizzo è del tipo:</p>
<pre class="chili"><code class="html""""""""""""""">&lt;meta name=&quot;description&quot; content=&quot;contenuto del tag&quot;&gt;&lt;/meta&gt;
&lt;meta name=&quot;keywords&quot; content=&quot;contenuto del tag&quot;&gt;&lt;/meta&gt;
&lt;meta name=&quot;robots&quot; content=&quot;contenuto del tag&quot;&gt;&lt;/meta&gt;
</code></pre>
<p>Vediamoli in dettaglio:</p>
<ul>
<li><strong>description</strong>, è utilizzato per fornire una descrizione della pagina e deve essere significativo in quanto viene spesso utilizzato dai motori per visualizzare quella pagina tra i risultati. Conviene non inserire mai troppe informazioni e limitarsi a una descrizione breve e concisa che contenga le principali keyword contenute nella pagina cercando di non superare i 100-150 caratteri;</li>
<li><strong>keywords</strong>, contiene le principali keywords (una o più parole) della pagina in maniera non discorsiva, quasi ad elenco. Le keyword vengono separate tra loro da virgole e conviene non andare oltre le 25-30 keywords per pagina. Un tempo questo tag forniva una importante indicazione per i motori, oggi invece è quasi &#8220;evitato&#8221; (google lo considera ormai pochissimo) per l&#8217;uso improprio e indiscriminato che ne è stato fatto negli anni passati;</li>
</ul>
<ul>
<li><strong>robots</strong>, serve a indicare al motore di ricerca se seguire e/o indicizzare la pagina Web. Il content di questo tag non è libero come per gli altri 2 ma bensì può assumere solo 4 configurazioni:</li>
</ul>
<p style="padding-left: 60px;">
<pre class="chili"><code class="html""""""""""""""""""""">
&lt;meta name=&quot;robots&quot; content=&quot;index, follow&quot;&gt;&lt;/meta&gt;
&lt;meta name=&quot;robots&quot; content=&quot;noindex, follow&quot;&gt;&lt;/meta&gt;
&lt;meta name=&quot;robots&quot; content=&quot;index, nofollow&quot;&gt;&lt;/meta&gt;
&lt;meta name=&quot;robots&quot; content=&quot;noindex, nofollow&quot;&gt;&lt;/meta&gt;
</code></pre>
</p>
<p style="padding-left: 30px;">La parte <strong>index</strong> sta a indicare al motore di ricerca che può indicizzare la pagina e quindi può farla, eventualmente, visualizzare tra le SERP; viceversa, <strong>noindex</strong> comunica al motore che quella pagina non deve essere indicizzata. La parte <strong>follow </strong>indica al motore che può seguire i link contenuti nella pagina in questione per poter indicizzare le pagine ad essa collegate; <strong>nofollow</strong> indica al motore di non seguire i link all&#8217;interno della pagina. E&#8217; preferibile utilizzare il meno possibile il tag robots e preferire l&#8217;inserimento del file <em>robots.txt</em> che vedremo tra poco. <strong>NOTA</strong>: se tale tag viene omesso di default la configurazione è <em>index,follow</em>.</p>
<p>Precisiamo una cosa importante: nei tag appena visti sopra, ovvero title, meta description e meta keywords <strong>utilizzate <span style="text-decoration: underline;">sempre</span> parole e frasi contenuti nella pagina Web!</strong> L&#8217;utilizzo indiscriminato di parole e frasi non contenute nella pagina ma inseriti in tali tag potrebbe portare a <strong>penalizzazioni </strong>e quindi alla visualizzazione della pagina molto più in basso nelle SERP!</p>
<p>Terminiamo questo articolo spendendo due parole sul file <strong>robotx.txt</strong> che, come accennato sopra, serve a indicare al motore di ricerca quali pagine indicizzare e quali no. Tale file va inserito nella root del sito, ovvero dove può essere visualizzato attraverso l&#8217;url principale. Un esempio molto semplice di tale file è il seguente:</p>
<pre class="chili"><code class="html""""""""""""""""""""">
User-Agent: *
Disallow: /pag_protetta/
Allow:/

</code></pre>
<p>Questo robots.txt si riferisce a tutti i motori di ricerca (User-Agent: *) e ci dice che i file all&#8217;interno della cartella &#8220;pag_protetta&#8221; (la vostra cartella che non volete far indicizzare) non vanno indicizzati mentre ciò non vale per tutte le altre pagine (Allow:/). Si possono personalizzare le regole in base ai motori di ricerca inserendo al posto di &#8220;User-Agent: *&#8221; il nome dello spider desiderato (googlebot per google, slurp per yahoo ecc&#8230;).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.informaticaetlc.it/blog/seo-lhead-i-tag-meta-e-il-file-robots-txt.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Invio di newsletter in PHP e gestione dello spam</title>
		<link>http://www.informaticaetlc.it/blog/invio-di-newsletter-in-php-e-gestione-dello-spam.html</link>
		<comments>http://www.informaticaetlc.it/blog/invio-di-newsletter-in-php-e-gestione-dello-spam.html#comments</comments>
		<pubDate>Sat, 10 Jul 2010 09:35:17 +0000</pubDate>
		<dc:creator>ilos37</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[allegati]]></category>
		<category><![CDATA[gmail]]></category>
		<category><![CDATA[hotmail]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[newsletter]]></category>
		<category><![CDATA[phpmailer]]></category>
		<category><![CDATA[smtp]]></category>
		<category><![CDATA[spam]]></category>

		<guid isPermaLink="false">http://www.informaticaetlc.it/blog/?p=72</guid>
		<description><![CDATA[In questo articolo vedremo come inviare in maniera semplice e veloce delle mail con la classe PHPMailer e cosa fare per evitare che esse vengano viste come spam dai vari filtri antispam presenti sugli account di posta.]]></description>
			<content:encoded><![CDATA[<p>In questi giorni mi sono trovato a risolvere un problema non di poco conto: le mail inviate come <em>newsletter </em>da alcuni siti vengono viste dai riceventi come <em>spam</em>. Ciò era dovuto, nella maggior parte dei casi, alla mancanza di alcuni <em>header </em>nelle impostazioni della mail. Purtroppo non tutti i problemi si sono risolti; infatti, su <strong>yahoo </strong>e, soprattutto, <strong>hotmail </strong>le mail venivano viste ancora come posta indesiderata, mentre l&#8217;invio su account come <strong>gmail</strong>, <strong>libero </strong>e <strong>alice </strong>non davano alcun problema. Ma procediamo con ordine e analizziamo il codice per l&#8217;invio delle mail.</p>
<p>Utilizziamo la classe <strong><a title="PHPMailer" href="http://phpmailer.worxware.com/" target="_blank">PHPMailer </a></strong>per gestire in modo estremamente semplice l&#8217;invio delle mail. Per utilizzarla scarichiamo il pacchetto e inseriamo all&#8217;interno del nostro codice il file <em>class.phpmailer.php</em>:</p>
<pre class="brush:php;">require_once("include/class.phpmailer.php");</pre>
<p>dopodiché si procede con l&#8217;inserimento delle varie opzioni:</p>
<pre class="brush:php;">
$mail = new PHPMailer();
$mail-&gt;IsSMTP();                    // attiva l'invio tramiteSMTP
$mail-&gt;Host     = "vostro.server.smtp"; // indirizzo smtp
$mail-&gt;From     = "vostra@mail.com";
$mail-&gt;FromName = "Vostro nome";
$mail-&gt;AddReplyTo('vostra-mail@reply.com');
$mail-&gt;Sender = "vostra@mail.com";
$mail-&gt;AddAddress(mail@destinatario.com);
$mail-&gt;IsHTML(true);
$mail-&gt;Subject  =  "Oggetto della mail";
$mail-&gt;Body     =  "Corpo della mail";
if(!$mail-&gt;Send()){
echo "Si è verificato un errore nell'invio della mail";
}
</pre>
<p>Il codice è molto semplice, si istanzia un oggetto della classe in questione e abilitiamo l&#8217;invio tramite <strong>SMTP </strong>attraverso il metodo <em>IsSMTP().</em> Si inseriscono i propri dati per completare le intestazioni e l&#8217;indirizzo del destinatario della mail; con il metodo <em>IsHTML(true) </em>impostiamo l&#8217;invio della mail come <em>text/html</em> così da poter inserire i tag html per gestire il formato della mail (ovviamente se è una mail di solo testo si può omettere, anzi è consigliabile come vedremo dopo). Dopo aver inserito l&#8217;oggetto e il corpo si effettua l&#8217;invio tramite il metodo <em>Send()</em>.</p>
<p>Sulla classe PHPMailer ci sono da dire altre 2 cose importanti: tramite di essa si posso inviare email anche tramite server SMTP che richiedono l&#8217;autenticazione inserendo i seguenti parametri:</p>
<pre class="brush:php;">
$mail-&gt;Username =  "username del server SMTP"; //di solito la mail utilizzata
$mail-&gt;Password = 'password'; //di solito la password della mail
$mail-&gt;SMTPAuth = true;
</pre>
<p>oppure inserire degli allegati attraverso il parametro:</p>
<pre class="brush:php;">
$mail-&gt;AddAttachment("filename_1.zip");
</pre>
<p>Anche se in maniera breve, abbiamo fatto una panoramica abbastanza esauriente sull&#8217;utilizzo della classe PHPMailer. Con le impostazioni viste sono riuscito a non avere molti problemi con i vari gestori di account di posta che analizzano principalmente le intestazioni con i loro filtri antispam. Purtroppo è il livello del filtro che fa si che la nostra email sia considerata come spam oppure no. Di solito vi è un indice numerico che stabilisce un livello massimo di tolleranza e ogni &#8220;imprecisione&#8221; o &#8220;problema&#8221; rilevato sui vari parametri della mail (intestazione, oggetto, corpo&#8230;) incide per un valore in base alla gravità. Se la somma di tali valori supera il livello massimo di tolleranza l&#8217;email verrà vista come spam.</p>
<p>Se la vostra mail è puro testo non ci dovrebbero essere molti problemi avendo tutte le impostazioni apposto, al contrario, invece, se la mail contiene codice html, i filtri antispam sono molto più restrittivi soprattutto in presenza di immagini. Per cercare di non incorrere in penalizzazioni bisogna inserire un codice html il più possibile <strong>pulito </strong>e <strong>accessibile</strong>. Bisogna inserire tutti i tag in ordine con la relativa chiusura secondo la struttura</p>
<pre class="brush:html;">
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /&gt;
&lt;title&gt;Title della mail&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;
&lt;!-- Corpo della mail --&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>All&#8217;interno del body possiamo inserire tutti i tag che ci servono per formattare come meglio crediamo la mail (&lt;p&gt;, &lt;table&gt; ecc..) ricordandoci 3 importanti accorgimenti:</p>
<ol>
<li>se inseriamo immagini inseriamo SEMPRE gli attributi <strong>alt </strong>e <strong>title</strong>;</li>
<li>l&#8217;attributo <strong>title</strong> va inserito anche nei link inseriti attraverso il tag &lt;a&gt;;</li>
<li>se inseriamo immagini e/o molti tag html dobbiamo inserire anche abbastanza testo; da prove da me effettuate  una mail con anche solo un&#8217;immagine all&#8217;interno e poco testo viene penalizzata, mentre se il testo è abbastanza passa più facilmente senza penalizzazioni.</li>
</ol>
<p>Rispettando queste semplici regole sono riuscito a far pervenire, anche a utenti hotmail, la mail senza che il filtro antispam la taggasse come spam. Naturalmente in molti account è possibile personalizzare la sensibilità del filtro che potrebbe dare problemi anche con accorgimenti più accurati.</p>
<p>L&#8217;ultimo argomento dell&#8217;articolo riguarda l&#8217;analisi di una mail taggata come spam se l&#8217;accout ci fornisce le informazioni sulle penalizzazioni effettuate dal filtro antispam. Alcuni account (come gli account  email creati su aruba, ad esempio) ci forniscono tali informazioni. Vediamo un esempio pratico di una mail taggata come spam:</p>
<pre class="chili"><code class=""""""""""""""""""">
Content analysis details:   (5.2 points, 5.0 required)
pts rule name              description
---- ---------------------- ------------------------------
--------------------
-0.0 NO_RELAYS              Informational: message was not relayed via  SMTP
0.0 HTML_MESSAGE           BODY: HTML included in message
1.7 MIME_HTML_ONLY         BODY: Message only has text/html MIME parts
2.5 HTML_IMAGE_ONLY_16     BODY: HTML: images with 1200-1600 bytes of  words
1.1 HTML_MIME_NO_HTML_TAG  HTML-only message, but there is no HTML tag
-0.0 NO_RECEIVED            Informational: message has no Received  headers</code></pre>
<div>Questa situazione ci informa che il filtro è impostato su una sensibilità massima pari a 5.0 (5.0 required) ma l&#8217;email ha riportato un punteggio di 5.2 (5.2 points). Dall&#8217;analisi si evince che la mail era stata impostata im maniera errata, dove mancavano i tag più importanti come il tag &lt;html&gt; (&#8221;1.1 HTML_MIME_NO_HTML_TAG  HTML-only message, but there is no HTML tag&#8221;), era formata in gran parte da codice html con poco testo (&#8221;1.7 MIME_HTML_ONLY BODY: Message only has text/html MIME parts&#8221;) e il testo era insufficiente anche rispetto alle immagini inserite (2.5 HTML_IMAGE_ONLY_16 BODY: HTML: images with 1200-1600 bytes of   words). Per informazioni più dettagliate sui vari tipi di errore si veda il seguente <a href="http://spamassassin.apache.org/tests_3_3_x.html">link</a> aggiornato alla versione 3.3 che è quella più aggiornata al momento della scrittura dell&#8217;articolo.</div>
]]></content:encoded>
			<wfw:commentRss>http://www.informaticaetlc.it/blog/invio-di-newsletter-in-php-e-gestione-dello-spam.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SEO &#8211; Introduzione ai motori di ricerca</title>
		<link>http://www.informaticaetlc.it/blog/seo-introduzione-ai-motori-di-ricerca.html</link>
		<comments>http://www.informaticaetlc.it/blog/seo-introduzione-ai-motori-di-ricerca.html#comments</comments>
		<pubDate>Tue, 06 Jul 2010 17:37:30 +0000</pubDate>
		<dc:creator>ilos37</dc:creator>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[crawler]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[googlebot]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[keyword]]></category>
		<category><![CDATA[link popularity]]></category>
		<category><![CDATA[motori di ricerca]]></category>
		<category><![CDATA[page rank]]></category>
		<category><![CDATA[robots]]></category>
		<category><![CDATA[search engine optimization]]></category>
		<category><![CDATA[serp]]></category>
		<category><![CDATA[slurp]]></category>
		<category><![CDATA[url]]></category>
		<category><![CDATA[yahoo]]></category>

		<guid isPermaLink="false">http://www.informaticaetlc.it/blog/?p=62</guid>
		<description><![CDATA[La Search Engine Optimization riveste un ruolo sempre maggiore nel Web per cercare di risalire nei risultati dei motori di ricerca per determinate keyword. In questo articolo viene effettuata una trattazione teorica sul SEO analizzando concetti come crawler, link popularity e page rank.]]></description>
			<content:encoded><![CDATA[<p>Al giorno d&#8217;oggi è sempre più frequente ricercare qualsiasi informazione attraverso i motori di ricerca, si arriva persino a inserire l&#8217;URL di un sito sul motore invece che sulla barra degli indirizzi! Si può ben capire che avere il proprio sito nelle prime posizioni risultanti dalla ricerca è un fattore molto importante soprattutto in ambito commerciale; spesso le aziende pagano i motori per far si che il loro sito risulti bene in vista se vengono digitate alcune <em>parole chiave</em> (<strong>keyword</strong>) come nel caso di <strong>google </strong>con <em>google adwords,</em> che propone dei link &#8220;sponsorizzati&#8221; in cima alla lista dei risultati della ricerca o inseriti laterali alla stessa pagina. Tale servizio, però, si paga <em>&#8220;a click</em>&#8221; e in base alla mole di visitatori il costo salirebbe vertiginosamente: in questo contesto nasce la scienza che studia in che modo funziona l&#8217;algoritmo di ricerca dei motori e le relative applicazioni pratiche per poter far comparire un sito nelle prime posizioni delle ricerche in relazione all&#8217;utilizzo di determinate keyword. Tali procedure prendono il nome di <em><strong>ottimizzazione dei motori di ricerca</strong></em> o <strong><em>Search  Engine Optimization</em></strong> (<strong>SEO</strong>)</p>
<p>E&#8217; stato precedentemente citato google non a caso. Il colosso di Mountain View, infatti, è il motore di ricerca più utilizzato al mondo e il suo algoritmo di ricerca è ancora poco chiaro in tutti i suoi punti, però si hanno molte infomazioni su come lavora. La nostra trattazione di SEO consterà maggiormente su come ottimizzare una pagina web e/o un intero sito internet per google.</p>
<p>L&#8217;attività di SEO è un&#8217;operazione che va effettuata sia sul codice HTML che sui contenuti, non basta infatti inserire dei tag &lt;meta&gt; al posto giusto per fare SEO, quello serve ma non è abbastanza: i contenuti di una pagina web svolgono un ruolo importante nel farla posizionare bene utilizzando vocaboli appropriati che possano consentire una migliore visibilità da parte dei motori. L&#8217;ottimizzazione sul codice verrà trattata in un altro articolo.</p>
<p>Come avviene la scansione di un sito da parte di un motore di ricerca? La ricerca delle pagine web avviene attraverso meccanismi automatizzati, da script che analizzano un sito web in maniera iterativa seguendo i link che vi sono al suo interno partendo dall&#8217;URL principale fino alle pagine più interne. Tali script prendono il nome di <strong>crawler</strong> o <strong>spider</strong>. Ogni motore ha uno spider apposito, quello di google di chiama <em>googlebot</em>, di <strong>Yahoo</strong> si chiama <strong>Yahoo! Slurp</strong> e così via&#8230;. Lo spider continua la scansione in tutte le pagine senza fare distinzione tra le cartelle, andando così a indicizzare (e quindi rendere potenzialmente pubblici) anche file e/o pagine che si vorrebbero tenere lontano dai motori di ricerca. Per limitare la scansione si può utilizzare un file che si deve chiamare <span style="text-decoration: underline;"><em>robots.txt</em></span> nella root del sito indicando le directory da non indicizzare e alcune regole da utilizzare.<span style="text-decoration: underline;"><strong><br />
Importante</strong></span>: il crawler dovrebbe non andare a leggere il contenuto delle cartelle che sono state indicate nel robots.txt, ma alcuni crawler lo fanno comunque, è bene tenerlo presente. Googlebot segue bene le indicazioni inserite sul robots.txt.</p>
<p>Terminiamo questa breve introduzione teorica sul SEO introducendo dei parametri molto cari a google: <strong>link popularity</strong> e <strong>page rank</strong>. Ogniqualvolta si effettua una ricerca si ha un elenco ordinato di risultati che prendono il nome di <strong>search engine result page</strong> (<strong>SERP</strong>). A parità di tag e di contenuti, un sito può risultare molto più in alto nelle SERP di un altro proprio in base a questi due parametri.<br />
La <em>link popularity</em> è il numero dei link che puntano a una determinata pagina Web e indica la &#8220;popolarità&#8221; di un sito. Infatti, un link verso una pagina Web di un sito da parte di un altro può essere visto come un &#8220;consiglio&#8221; hai visitatori e quindi l&#8217;indicazione che il sito vale la pena di essere visitato.<br />
Il <em>page rank</em> può essere visto come una link popularity &#8220;pesata&#8221; dove ci sono link che &#8220;valgono&#8221; di più e link che &#8220;valgono&#8221; di meno. Esso è un valore che va da 0 a 10 e si calcola in base al seguente algoritmo</p>
<div id="attachment_65" class="wp-caption aligncenter" style="width: 308px"><img class="size-full wp-image-65" title="page_rank" src="http://www.informaticaetlc.it/blog/wp-content/uploads/2010/07/page_rank.png" alt="formula per il calcolo del page rank da parte di google" width="298" height="51" /><p class="wp-caption-text">formula per il calcolo del page rank da parte di google</p></div>
<p>Dove:</p>
<ul>
<li><em>PR[A]</em> è il valore di PageRank della pagina A che vogliamo  calcolare.</li>
<li><em>n</em> è il numero di pagine che contengono almeno un link verso  A. <em>P<sub>k</sub></em> rappresenta ognuna di tali pagine.</li>
<li><em>PR[P<sub>k</sub>]</em> sono i valori di PageRank di ogni pagina P<sub>k</sub>.</li>
<li><em>C[P<sub>k</sub>]</em> sono il numero complessivo di link contenuti  nella pagina che offre il link.</li>
<li><em>d (damping factor)</em> è un fattore deciso da Google e che nella  documentazione originale assume valore 0,85. Può essere aggiustato da  Google per decidere la percentuale di PageRank che deve transitare da  una pagina all&#8217;altra e il valore di PageRank minimo attribuito ad ogni  pagina in archivio.</li>
</ul>
<p>Dalla formula si nota quindi che all&#8217;aumentare del numero di link  complessivi dei siti che puntano ad A il PageRank aumenta. (Fonte Wikipedia)</p>
<p>Ovviamente, la trattazione di oggi non esaurisce tutti gli argomenti teorici riguardanti il SEO, ma è la base per poter comprendere meglio la parte pratica che verrà sviluppata nel prossimo articolo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.informaticaetlc.it/blog/seo-introduzione-ai-motori-di-ricerca.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Principali funzioni php per lavorare sulle stringhe</title>
		<link>http://www.informaticaetlc.it/blog/principali-funzioni-php-per-lavorare-sulle-stringhe.html</link>
		<comments>http://www.informaticaetlc.it/blog/principali-funzioni-php-per-lavorare-sulle-stringhe.html#comments</comments>
		<pubDate>Tue, 05 Jan 2010 14:44:13 +0000</pubDate>
		<dc:creator>ilos37</dc:creator>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[array]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[stringhe]]></category>
		<category><![CDATA[tag]]></category>
		<category><![CDATA[textarea]]></category>

		<guid isPermaLink="false">http://www.informaticaetlc.it/blog/?p=54</guid>
		<description><![CDATA[PHP mette a disposizione molte funzionalità utili per lavorare sulle stringhe e facilitando il lavoro del programmatore. In questo articolo vedremo come utilizzare alcune funzioni che sono di uso ricorrente nel trattamento delle stringhe.
Le prime funzioni che andremo a vedere riguardano la forma del testo. PHP permette di modificare una stringa (intesa come singola parola [...]]]></description>
			<content:encoded><![CDATA[<p>PHP mette a disposizione molte funzionalità utili per lavorare sulle stringhe e facilitando il lavoro del programmatore. In questo articolo vedremo come utilizzare alcune funzioni che sono di uso ricorrente nel trattamento delle stringhe.</p>
<p>Le prime funzioni che andremo a vedere riguardano la forma del testo. PHP permette di modificare una stringa (intesa come singola parola o come intera frase) in modo da trasformarla in tutto o in parte in maiuscolo o minuscolo. Le funzioni <strong>strtoupper() </strong>e <strong>strtolower()</strong> permettono di modificare la stringa trasformando ciascuna lettere rispettivamente in maiuscolo o in minuscolo. Si potrebbero usare ad esempio per modificare un indirizzo in email tutto in minuscolo oppure un codice fiscale tutto in maiuscolo come di solito vengono rappresentati. Possiamo modificare solo la prima solo la prima lettera di una stringa portandola maiuscola con <strong>ucfirst()</strong> oppure tutti i primi caratteri di ogni parola con <strong>ucwords()</strong>.</p>
<p>La funzione <strong>strlen()</strong> ci permette di conoscere il numero di caratteri all&#8217;interno di una stringa mentre se volessimo ottenere una sottostringa  potremmo utilizzare la funzione <strong>substr()</strong> che accetta 3 parametri: la stringa, il punto di partenza e la lunghezza della sottostringa partendo da quel punto.  Il punto di partenza può anche essere negativo, in questo caso si inizia a contare dalla fine della stringa da elaborare.  Un&#8217;altra funzione ricorrente è <strong>str_replace()</strong> che accetta in ingresso 3 parametri:  il primo è la frase (o parola) da sostituire, il secondo la frase in sostituzione e il terzo la stringa da elaborare.</p>
<p>Adesso passiamo a funzioni molto utili quando si lavora in con delle form html. La prima di esse è la funzione <strong>nl2br()</strong> che trasforma i caratteri di <em>new line</em> (ovvero gli <em>\n</em>, a capo) nei corrispondenti tag <em>&lt;br&gt;</em> di html, che si possono ritrovare dalla compilazione di una textarea. Per eliminare invece qualsiasi tag html e/o javascript  si può utilizzare <strong>strip_tags()</strong>. La funzione <strong>trim()</strong>, invece, permette di eliminare gli spazi bianchi all&#8217;esterno della stringa (all&#8217;inizio e alla fine) ma anche i caratteri di <em>\n</em> e <em>\r</em>. Le varianti di questa funzione sono <em>ltrim()</em> e <em>rtrim()</em> che ripuliscono la stringa allo stesso modo di <strong>trim()</strong> ma rispettivamente all&#8217;inizio e alla fine.</p>
<p>Se non si vuole far interpretare il codice html inserito si possono utilizzare le funzioni <strong>htmlspecialchars()</strong> e <strong>htmlhentities()</strong>. La prima trasforma in entità html i caratteri <em>&amp;, &#8220;, &lt; e &gt;</em>; la seconda, invece, codifica in entità html tutti i caratteri che hanno una corrispondenza con tale codifica. Vengono spesso usate per motivi di sicurezza quando non si vogliono far inserire all&#8217;utente tag html che posso pregiudicare la grafica del sito o per altri scopi di sicurezza. Legata alla sicurezza è anche la funzione <strong>addslashes()</strong> che immette i caratteri di escape davanti a quei caratteri che possono generare errore utilizzando un dbms. La funzione inversa a <strong>addslashes()</strong> è <strong>stripslashes()</strong> che rimuove invece tutti i caratteri di escape inseriti dalla prima funzione. Da tenere in considerazione è la configurazione del php.ini: infatti, se la direttiva <em><strong>magic_quotes_gpc</strong></em> è impostata su on non vi è il bisogno di utilizzare <strong>addslashes()</strong> in quanto tutti i dati provenienti da form o da cookie verranno automaticamente modificati.</p>
<p>Vediamo infine come trasformare una stringa in un array e viceversa. La funzione <strong>explode()</strong> accetta in ingresso 2 parametri: un carattere separatore e la stringa. Il risultato della funzione è un array che ha gli elementi della stringa, ogni volta che si incontra un carattere separatore viene impostato un nuovo elemento nell&#8217;array. La funzione inversa è la funzione<strong> implode() </strong>che trasforma un array in una stringa. Anch&#8217;essa ha 2 parametri, il carattere separatore e l&#8217;array da convertire; il risultato è una stringa composta dalla sequenza di stringhe contenute nell&#8217;array separate dal carattere separatore voluto.</p>
<p>Presto posterò gli esempi per ogni funzione illustrata. Naturalmente queste non sono le sole funzioni che PHP mette a disposizione per manipolare le stringhe, ma sono quelle che una volta imparate verranno utilizzate ogni volta ce ne sia il bisogno.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.informaticaetlc.it/blog/principali-funzioni-php-per-lavorare-sulle-stringhe.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

