Monthly Archives: October 2008

Web utonzia

Un collega che cura alcuni siti di commercio elettronico nel settore Alta Moda, mi ha raccontato un paio di aneddoti interessanti. Meditate gente, meditate.

  1. Lancio di un nuovo sito. Un paio di giorni dopo il cliente telefona perché “ci sono problemi”. Sta ricevendo centinaia di telefonate (sono sempre almeno un centinaio) perché le persone non riescono a registrarsi sul sito. Nella form di registrazione, al momento di inserire “Nome utente” e “Password” non sanno quale inserire…
  2. Altro sito. Viene spedita una newsletter a circa 16000 clienti del Cliente per pubblicizzarne l’apertura. Il giorno dopo il cliente telefona al mio collega perché il sito “non funziona! sta ricevendo centinaia di telefonate!! con questo problema!!!”. Il sito invece funziona benissimo. Il problema, se vogliamo chiamarlo tale, era che la newsletter era stata mandata in formato testo, non in HTML. Il link al sito, dunque, non funzionava se cliccato (a meno di non avere un client furbo). “Se clicco non funziona, allora telefono e mi lamento”.

Darwin, aiutaci tu.


PHP ip2long() madness

Capita abbastanza spesso di dover salvare un indirizzo IP in una tabella di database. La teoria e la pratica insegnano quanto sia meglio salvare non la string CHAR(15) dell’IP, ma la sua rappresentazione numerica (si salva spazio, le ricerche sono più pratiche, gli indici velocissimi).

Si dà il caso, poi, che sia MySQL che PHP abbiano delle funzioncine proprio adatte allo scopo. Rispettivamente INET_NTOA, INET_ATON e long2ip() e ip2long(). PostgreSQL ha addirittura un tipo di dato specifico, se non erro.

Il problema è che nei sistemi a 32bit la funzione PHP ip2long() ritorna un intero SIGNED, spesso negativo, mentre nei sistemi a 64bit torna sempre un UNSIGNED.

Se di questa cosa non te ne accorgi, avrai fatto la colonna della tua tabella come normale INTEGER (dunque SIGNED) e tutti i tuoi test funzioneranno alla grande.

Poi passi in produzione a 64bit e la tabella si riempirà di valori molto vicini a 2^31 (ovvero 127.255.255.255).

Soluzione: il campo della tabella lo devi fare INT(11) UNSIGNED e in tabella dovrai sempre scrivere il valore UNSIGNED; per fare questo, un sistema è usare qualcosa come $ip = sprintf(‘%u’,ip2long($ip)) o qualcos’altro di più veloce con l’operatore shift (mai programmato videogiochi, mai preso confidenza con ‘ste robe arcane);

Nota numero uno: INTEGER UNSIGNED e basta mi pare crei un INT(10), non sufficiente. Meglio specificare INTEGER(11) UNSIGNED.

Nota numero due: usare BIGINT non è consigliabile, perché le INET_* non funzionano con quel tipo di dato.


I contenuti di questo sito sono distribuiti con una licenza Creative Commons 2.5 eccetto dove diversamente specificato.

Tema WordPress Punto5 sviluppato da Claudio Cicali; icone del set famfamfam silk e komodomedia.

© 2005-2010
Claudio Cicali