<?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>jblog &#187; Php e MySql</title>
	<atom:link href="http://jblog.it/category/php-e-mysql/feed" rel="self" type="application/rss+xml" />
	<link>http://jblog.it</link>
	<description>News e appunti per webmaster</description>
	<lastBuildDate>Tue, 25 May 2010 16:16:12 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Wordpress: ordinare gli articoli in modo casuale</title>
		<link>http://jblog.it/2009/06/04/wordpress-query-ordinare-post-articoli-modo-casuale-random_573.html</link>
		<comments>http://jblog.it/2009/06/04/wordpress-query-ordinare-post-articoli-modo-casuale-random_573.html#comments</comments>
		<pubDate>Thu, 04 Jun 2009 21:11:25 +0000</pubDate>
		<dc:creator>Giacomo</dc:creator>
				<category><![CDATA[Php e MySql]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[classe php]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[wordpress trick]]></category>
		<category><![CDATA[wp_query]]></category>

		<guid isPermaLink="false">http://jblog.it/?p=573</guid>
		<description><![CDATA[Un lettore del blog mi ha contattato per chiedermi di aiutarlo a impostare Wordpress.
In particolare, ha bisogno di ordinare i post in modo casuale nell&#8217;archivio di categoria.
Dopo aver spulciato le librerie di Wordpress e aver eseguito un po&#8217; di prove ho sfornato questa funzione che sembra funzionare a dovere.
La classe WP_Query

In Wordpress le query (interrogazioni) [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://jblog.it/2009/06/04/wordpress-query-ordinare-post-articoli-modo-casuale-random_573.html"><img class="alignright size-full wp-image-574" title="Logo Wordpress" src="http://jblog.it/wp-content/uploads/2009/10/wordpress-logo.jpg" alt="Logo Wordpress" width="220" height="220" /></a>Un lettore del blog mi ha contattato per chiedermi di aiutarlo a impostare Wordpress.</p>
<p>In particolare, ha bisogno di ordinare i post in modo casuale nell&#8217;archivio di categoria.</p>
<p>Dopo aver spulciato le librerie di Wordpress e aver eseguito un po&#8217; di prove ho sfornato questa funzione che sembra funzionare a dovere.</p>
<h2>La classe WP_Query</h2>
<p><!--adv300--></p>
<p>In Wordpress le query (interrogazioni) al database vengono gestite con la classe WP_Query che si trova in <strong>wp-includes/query.php</strong>.</p>
<p>Ecco le proprietà e i metodi della classe WP_Query che utilizziamo:</p>
<ul>
<li>con il metodo <code>set($query_var, $value)</code> impostiamo le caratteristiche della query</li>
<li>il metodo <code>get($query_var)</code> restituisce il valore di una variabile</li>
<li>per eseguire la query utilizziamo la funzione <code>get_posts()</code></li>
</ul>
<p>Tuttavia, questi tre metodi non bastano a modificare l&#8217;elenco dei post che verranno visualizzati.</p>
<p>Questo elenco è memorizzato all&#8217;interno della proprietà <code>posts</code> (di tipo array) che verrà sovrascritta con l&#8217;array restituito dal metodo get_posts(), nell&#8217;ultima riga.</p>
<p><strong>Per saperne di più</strong> sulla classe WP_Query vai su <a title="Wordpress - Function Reference: WP Query" href="http://codex.wordpress.org/Function_Reference/WP_Query" target="_blank">http://codex.wordpress.org/Function_Reference/WP_Query</a>.<span id="more-573"></span></p>
<h2>Il codice</h2>
<pre lang="php">function jblog_orderbyRand()
{
	global $wp_query;

	// Imposta il tipo di ordinamento
	$wp_query-&gt;set('orderby', 'rand');

	// Disabilita la paginazione dei post
	$wp_query-&gt;set('nopaging', true);
	$wp_query-&gt;set('posts_per_page', -1);

	// Reimposta l'array dei post da stampare
	$wp_query-&gt;posts = $wp_query-&gt;get_posts();
}</pre>
<h2>Come utilizzare la funzione</h2>
<p>Innanzitutto copiamo il codice precedente nel file <strong>functions.php</strong> (all&#8217;interno della directory del template). Se il file non esiste basterà crearlo.</p>
<p>Anche se la necessità originale era quella di modificare l&#8217;elenco dell&#8217;archivio di categoria, questa funzione è efficace in ogni pagina del blog che contenga un elenco di post, quindi nell&#8217;homepage, nell&#8217;archivio di tag, ecc.</p>
<p>Per utilizzarla basterà inserirla in testa alla pagina da modificare. Ad esempio, se vogliamo che tutti gli archivi vengano ordinati in modo casuale, dobbiamo aprire il file <strong>archive.php</strong> del template e inserirla in testa:</p>
<pre lang="php">&lt;? // Ordinamento casuale
   jblog_orderbyRand(); 	?&gt;

&lt;? get_header(); ?&gt;
	&lt;div id="content" class="narrowcolumn"&gt;
		&lt;?php if (have_posts()) : ?&gt;
			. . .</pre>
<p>Se, come nel caso del lettore, si deve ordinare in modo casuale solo l&#8217;archivio di categoria scriveremo la funzione all&#8217;interno di un costrutto if in cui si controlla che l&#8217;archivio sia relativo a una categoria.</p>
<p>Questo controllo si esegue ottenendo l&#8217;id della categoria grazie alla funzione <code>get_query_var('cat')</code> che restituisce il valore di una variabile per la query. Nota che quella funzione è equivalente all&#8217;istruzione <code>$wp_query-&gt;get('cat')</code>. Entrambe restituiscono l&#8217;<strong>id (di tipo intero) della categoria</strong>. Questo sarà maggiore di zero se l&#8217;archivio che si sta visualizzando è di categoria.</p>
<pre lang="php">&lt;? // Ordinamento casuale (se id categoria è positivo)
   if(get_query_var('cat')&gt;0)
   jblog_orderbyRand(); 	?&gt;

&lt;? get_header(); ?&gt;
	&lt;div id="content" class="narrowcolumn"&gt;
		&lt;?php if (have_posts()) : ?&gt;
		. . .</pre>
<h2>Svantaggio: non è possibile dividere i post per pagine</h2>
<p>Ogni volta che si carica la pagina viene rigenerato l&#8217;elenco e, dato che viene ordinato in modo casuale, i post non vengono adeguatamente distribuiti nelle varie pagine. In pratica è concreto il <strong>rischio </strong>che dei post apparsi nella pagina 1 possano apparire nuovamente in altre pagine. Per questo motivo viene disabilitata la paginazione.</p>
<p>Inoltre, è necessario applicare un <strong>ultima modifica</strong> al tema della pagina che ospiterà l&#8217;elenco da ordinare in modo casuale. Cioé, è necessario evitare che appaiano <strong>i link &#8220;post precedenti&#8221; e &#8220;post successivi&#8221;</strong>. Nei casi più semplici basterà eliminare il codice relativo a questi link. Se invece l&#8217;ordinamento casuale è condizionato (come nel codice precedente) bisognerà applicare le condizioni (contrarie rispetto a quelle relative alla funzione) alla visualizzazione di questi link:</p>
<pre lang="html">&lt;? // Per la funzione la condizione era get_query_var('cat')&gt;0 (con il "&gt;" anziché "&lt;=")
if(get_query_var('cat')&lt;=0) : ?&gt;
	&lt;div class="navigation"&gt;
		&lt;div class="alignleft"&gt;&lt;?php next_posts_link(__('&amp;laquo; Older Entries', 'kubrick')); ?&gt;&lt;/div&gt;
		&lt;div class="alignright"&gt;&lt;?php previous_posts_link(__('Newer Entries &amp;raquo;', 'kubrick')); ?&gt;&lt;/div&gt;
	&lt;/div&gt;
&lt;? endif; ?&gt;</pre>
<h2>Serve aiuto?</h2>
<p>Come vedi quello che ho scritto nella pagina &#8220;Informazioni&#8221; riguardo l&#8217;aiuto ai lettori non sono solo un mucchio di frasi fatte per riempire una pagina. Quindi <strong>se hai bisogno di aiuto o, più semplicemente, di un consiglio ricordati di passare da qui</strong>. Finché ne avrò il tempo sarò felice di aiutarti! <img src='http://jblog.it/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' title="Wordpress: ordinare gli articoli in modo casuale" /> </p>
<img src="http://jblog.it/?ak_action=api_record_view&id=573&type=feed" alt=" Wordpress: ordinare gli articoli in modo casuale"  title="Wordpress: ordinare gli articoli in modo casuale" />]]></content:encoded>
			<wfw:commentRss>http://jblog.it/2009/06/04/wordpress-query-ordinare-post-articoli-modo-casuale-random_573.html/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Controllare il formato di un indirizzo email con le espressioni regolari (RegEx) in PHP e Javascript</title>
		<link>http://jblog.it/2009/05/20/controllare-formato-indirizzo-email-espressioni-regolari-regex-php-javascript_468.html</link>
		<comments>http://jblog.it/2009/05/20/controllare-formato-indirizzo-email-espressioni-regolari-regex-php-javascript_468.html#comments</comments>
		<pubDate>Wed, 20 May 2009 17:56:16 +0000</pubDate>
		<dc:creator>Giacomo</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Php e MySql]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[espressioni regolari]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[regex]]></category>

		<guid isPermaLink="false">http://jblog.it/?p=468</guid>
		<description><![CDATA[Ogni programmatore web prima o poi si scontra con la necessità di controllare se il formato dell&#8217;indirizzo email inserito dall&#8217;utente è valido.
Senza dubbio, il modo migliore per farlo consiste nell&#8217;utilizzo delle espressioni regolari, chiamate anche RegEx (da &#8220;regular expressions&#8221;).
Perché è il modo migliore? Anziché scrivere un&#8217;intera funzione composta da decine e decine di righe di [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Controllare il formato di un indirizzo email con le espressioni regolari (RegEx) in PHP e Javascript" href="http://jblog.it/2009/05/20/controllare-formato-indirizzo-email-espressioni-regolari-regex-php-javascript_468.html"><img class="alignright size-full wp-image-483" title="Logo Regex simile a FedEx" src="http://jblog.it/wp-content/uploads/2009/05/fts-regex-front.jpg" alt="Logo Regex simile a FedEx" width="252" height="144" /></a>Ogni programmatore web prima o poi si scontra con la necessità di controllare se il formato dell&#8217;indirizzo email inserito dall&#8217;utente è valido.</p>
<p>Senza dubbio, il <strong>modo migliore</strong> per farlo consiste nell&#8217;utilizzo delle espressioni regolari, chiamate anche RegEx (da &#8220;regular expressions&#8221;).</p>
<p><strong>Perché è il modo migliore? </strong>Anziché scrivere un&#8217;intera funzione composta da decine e decine di righe di codice, grazie alle RegEx basta defire il modello (o <strong>pattern</strong>) della stringa email e far eseguire il confronto da un&#8217;apposita funzione.<br />
<span id="more-468"></span></p>
<h2>Caratteristiche di un indirizzo email</h2>
<p>Il primo passo consiste nell&#8217;individuare le caratteristiche di un indirizzo email in modo da definirle successivamente in un modello (pattern).</p>
<p><img class="aligncenter size-full wp-image-472" title="Struttura di un indirizzo email" src="http://jblog.it/wp-content/uploads/2009/05/email_address.png" alt="Struttura di un indirizzo email" width="511" height="147" /></p>
<h3>Local part</h3>
<p>Questa parte, che indica spesso l&#8217;username, può essere costituita da:</p>
<ul>
<li>un massimo di 64 caratteri</li>
<li>lettere minuscole e maiuscole dell&#8217;alfabeto inglese, cioè a-z e A-Z</li>
<li>numeri, da 0 a 9</li>
<li>caratteri speciali <code>. ! # $ % &amp; ' * + - / = ? ^ _ ` { | } ~</code>. Alcuni servizi email non permettono di creare indirizzi solo con i caratteri speciali più comuni come &#8220;.&#8221; , &#8220;-&#8221;, e &#8220;_&#8221;</li>
</ul>
<p><strong>N.B.</strong> il carattere &#8220;.&#8221; non può trovarsi né all&#8217;inizio né alla fine.</p>
<h3>Domain name</h3>
<p>La parte successiva alla &#8220;@&#8221; è il nome del dominio (es. example.com) che può essere costituito da:</p>
<ul>
<li>un massimo di 255 caratteri</li>
<li>lettere minuscole dell&#8217;alfabeto inglese, cioè a-z</li>
<li>numeri, da 0 a 9</li>
<li>caratteri speciali &#8220;.&#8221; e &#8220;-&#8221;</li>
</ul>
<p><strong>N.B.</strong> il carattere &#8220;.&#8221; non può trovarsi né all&#8217;inizio né alla fine. Inoltre deve essere presente almeno un punto.</p>
<h2>Il pattern per un indirizzo email</h2>
<p><!--adv300--></p>
<p>Ora che sappiamo la struttura di un indirizzo email possiamo definire precisamente il pattern che verrà confrontato all&#8217;indirizzo email da controllare.</p>
<p>Definiamo un pattern per indirizzi email semplici che contengano sono lettere, numeri, punti &#8220;.&#8221;, underscore &#8220;_&#8221; e trattini &#8220;-&#8221;. In seguito vedremo come modificare i pattern in modo da accettare anche i caratteri speciali.</p>
<h3>Pattern per la &#8220;local part&#8221;</h3>
<p><img class="aligncenter size-full wp-image-477" title="Pattern per la local part" src="http://jblog.it/wp-content/uploads/2009/05/localpart_pattern2.png" alt="Pattern per la local part" width="487" height="128" />La <strong>prima parte</strong> impone che l&#8217;indirizzo <strong>inizi </strong>almeno con una lettera (maiuscola o minuscola) o con un numero. Vengono <strong>esclusi </strong>i caratteri con cui non può iniziare l&#8217;email.</p>
<p>La <strong>seconda parte</strong> è un po&#8217; più complicata:</p>
<ul>
<li>vengono definiti tutti i <strong>caratteri accettati</strong> dall&#8217;email</li>
<li>corrisponde a un punto seguito da a-z, A-Z, 0-9, &#8211; o 0</li>
<li>il codice &#8220;\.?&#8221; indica che i successivi caratteri possono (opzionalmente) essere preceduti da <strong>un solo punto</strong></li>
<li>la parte <code>[a-zA-Z0-9\-\_]</code> è seguita dal <strong>carattere +</strong> perché deve essere trovato un carattere del tipo a-z, A-Z, 0-9, &#8211; o 0 almeno una volta</li>
<li>viene racchiusa nelle <strong>parentesi tonde</strong> e seguita dal <strong>carattere *</strong> per impostare la condizione in base alla quale la seconda parte può essere presente facoltativamente</li>
</ul>
<h3>Pattern per il &#8220;domain name&#8221;</h3>
<p><img class="aligncenter size-full wp-image-479" title="Pattern per il domain name" src="http://jblog.it/wp-content/uploads/2009/05/domain_pattern1.png" alt="Pattern per il domain name" width="563" height="212" /></p>
<p>La <strong>prima parte</strong> impone che l&#8217;indirizzo <strong>inizi </strong>almeno con una lettera (maiuscola o minuscola) dell&#8217;alfabeto inglese. Vengono <strong>esclusi </strong>i caratteri con cui non può iniziare un nome di dominio.</p>
<p>Nella <strong>seconda parte</strong>, come per la &#8220;local part&#8221;:</p>
<ul>
<li>vengono definiti tutti i <strong>caratteri accettati</strong> dall&#8217;email</li>
<li>corrisponde a un punto seguito da a-z, A-Z, 0-9, &#8211; o 0</li>
<li>il codice &#8220;\.?&#8221; indica che i successivi caratteri possono (opzionalmente) essere preceduti da <strong>un solo punto</strong></li>
<li>la parte <code>[a-zA-Z0-9\-\_]</code> è seguita dal <strong>carattere +</strong> perché deve essere trovato un carattere del tipo a-z, A-Z, 0-9, &#8211; o 0 almeno una volta</li>
<li>viene racchiusa nelle <strong>parentesi tonde</strong> e seguita dal <strong>carattere *</strong> per impostare la condizione in base alla quale la seconda parte può essere presente facoltativamente</li>
</ul>
<p>La <strong>terza parte</strong> impone la presenza di un punto fra il nome del dominio e il codice del dominio di primo livello. In pratica, se il dominio è example.com, il punto di cui si impone la presenza è quello che si trova fra example e com.</p>
<p>L&#8217;<strong>ultima parte</strong> stabilisce il formato del codice del dominio di primo livello. Questo deve essere composto da <strong>almeno due caratteri</strong> e da sole lettere (del tipo a-z e A-Z) dell&#8217;alfabeto inglese.</p>
<h3>Lunghezza della &#8220;local part&#8221; e del &#8220;domain name&#8221;</h3>
<p>Purtroppo non è possibile imporre la lunghezza totale dei due segmenti (o almeno io non ci sono riuscito).</p>
<p>Scrivendo <code>(\.?[a-zA-Z0-9\-\_]){0,63}</code> la condizione <code>{0,63}</code> viene attribuita sia <code>\.</code> sia a <code>[a-zA-Z0-9\-\_]</code>. Quindi, l&#8217;indirizzo email risulterà troppo lungo se sia i punti sia i restanti caratteri corrispondenti a <code>[a-zA-Z0-9\-\_]</code> saranno più di 63. Ecco cosa succederebbe:</p>
<ul>
<li><code>punti&lt;=63, caratteri&lt;=63</code>: indirizzo ok</li>
<li><code>punti&gt;=63, caratteri&lt;=63</code>: indirizzo errato</li>
<li><span class="highlight_red"><code>punti&lt;=63, caratteri&gt;=63</code>: indirizzo ok<em> (non è ciò che vogliamo)</em></span></li>
<li><code>punti&gt;=63, caratteri&gt;=63</code>: indirizzo errato</li>
</ul>
<p>Il <strong>terzo caso</strong> non va bene a causa dei controlli sul numero dei caratteri. Infatti, se i caratteri sono più di 63 l&#8217;indirizzo email viene considerato corretto.</p>
<p>Ho fatto diverse prove ma ho sempre avuto esiti negativi. Come ho detto prima, probabilmente non ci sono riuscito io.</p>
<p><span class="highlight_green">Sono ben accetti suggerimenti e soluzioni alternative.</span></p>
<h4>La mia soluzione</h4>
<p>In seguito vedremo che per controllare se i due segmenti rispettano le dimensioni massime, rispettivamente 64 e 255, si possono scrivere un paio di righe di codice per:</p>
<ul>
<li>dividere l&#8217;indirizzo email in due in corrispondenza della @</li>
<li>controllare la lunghezza di ciascuna stringa</li>
</ul>
<h3>Accettare i caratteri speciali</h3>
<p>Per fare in modo che la tua funzioni accetti alcuni o tutti i caratteri speciali basterà sostituire la stringa <code>[a-zA-Z0-9\-\_]</code> (presente nella &#8220;local part&#8221;) con la stringa <code>[a-zA-Z0-9\-\_</code><code>\!\#\$\%\&amp;\'\*\+\/\=\?\^\`\{\|\}\~</code><code>]</code>.</p>
<p>Se non vuoi accettare alcuni caratteri bisogna eliminare il carattere speciale e il &#8220;\&#8221; che lo precede.</p>
<h2>Codice Javascript</h2>
<pre lang="js">function isEmail(string)
{
	/* Confronta la stringa con il pattern RegEx */
	if(string.search(/^[a-zA-Z0-9]+(\.?[a-zA-Z0-9\-\_]+)*\@[a-zA-Z]+(\.?[a-zA-Z0-9\-\_]+)*\.[a-zA-Z]{2,}$/)==-1)
	return false;

	/* Divide l'indirizzo in due parti: "local part" e "domain name" */
	var parts = string.split("@");

	/* Controlla se "local part" supera i 64 caratteri */
	if(parts[0].length&gt;64) return false;

	/* Controlla se "local part" supera i 255 caratteri */
	if(parts[1].length&gt;255) return false;

	return true;
}</pre>
<h2>Codice PHP</h2>
<pre lang="php">function isEmail($string)
{
	/* Confronta la stringa con il pattern RegEx */
	if(!eregi("[a-zA-Z0-9]+(\.?[a-zA-Z0-9\-\_]+)*\@[a-zA-Z]+(\.?[a-zA-Z0-9\-\_]+)*\.[a-zA-Z]{2,}$",$string))
	return false;

	/* Divide l'indirizzo in due parti: "local part" e "domain name" */
	$parts = explode("@",$string);

	/* Controlla se "local part" supera i 64 caratteri */
	if(strlen($parts[0])&gt;64) return false;

	/* Controlla se "local part" supera i 255 caratteri */
	if(strlen($parts[1])&gt;255) return false;

	return true;
}</pre>
<h2>Demo e download</h2>
<p>Per vedere lo script vai su <a href="http://test.jblog.it/email_checker/email_checker.txt" target="_blank">http://test.jblog.it/email_checker/email_checker.txt</a></p>
<p>Per vedere una demo vai su <a href="http://test.jblog.it/email_checker/" target="_blank">http://test.jblog.it/email_checker/</a></p>
<p>Per scaricare l’esempio vai su <a href="http://download.jblog.it/email_checker.zip" target="_blank">http://download.jblog.it/email_checker.zip</a></p>
<h2>Conclusione</h2>
<p>Le espressioni regolari sono un potente strumento, ma <strong>fanno lavorare la cpu</strong>.</p>
<p>Quindi, ti consiglio di utilizzare le espressioni regolari solo quando la stringa da controllare ha un <strong>formato complesso</strong> come, appunto, un indirizzo email o un numero di telefono. Se invece devi verificare che contenga solo caratteri numerici è meglio ricorrere a funzioni che controllano carattere per carattere.</p>
<p>Per quanto riguarda le funzioni email, personalmente le ritengo buone ma non le migliori. Le ho provate e sembrano funzionare adeguatamente. Per qualsiasi errore o malfunzionamento io sono qui&#8230; <span class="highlight_green">Sono graditi consigli, critiche e opinioni in genere.</span></p>
<h2>Crediti</h2>
<p><a title="Wikipedia" href="http://en.wikipedia.org/" target="_blank">Wikipedia (english)</a> &#8211; <a title="E-mail address" href="http://en.wikipedia.org/wiki/E-mail_address" target="_blank">E-mail address</a></p>
<p>Foto1 &#8211; <a href="#"><span style="text-decoration: line-through;">Formatear cadenas de Texto/String como númericas con o sin decimales – Regex – Expresiones Regulares</span></a></p>
<img src="http://jblog.it/?ak_action=api_record_view&id=468&type=feed" alt=" Controllare il formato di un indirizzo email con le espressioni regolari (RegEx) in PHP e Javascript"  title="Controllare il formato di un indirizzo email con le espressioni regolari (RegEx) in PHP e Javascript" />]]></content:encoded>
			<wfw:commentRss>http://jblog.it/2009/05/20/controllare-formato-indirizzo-email-espressioni-regolari-regex-php-javascript_468.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
