Category Archives: Php

E-commerce: Google Shopping e osCommerce

Pubblicato da

E-commerce: Google Shopping e osCommerce

E’ da inizio mese che Google Shopping ha fatto il suo ingresso anche in Italia.
Utilizzando il motorone di Mountain View sarà possibile navigare e cercare tra i prodotti di proprio interesse, pubblicati dai vari merchant.
Una grande e scomoda concorrenza per tutti quei portali che offrono servizi di comparazione prezzi.
Ecco alcuni link utili per approfondire:

Inviare l’elenco dei prodotti presenti nel proprio e-commerce non è difficile, basta estrarre tutti i record e seguire alcune linee guida.

Un mio cliente che aveva una versione vecchia ma personalizzata di osCommerce desiderava essere presente in Google Shopping.
Ci sono alcuni plugin che permettono di interfacciarsi con Google Shopping ma li ho trovati macchinosi e, spesso, difficili da configurare.
Ho scelto, così, come metodo di invio dei dati, la pubblicazione del datafeed sotto forma di file di testo scritto da uno script PHP.

Nota bene che c’è un set di dati obbligatori da estrarre dal db e inserire nel datafeed (vedi qui) e altri che sono consigliati.
AGGIORNAMENTO: Il valore MPN è diventato praticamente obbligatorio

Lo condivido sperando che possa essere utile a qualcun altro.

<?php
// connessione
$dbhost = ‘tuohost’;
$dbuser = ‘tuouser’;
$dbpass = ‘tuapass’;

$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die (‘Error connecting to mysql’);

$dbname = ‘nometuodb’;
mysql_select_db($dbname);

$query = ”
select p.products_id,
pd.products_name,
pd.products_description,
manufacturers.manufacturers_name as mfgName,
manufacturers.manufacturers_id,
p.products_price,
p.products_image,
p.products_weight,
p.products_quantity
from products p
left join products_description pd on p.products_id = pd.products_id
left join manufacturers on manufacturers.manufacturers_id = p.manufacturers_id
where p.products_status = ‘1’ and p.products_quantity > ‘0’ order by p.products_id”;

// nome del file txt. Il nome può essere uno qualsiasi
$datafile=”miodominio-googlebase.txt”;

// lancio la query
$products_query = mysql_query($query);

// apro il file per scriverci
$file = fopen($datafile, “w”);

// scrivo le intestazioni dei dati che voglio inviare.
// Il separatore predefinito che ho scelto è il tab
$file_header = “id\tcondizione\tlink\ttitolo\tmarca\tdescrizione\tprezzo\tpeso spedizione\tlink_immagine\tquantit&agrave;\tmpn\n”;
fwrite($file, $file_header);

// ciclo attraverso i risultati per scrivere il datafeed
while ($products = mysql_fetch_array($products_query)) {

// i maggiori problemi sono dati dai caratteri della descrizione del prodotto
// la “pulizia” avviene in due passaggi
$descr_clean = preg_replace(“/^[^a-z0-9]?(.*?)[^a-z0-9]?$/i”, “$1”, strip_tags($products[‘products_description’]));

$_strip_search = array(
“![\t ]+$|^[\t ]+!m”, // rimuove spazi avanti e dietro che possono essere confusi con i tab
‘%[\r\n]+%m’); // rimuove a capo
$_strip_replace = array(
”,
‘ ‘);
$_cleaner_array = array(“>” => “> “, “&reg;” => “”, “®” => “”, “&trade;” => “”, “™” => “”, “\t” => “”, ”    ” => “”); //rimuove caratteri speciali

$descr_clean = preg_replace($_strip_search, $_strip_replace, strip_tags(strtr($products[‘products_description’], $_cleaner_array)));

// cerco se esiste l’immagine del prodotto altrimenti metto il no_image.png (questo file può variare da installazione a installazione di osCommerce)
if(!file_exists(“images/”.$products[‘products_image’])) {
$image = “http://www.miodominio.com/images/no_image.png”;
} else {
$image = “http://www.miodominio.com/images/”.$products[‘products_image’];
}

$price = number_format($products[‘products_price’], 2, ‘.’, ”); //formattazione euro

$prod_line = $products[‘products_id’].”\tnuovo\thttp://www.miodominio.com/product_info.php?products_id=”.$products[‘products_id’].”\t”.$products[‘products_name’].”\t”.$products[‘mfgName’].”\t”.substr($descr_clean, “0”, “400”).”\t”.$price.”\t”.$products[‘products_weight’].”\t”.$image.”\t”.$products[‘products_quantity’].”\t”.$products[‘products_id’].”\n”;

$line_to_write = htmlentities($prod_line);

fwrite($file, $line_to_write);
}

fclose($file);
?>

Lanciando questo script che io ho chiamato datafeedgoogle.php si crea un file di testo (miodominio-googlebase.txt) che poi deve essere segnalato nel pannello merchant di Google.
Ovviamente si può settare un cron job sul server in modo che ogni sera venga lanciato lo script per la creazione del file txt.
In questo modo, nello stesso pannello di configurazione del merchant, potremo segnalare che l’aggiornamento dei prodotti avviene giornalmente.

Link: Google Shopping

Scarica il file dell’esempio

Google Shopping
Google Merchant Center
la guida al Google Merchant Center
il blog di Google Merchant Center center
il punto di partenza per

MySQL: contare le occorrenze tra i valori di un campo

Pubblicato da

Talvolta si fa un uso eccessivo di PHP anche quando basterebbero gli strumenti messi a disposizione dal linguaggio SQL.
Un esempio è quando si vogliono contare le occorrenze di un determinato valore all’interno delle diverse righe di un campo.
Con PHP siamo abituati a creare un contatore ed a stampare la variabile ma possiamo fare tutto con SQL.
Riprendo l’esempio che ho trovato sul web

person vote
obama yes
mccain no
obama yes
obama no
mccain yes
obama yes
obama yes
obama no
mccain no

Il codice SQL che compie il lavoro è

SELECT person,
SUM(IF(vote = "yes", 1,0)) AS `yes_votes`,
SUM(IF(vote = "no", 1,0)) AS `no_votes`,
COUNT(vote) AS `total`
FROM votes
GROUP BY person
ORDER BY yes_votes DESC

Il risultato è

person yes_votes no_votes total
obama 4 2 6
mccain 1 2 3

La parte comoda del codice SQL risiede in quel ..SUM(IF.. che ci evita di creare un loop in PHP a valle della query per il conteggio.

via Random Snippets

Implementazione Javascript dei pre-processori CSS

Pubblicato da

Implementazione Javascript dei pre-processori CSS

I pre-processori CSS sono strumenti che estendono le potenzialità dei CSS. Due tra i più utilizzati sono LESS e SASS.
Queste librerie permettono di aggiungere variabili e classi, effettuare operazioni e nidificare i CSS.
Sia LESS che SASS devono però essere installate sul server per poter essere utilizzate.
Inizialmente LESS e SASS erano stati sviluppati come gem Ruby ma attualmente esistono dei porting per PHP.NET.

Per chi volesse cimentarsi nei pre-processori CSS ma non vuole chiamare in causa Ruby, PHP o .NET, è stata realizzata una libreria .js che sostituisce le installazioni.
Secondo lo sviluppatore, questa libreria permette di essere fino a 40 volte più veloce (anche nei browser non di ultima generazione).
L’unica accortezza è quella di inserire il file LESS prima dell’inclusione alla libreria javascript

<link rel="stylesheet/less" href="/stylesheets/main.less" type="text/css" />
<script src="http://lesscss.googlecode.com/files/less-1.0.21.min.js"></script>

Lo sviluppo è ancora agli inizi ma promette bene. Tutto nell’ottica di un utilizzo più semplice di questo strumento di estensione delle capacità dei “vecchi” CSS

Link: Less.js

Errore PHP: Cannot modify header information – headers already sent

Pubblicato da

Errore PHP: Cannot modify header information – headers already sent

E’ stato scritto tantissimo su questo comune errore PHP ma, in giro, ho notato che non c’è quasi mai una trattazione completa.

In primis diciamo che è un problema che sorge quando si usano funzioni di sessione del tipo session_start(), oppure funzioni di modifica delle intestazioni come header(), oppure ancora quando settiamo i cookie con setcookie().
Le cause:

  • Abbiamo usato una delle sopra citate funzioni dopo il tag <html> o comunque dopo aver impostato un output
  • Una linea bianca prima del tag di apertura <?php , anche un semplice spazio bianco, rappresenta un output
  • Nel file è incluso un BOM. Una piccola sequenza di byte che viene posizionata all’inizio di un flusso di dati di puro testo per indicarne il tipo di codifica Unicode

Soluzioni:

  • Le funzioni sopra citate vanno messe in testa al file PHP. Prima di qualsiasi altro codice.
  • Cancellare qualsiasi spazio bianco prima del tag di apertura. Potrebbe non essere uno spazio vuoto ma venire codificato dall’interprete PHP
  • Salvare il file con codifica UTF-8 senza BOM. Un buon editor come Notepad++ permette di farlo con semplicità.
  • Settare in php.ini il valore output_buffering=4096 (usarlo solo se necessario in quanto si rallenta il processo di output)
  • Iniziare lo script PHP con la funzione ob_start() (alternativo alla soluzione precedente) che attiva l’output_buffering senza stabilirne la grandezza

Link: funzioni di controllo del output in PHP

Comparazione framework

Pubblicato da

Comparazione framework

La necessità di “non inventare la ruota” ogni volta che si mette mano ad un progetto ha dato impulso alla nascita e allo sviluppo dei framework.
Esistono framework per quasi tutti i linguaggi e settori della programmazione.
Quelli più famosi ed utilizzati riguardano PHP, Ruby, Javascript e CSS (di meno quelli per Python e Java).

Per comparare i framework e scegliere quello che meglio risponde alle esigenze dello sviluppatore possiamo dare un’occhiata a Bestwebframeworks.
In una sola schermata è possibile comparare le caratteristiche più importanti dei vari framework.
Cliccando sui nomi si accede ad una scheda con maggiori dettagli.

Tramite form è poi possibile segnalare ai gestori del sito nuovi framework da comparare.

Link: Bestwebframeworks

Creare PDF da pagina web e RSS

Pubblicato da

Creare PDF da pagina web e RSS

Un progetto interessante in PHP5 per convertire all’istante pagine web in file in formato PDF.
Si potrebbe dire che per fare lo stesso basta stampare in PDF con la stampante virtuale.
Tutta via questo script fa di più formattando e convertendo anche i contenuti del feed RSS direttamente in un file, lo sappiamo, facilmente trasportabile e leggibile anche off-line.

In aggiunta, si possono creare bookmarklet come pulsanti per la creazione al volo di PDF indipendentemente dalla pagina web che stiamo visitando.
Ad esempio questo è il link per convertire l’RSS di questo blog in PDF (c’è qualche problema con i feed creati al volo come con WordPress).

Link: RSS to PDF Newspaper

Il miglior file manager in PHP

Pubblicato da

Il miglior file manager in PHP

Può capitare di non poter utilizzare il proprio client FTP o una shell di comando per operare su file e cartelle di un server Apache.
Normalmente, però, l’utente www-data ha diritti simili a quelli amministratore e, soprattutto, riesce a effettuare operazioni su file e cartelle come: cambio dei permessi, rinomina, spostamento, cancellazione ecc.

In questi casi si può installare un manager di file in PHP in modo che si possa agire sui file tramite l’utente www-data.
Ho provato diversi manager in PHP dotati di interfacce e  fuzionalità più o meno avanzate.
Quello che mi ha convinto di più è però PHPFileNavigator arrivato alla versione 2.

Veramente completo e semplice da installare, è dotato di un’interfaccia intuitiva con navigazione ad albero che imita l’organizzazione del server.
Le opzioni per ogni file sono veramente tante e ricoprono ogni possibile esigenza di un amministratore di server web.
E’ possibile anche effettuare upload e modificare online il file stesso tramite un text editor.
Ottimo.

Link:  PHPFileNavigator

Aggiungere funzionalità a Google Maps con Geocubes

Pubblicato da

Le mappe di Google sono una grande risorsa per gli sviluppatori. Sono utilizzate per i più svariati motivi: dai siti di agenzie immobiliari a quelli di segnalazione ristoranti.
La personalizzazione tramite API (Application Programming Interface) permette di aggiungere nuovi modi di utilizzo. I marker, ad esempio, permettono di individuare geograficamente punti di interesse (o geo-punti), fornendo anche informazioni aggiuntive.
Ma se questi iniziano a diventare numerosi? Il rischio è quello di creare confusione e di non fornire più un servizio utile.
Geocubes permette di risolvere questo problema suddividendo le macroaree in quadrati che indicano il numero di geo-punti inclusi.

Tramite javascript Geocubes sovrappone un layer sulla mappa di Google modificando visivamente le informazioni sui marker

Aggiungere funzionalità a Google Maps con Geocubes

Il layer di Geocubes e la mappa di Google si caricano in parallelo evitando lentezze di sorta. L’unica condizione è quella di mantenere le coordinate sui punti di interesse sui server di Geocubes.
A disposizione degli sviluppatori ci sono le API dell’applicazione e una libreria PHP che permette di inserire, modificare e eliminare i geo-punti.
Fino al 28 febbraio 2009 tutto è completamente gratuito. Poi la gratuità rimarrà fino a 10.000 geo- punti.

Link: Geocubes

I temi WordPress e la decodifica di eval gzinflate base64_decode

Pubblicato da

Sto utilizzando spesso WordPress come base di partenza per alcuni lavori “semplici”. La grafica la attingo dall’enorme serbatoio di temi gratuiti che è possibile trovare su web.
Nei temi è frequente trovare il file functions.php che aggiunge funzioni al normale set di WP.
I creatori (o anche i semplici modificatori) di temi inseriscono queste funzioni per gestire da remoto i backlink che compaiono, ad esempio, nel footer e che possono essere usati anche per pubblicità, SEO ecc.
Alcuni di questi link sono assolutamente leciti, quando riportano gli autori del tema ma spesso ci si ritrova a sponsorizzare siti pornografici o che contengono codice maligno.
E’ importante quindi dare un’occhiata al codice e nel caso modificarlo.
Nel file functions.php il codice è, però, camuffato per mezzo di una funzione. Ossia ci troviamo di fronte a qualcosa del genere

eval(gzinflate(base64_decode(‘DdFHrqNYAEDRrfSsqsQA/AgGlXpAMCYaTHrApEXOObP6/ju4Oj
fbo/Z3cVd93kZr9juOlowi/kuzZEiz37+EVJHm6RO
….

Vediamo come fare per renderla in chiaro

Creiamo un file decodifica.php

<?php
echo “1. Leggo codificato.txt\n”;
$fp1 = fopen (“codificato.txt”, “r”);
$contents = fread ($fp1, filesize (“codificato.txt”));
fclose($fp1);
echo “2. Decodifico\n”;
while (preg_match(“/eval\(gzinflate/”,$contents)) {
$contents=preg_replace(“/<\?|\?>/”, “”, $contents); eval(preg_replace(“/eval/”, “\$contents=”, $contents)); } echo “3. Scrivo su decodificato.txt\n”; $fp2 = fopen(“decodificato.txt”,”w”); fwrite($fp2, trim($contents)); fclose($fp2);
?>

e due file di testo
codificato.txt – dove copiamo il contenuto da decodificare
decodificato.txt – file di testo vuoto con permessi settati a 666

Mettiamo tutti e tre i file nella root del nostro server.

Nel browser richiamiamo http://www.miodominio.it/decodifica.php
e poi http://www.miodominio.it/decodificato.txt per leggere la funzione in chiaro.

Link: scarica esempio

CGI Error con PHP4 e IIS

Pubblicato da

Una veloce tip su un errore che capita di frequente quando si utilizza PHP su IIS. L’errore è il seguente

CGI Error The specified CGI application misbehaved by not returning a complete set of HTTP headers

Questo errore può manifestarsi non sistematicamente nell’utilizzo di PHP su IIS, ma anche solo quando si cerca di settare un file come “php.ini“. Una soluzione, che a me ha funzionato, è quella di avviare PHP come ISAPI.
Nel pannello Plesk si trova questa opzione nella sezione “Setup”