Author Archive for stefo

Integrare un feed RSS ad un sito php

Le premesse teoriche sono:

  • hai un sito con una sezione che viene aggiornata più o meno regolarmente, ad esempio vengono postate delle notizie, o vengono inseriti dei prodotti
  • vuoi creare un sistema di feed così che gli utenti possano essere a conoscenza degli aggiornamenti senza necessariamente doversi ricordare di visitare il sito
  • decidi di creare il Feed RSS per le notizie

Le premesse tecniche sono:

  • hai un sito sviluppato con php e mysql
  • il database mysql utilizzato si chiama "basedati"
  • la tabella interessata si chiama "news"...
  • ... e contiene i campi "id, titolo, articolo, data_pubblicazione"

Ecco l'esempio, ampiamente perfezionabile, di come creare un Feed.
Crei un unico file e lo chiami ad esempio rss.php, dentro metti:
- una prima funzione che serve per ripulire il testo da eventuali caratteri poco graditi al linguaggio XML... il linguaggio del Feed RSS appunto. Questo riportato è un esempio, è possibile fare meglio ovviamente.

PHP:
  1. function rss_cleaner($text){
  2. $text=utf8_encode(rtrim(ltrim(str_replace(array("’",">","<","\"","\n","\r","\t","<br />","<br>","<BR>","&nbsp;","  ")," ",$text))));
  3. $text=str_replace(array("&"),"e",$text);
  4. return $text;
  5. }

- l'intestazione del Feed

PHP:
  1. header("Content-type: text/xml; charset=utf-8");
  2. echo "<rss version=\"2.0\" xmlns:atom=\"http://www.w3.org/2005/Atom\">\n";
  3. echo "<channel>\n";
  4. echo "<title>Il titolo del mio sito</title>\n";
  5. echo "<link>http://www.ilmiosito.com</link>\n";
  6. echo "<description>Una breve descrizione del sito o del feed</description>\n";
  7. echo "<copyright> Copyright 2009 ilmiosito.com </copyright>\n";
  8. echo "<docs>http://blogs.law.harvard.edu/tech/rss</docs>\n";
  9. echo "<managingEditor>managingmail@ilmiosito.com (stefo)</managingEditor>\n";
  10. echo "<webMaster>wmmail@ilmiosito.com (stefo)</webMaster>\n";
  11. echo "<language>IT-it</language>\n";

- ed infine la lettura degli articoli e la stampa sul file

PHP:
  1. $db_host="miohostmysql"; // l'host mysql al quale mi connetto
  2. $db_user="miousermysql"; // il mio utente mysql
  3. $db_pass="miapassmysql"; // la mia password mysql
  4.  
  5. // ora mi connetto e seleziono il database
  6. $connection=mysql_connect($db_host,$db_user,$db_pass);
  7. mysql_select_db($db_db,$connection);
  8.  
  9. // seleziono le ultime 10 notizie pubblicate e le stampo in formato XML con un ciclo while
  10. $query="select * from news ORDER BY ID DESC LIMIT 10";
  11. $result = mysql_query($query);
  12. while($print = mysql_fetch_array($result)) {
  13.  
  14. $titolo=rss_cleaner($print['titolo']);
  15. $articolo=rss_cleaner($print['articolo']);
  16. $id=rss_cleaner($print['ID']);
  17. $data_pubblicazione=$print['data_pubblicazione'];
  18. $data_pubblicazione = strtotime ($data_pubblicazione); // trasformo la data in Unix timestamp
  19. $data_pubblicazione=date(r,$data_pubblicazione); // formatto la data secondo la RFC 822 gradita da XML
  20.  
  21. // parte la stampa
  22. <item>
  23. <title>$titolo</title>
  24. <link>http://www.ilmiosito.com/articolo.php?ID=$id</link>
  25. <guid isPermaLink=\"false\">http://www.ilmiosito.com/articolo.php?ID=$id</guid>
  26. <pubDate>$data_pubblicazione</pubDate>
  27. <description>$articolo</description>
  28. </item>
  29. ";
  30.  
  31. }
  32. </channel>
  33. </rss>
  34. ";

Il Feed a questo punto è pronto, ultimi accorgimenti sono:
- indicare l'esistenza del Feed nelle intestazioni di pagina, prima della chiusura del tag head

PHP:
  1. <link rel="alternate" type="application/rss+xml" title="RSS 2.0" href="http://www.ilmiosito.com/rss.php" />
  2. </head>

e controllare la validità del Feed stesso: http://feedvalidator.org/

Pari e dispari

Per verificare se un numero è pari o dispari, devi usare l'operatore di modulo "%".

PHP:
  1. <?PHP
  2. $numero=5;
  3. if ($numero % 2 == 0) {
  4.     echo $numero.' è un numero pari';
  5. } else {
  6.     echo $numero.' è un numero dispari';
  7. }
  8. ?>

Questo semplice script ti restituirà a video il messaggio "5 è un numero dispari".

Poter gestire i numeri in questo modo torna utile ad esempio se devi creare una tabella con le righe con colore di sfondo alternato.
In questo esempio una tabella costruita con un ciclo for alterna una riga grigia ad una riga bianca, per 10 righe complessive:

PHP:
  1. <?PHP
  2. echo "<table width=\"770\">\n";
  3. for ($counter=1; $counter<=10; $counter++)
  4. {
  5.     if ($counter % 2 == 0) {
  6.         $color="#CCCCCC";
  7.     } else {
  8.         $color="#FFFFFF";
  9.     }
  10.     echo "<tr><td bgcolor=\"$color\"> Riga $counter </td></tr>\n";
  11. }
  12. echo "</table>\n";
  13. ?>

Una classe per la gestione di database mysql

Questa classe segnalata e realizzata da Flaz è utilissima per la gestione di database mysql. Il post illustra tutta una serie di esempi per un pratico e corretto utilizzo.

Gestione della connessione MySQL in PHP: la mia classe

Generalizzare mysql_escape_string

Con le nuove versioni di php è stato prima deprecato e poi eliminato il parametro Magic Quotes. Questo parametro, quando impostato su ON, aggiungeva automaticamente il carattere escape - \ - ove necessario nei dati in arrivo via post, get o cookie.
Più semplicemente, se da una pagina all'altra mandavi una variabile, da aggiungere su database mysql, di questo tipo:

PHP:
  1. $var="L'uno per l'altro, con l'altro, contro l'altro";

il contenuto della variabile veniva automaticamente convertito in:
"L\'uno per l\'altro, con l\'altro, contro l\'altro".
Con il Magic Quotes impostato su OFF, o assente, ovviamente questo non succede più e ciò significa che questa operazione va fatta fare di volta in volta, altrimenti, per intenderci, la query di inserimento su database restituisce un warning o tronca la stringa al primo apice (se non ricordo male).
Per ovviare a questa cosa si usa la funzione mysql_escape_string($unescaped_string) in questo modo:

PHP:
  1. $var = mysql_escape_string($var)

Fatto questo la variabile può tranquillamente essere utilizzata.
Quindi...
Se devi scrivere un codice ex-novo nessun problema.
Ma...
Il problema nasce quando hai un codice già scritto da trasferire su un server che non prevede le Magic Quotes. Dovresti prendere una ad una tutte le variabili che interessano inserimenti/aggiornamenti su database e "mysql_escape_string-arle".
In alternativa come fare?
Un metodo potrebbe essere quello di includere all'inizio di ogni file php (magari sfruttando un'inclusione già esistente) il seguente piccolo script:

PHP:
  1. foreach ($_POST as $key => $value)
  2. $$key = mysql_escape_string($value);

In questo modo tutte le variabili passate in POST verranno "mysql_escape_string-ate" in automatico.

Rinominare un file in upload

Quella di rinominare un file in upload è una cosa che può essere molto utile fondamentalmente per 2 motivi:

  1. evitare di sovrascrivere file esistenti che hanno lo stesso nome
  2. evitare errori di upload dovuti a caratteri strani presenti nel nome del file

io uso un metodo molto semplice, in fase di upload, rilevo l'estensione del file con questa mia funzione, e le antepongo un nome univoco, utilizzando la funzione uniqid(pref).
Tale funzione oltre che restituire una stringa univoca permette si assegnare una sorta di prefisso, utile per identificare ad esempio i file di diverse sezioni di un sito (es. home_474ab038b3bbe.jpg)
Quindi, il solito form invierà il file da uplodare a upload.php

PHP:
  1. <form method="post" action="upload.php" enctype="multipart/form-data">
  2.     <input type="file" name="file_da_uplodare">
  3.     <input type="submit" value="Invia">
  4. </form>

... a seguire il file upload.php nel quale includo anche la funzione per rinominare il file, riceverà il file, lo rinominerà e lo uploderà.

PHP:
  1. <?php
  2.  
  3. function estensione($nome){
  4.     $trova_punto = explode(".", $nome);
  5.     $estensione = $trova_punto[count($trova_punto) - 1];
  6.     $estensione = strtolower($estensione);
  7.     if (isset($trova_punto[1]) == FALSE){
  8.         return "Nessuna estensione";
  9.     }
  10.     return $estensione;
  11. }
  12.  
  13. // directory dove va uplodato il file
  14. $directory = 'directoryupload/';
  15.  
  16. // verifica l'esistenza del file
  17. if (isset($_FILES['file_da_uplodare'])) {
  18.     $file_temporaneo= $_FILES['file_da_uplodare']['tmp_name'];
  19.     $nome_file = $_FILES['file_da_uplodare']['name'];
  20.  
  21.         // trova l'estensione del file
  22.         $estensione_file=estensione($nome_file);
  23.         // assegna un nome univooco al file
  24.         $nome_file=uniqid(file_).".".$estensione_file;
  25.  
  26.         //esegue l'upload e controlla che vada a buon fine
  27.     if (move_uploaded_file($file_temporaneo, $directory  . $nome_file)){
  28.         echo "Il file è stato caricato";
  29.     } else {
  30.         echo "Si è verificato un errore durante l'upload";
  31.     }
  32. }
  33. ?>

La pagina Web è scaduta, evitarlo

Usando il tasto "back" del browser per tornare ad una pagina che precedentemente aveva ricevuto dati da un modulo POST, noterai che, con Explorer ti comparirà una pagina bianca con su la scritta "La pagina Web è scaduta", mentre Firefox ti chiederà di re-inviare i dati.
In entrambi i casi si tratta di aggiornare la pagina.
Di fatto non è un problema, ma può esserlo se lo è per il cliente al quale stai sviluppando il sito.
Come puoi evitarlo?
Metti questo all'inizio della pagina.

PHP:
  1. header('Cache-Control: Private');

Amministrare database mysql: phpMyAdmin

Le prime volte che mi cimentavo con php e mysql, con tutta la mia ingenuità, costruivo i database con la riga di comando. La cosa, soprattutto all'inizio risulta abbastanza laboriosa.
Ovviamente qualcuno aveva già pensato ad un modo più veloce per gestire i database mysql. Fortuna me ne sono accorto in fretta.
phpmyadmin

phpMyAdmin è un'applicazione PHP libera che consente di amministrare in modo semplificato database di MySQL tramite un qualsiasi browser. L'applicazione è indirizzata sia agli amministratori del database, sia agli utenti gestisce i permessi prelevandoli dal database MySQL.

PhpMyAdmin permette di creare un database da zero, creare le tabelle ed eseguire operazioni di ottimizzazione sulle stesse. Presenta un feedback sulla creazione delle tabelle per evitare eventuali errori. Sono previste delle funzionalità per l'inserimento dei dati (popolazione del database), per le query, per il backup dei dati, ecc..

via wikipedia

Contatore di accessi su un file txt

Prendendo spunto da una chiave di ricerca utilizzata per arrivate su phpinpillole.com, ti propongo un semplice contatore di accessi basato su un file di testo.
Le funzioni che è necessario conoscere, per le quali ti rimando direttamente a php.net, riguardano la manipolazione dei file e sono:

La sintassi del contatore è molto semplice:
apre il file, ne legge il contenuto (numero), aggiunge un +1 al numero esistente, restituisce il numero nuovo e lo scrive sul file.

PHP:
  1. $file_counter="count.txt";
  2. if(!($fp = fopen($file_counter, "r"))) die ("Non riesco ad aprire $file_counter");
  3. $counter =(int) fread($fp, 20);
  4. fclose($fp);
  5. $counter++;
  6. echo "Ciao, sei il visitatore numero $counter";
  7. $fp = fopen($file_counter, "w");
  8. fwrite($fp, $counter);
  9. fclose($fp);

Connettersi ad un database mysql

Partendo dal presupposto che un database già lo hai, vediamo cosa devi fare per connettertici così da porterlo poi utilizzare negli script.
Per prima cosa definiamo i dati necessari alla connessione

PHP:
  1. $db_host="localhost";
  2. $db_user="utente";
  3. $db_pass="password";
  4. $db_name="nome_database";

L'host è "l'indirizzo" da cui si può raggiungere MySQL.
User e Pass sono rispettivamente nome e password dell'utente che ha accesso a quel servizio mysql.
Ed infine il nome del database
Ora ci possiamo connettere al mysql con la funzione mysql_connect verificandone l'eventuale errore

PHP:
  1. $db_conn = mysql_connect($db_host,$db_user,$db_pass)   
  2.     or die("Errore nella connessione, verificare i parametri: " . mysql_error());

ed infine selezionare il database cone la funzione mysql_select_db. Anche qui possiamo verificare l'eventuale errore

PHP:
  1. mysql_select_db($db_name, $db_conn)
  2.     or die ("Errore nella selezione del database, verificare i parametri: " . mysql_error());

Appunti: per chiudere la connessione utilizzare mysql_close($db_conn);

Tenere traccia dei download con la mail

Con poche righe di script è possibile tenere traccia di chi decide di scaricare un file da un nostro sito. Interessante ad esempio nel caso in cui si dà la possibilità di scricare un progetto che richiederà aggiornamenti futuri. Ad esempio può essere utile chiedere la mail all'utente che decide di scaricare il file, con un form del genere...

HTML:
  1. <form name="DownloadForm"  method="post" action="download.php">
  2.   You Email<input name="email_utente" type="text"><br>
  3.   <input type="submit" name="Submit" value="Download">
  4.   <input name="file" type="hidden"  value="nomefile.zip">
  5. </form>

... che punta al file download.php (simile a questo) il quale si occuperà di far scaricare il file ed inviare la mail dell'avvenuto download.

PHP:
  1. <?php
  2. // recupero i dati e definisco le variabili
  3. $file=$_POST['file'];
  4. $email_utente=$_POST['email_utente'];
  5. $mia_email="mia@email.com";
  6. $oggetto="Download File";
  7. $corpo="Il File ".$file." è stato scaricato da ".$email_utente;
  8.  
  9. // mi invio la mail
  10. mail($mia_email, $oggetto, $corpo);
  11.  
  12. // faccio scaricare il file
  13. $percorso="/var/percorso/directory/download/";
  14. $percorso_file=$percorso.$file;
  15. $dimensione_file=filesize($percorso_file);
  16. header("Content-Type: application; name=".$file);
  17. header("Content-Transfer-Encoding: binary");
  18. header("Content-Length: ".$dimensione_file);
  19. header("Content-Disposition: inline; filename=".$file);
  20. header("Expires: 0");
  21. header("Cache-Control: no-cache, must-revalidate");
  22. header("Cache-Control: private");
  23. header("Pragma: public");
  24. readfile($percorso_file);
  25. ?>

Appunti: implementare eventuali controlli