Tuesday, 27 December 2011

Exam for PHP web developers (LAMP-WAMP)


Here i share with you the exam i prepared when i needed evaluate possible candidates for work with me as a web developers.

I work since the begining with PHP and MySQL (ever under Linux), i don't need a genius nor very intelligent person, but yes someone who can write PHP code manually and do the basic things with PHP/MySQL/HTML/CSS/Javascript and if possible jQuery.

Then, i created the exam that you can download here, or read below.
I hope this help someone or give any good idea ;) if you finally take this exam as inspiration and make a good improvement to it, please share with us and leave a comment!!!


NOTA: llevo 4 años y medio escribiendo artículos en este blog con el único interés de devolver a la comunidad de programadores tan solo un poquitín de todo lo que me han dado, especialmente los más generosos que no solo leen sino que también escriben!

Hasta ahora lo había hecho en "castellano" ("español", para los latinoamericanos), más sin embargo, a día de hoy el catalán está siendo tan agredido en su propio territorio (Catalunya, una región al norte de España) por los españoles castellanistas, que adopto la medida de cambiar el idioma de mis artículos al inglés como medida de boicot.

Lo siento por los latinoamericanos que desconocen esta polémica lingüística dentro del territorio español y que no tienen culpa, pero no dudo de que la mayoría entenderán perfectamente mi "limitado inglés", y si no harán uso de alguno de los traductores que corren por internet (recomiendo absolutamente: http://translate.google.com/#en|es|).


Xavals... se us ha acabat el bròquil (això no crec que ho sàpiga traduir el Google :P).


Catalonia is not spain!

=== OBJECTIVE OF THIS TEST

We need to know the skills and measure the ability of the candidate to manage the tools most used in our day to day work (in order of importance):

- PHP programming
- MySQL managing/querying
- HTML/CSS building
- Javascript programming


=== WHAT TO DO NOW?

Build a simple web application that use HTML, CSS, javascript, PHP and MySQL. The concept of the web application is:

 -> Store & manage (add/edit/list/delete) typical task notes, as "I've an exam for new job tomorrow."

Minimum elements to build:

- a database table to store elements (minimum fields: task_title, task_description,timestamp_creation,last_timestamp_edition).
- HTML page with list of elements (tasks), with buttons to edit/delete each element, and an "add new element" button.
- an edit element form, with javascript data validation before submission.
- use a CSS linked file to present the content well(list of elements and edit form).


= Notes:

1. You can call external jquery libraries if you feel more comfortable.
2. Add plenty of comments to your code (PHP, Javascript, HTML).
3. Any other elements (client or server side) that you add to the above specifications will be welcome.


=== URL: http://companydomain.com/exam/


=== DATABASE

-db_host: localhost
-db_user: exam_user
-db_passw: exam_pass
-db_database: exam_dbname

PHPMyAdmin: https://companydomain.com/phpMyAdmin/


=== FTP

-host: companydomain.com
-user: exam_user
-pass: exam_pass


=== SOFTWARE TO USE

You must only use:

- obviously a browser

- an FTP client

      + recommended: FILEZILLA (windows or linux)
      + http://filezilla-project.org/download.php?type=client)

- a SIMPLE code editor, never a sophisticated IDE
      + recommended: Windows NOTEPAD++ (windows) / Bluefish (linux)
      + http://notepad-plus-plus.org

- the database can be managed from PHP or PHPMyAdmin:

      + https://companydomain.com/phpMyAdmin/

Saturday, 6 August 2011

Solución a carácteres raros y juegos de carácteres (charset)


Si al visitar tu propia web en tu navegador ves "carácteres raros", puede ser debido a dos cosas:

  • realmente hay carácteres "binarios"
  • hay un conflicto de "juego de carácteres" o "charset" en inglés

Carácteres binarios


Si tienes esos carácteres binarios es porque tú o algún visitante o administrador de tu web introdujo en el sistema (en un archivo o en la base de datos a través de un formulario) alguna cadena de texto COPIANDO Y PEGANDO desde algún software de Microsoft, por ejemplo. No siempre que se haga eso tiene que ocurrir tal "desajuste" de carácteres, pero la mayoría de las veces que ocurre es por esa razón. es algo que te puede ocurrir aunque tengas perfectamente construida tu web a nivel de charsets.

La solución a eso es disponer de alguna función PHP de limpieza de esos posibles carácteres, usándola justo cuando recibas datos a través de formularios, para que así se te guarden limpios en la base de datos.

En este otro artículo comparto esta función para limpiar, aunque ya aviso de que solo funciona si estás trabajando con el charset "utf-8" en toda tu web (base de datos, HTML y archivos!):

http://crear-paginas-web.blogspot.com/2011/06/eliminar-caracteres-raros-o-binarios-de.html


Conflictos de charset


Hay que definir el charset de tres elementos de tu aplicación web:
  • la base de datos
  • el HTML devuelto al navegador
  • los archivos del servidor (ya sean PHP o HTML o de texto)
Para empezar, la base de datos tiene dos tres aspectos en los que hay que configurar el charset, y no necesariamente coincidente (por eso son dos!).
  1. Uno es el charset utilizado para guardar los datos en sí.
  2. El otro el de "cotejamiento" de los datos. No me preguntes muy bien cuál es la diferencia... para eso busca por internet. Lo que te digo es que ahí ya puede haber una primera fuente de problemas!
  3. El tercero es la conexión del PHP con el MySQL, que también tiene que indicar el charset que se quiere usar. Es tan sencillo como añadir el siguiente comando después de cada conexión con MySQL:
    1 <?php
    2
    3 $connection
    = mysql_connect($db_host,$db_user,$db_passw) ;
    4
    mysql_set_charset('utf8');
    5
    6
    ?>

[* añadido el 6 de Dic. de 2011]

Lo recomendable es que ambos coincidan y que sea "UTF-8 unicode". Los demás charset suelen estar ahí para compatibilizar con bases de datos antiguas, pero hoy en día se recomienda UTF-8 UNICODE como charset completamente universal! puede contener carácteres chinos, árabes, rusos, latinos, etc... y todos mostrarse en un mismo párrafo perfectamente! ;)

La segunda cuestión es el charset de la página web devuelta al navegador. Es decir, el charset declarado en el meta-tag del HTML: "content-type", que indica al navegador con qué charset debe renderizar el contenido de tu HTML. Y de nuevo, lo recomendable es que uses UTF-8, así:

1 <meta equiv="Content-Type" content="text/html; charset=UTF-8" />

El tercer elemento de tu aplicación web en el que tienes que definir el charset es el más sútil y a veces problemático! Se trata del charset usado para el contenido de tus archivos en el servidor (PHP, texto, HTML, etc...). Y digo que es problemático porque solo de unos años para acá los editores de texto o de código que usamos en el escritorio de nuestros PCs (sea Linux o Windows...) han ido incorporando más funciones para poder definir el charset de nuestros documentos de una forma más clara y controlada para el usuario. Y aún así a veces yo tengo problemas!

El problema en este punto es que por ejemplo algunos de tus archivos .php estén codificados en iso-8859-1 y tu base de datos en utf-8. ¿Porqué? pues porque entonces es un poco imprevisible como se renderizarán algunos carácteres, como por ejemplo el símbolo de euro, que no tiene una codificación propia en iso-8859-1. ¿Ya vas entendiendo el lío que se puede montar?

Por esa razón hemos de usar un editor de texto/código que nos permita saber en todo momento el charset de nuestros documentos y modificarlo a voluntad. Es algo que cada día se ve más, pero aún no acaba de funcionar bien.

Por ejemplo, en Linux yo uso el excelente editor opensource Bluefish. Pero en la última versión parece tener un bug según el cuál te abre un documento con el último charset que usaste!!! imagínate que lío!!! si no voy con cuidado y tengo webs que usen iso-8859-1 y otras utf-8, si no me fijo me puede ir mezclando los charset entre ellos!!!! cosa que ya me ha ocurrido, porque aún tengo unos cuantos sites que tengo que convertir totalmente a utf-8 :(((

En fin, creo que queda evidente el problemón... símbolos de euros que no aparecen, vocales acentuadas que se ven como ~A- o cosas peores...

Conclusión


Es muy sencilla la moraleja a todo lo anterior:
  • usa UTF-8 para tus archivos
  • usa UTF-8 para tu base de datos
  • usa UTF-8 como charset en el meta-tag de tus páginas HTML
-->

Wednesday, 1 June 2011

Eliminar caracteres raros o binarios de un string en PHP

Bueno, espero que estés aquí porque te hayas encontrado con el siguiente problema: tienes carácteres "extraños" o "binarios" o "no ascii" en algunos "strings" de tu base de datos, y no sabes cómo filtrarlos. Estos carácteres aparecen habitualmente al hacer un "copiar y pegar" desde algún software de Microsoft (Outlook, MSword, MSexcel, etc...) de usuarios que estén rellenando un formulario en tu web, por ejemplo. Me imagino que es el caso más habitual :(

Lo más curioso es que el hecho de que tengas un carácter de ese tipo infiltrado en tu base de datos puede ocasionar los errores más variopintos y puede costar de llegar a descubrir que es por culpa de ese maldito carácter! En mi caso estaba pasando datos de un servidor a otro usando un webservice que trabaja con SOAP y que por tanto los datos se envían en un formato XML perfecto. Eso quiere decir que si en la cadena de datos que estás transmitiendo tienes un caracter raro de esos... entonces ya rompes el formato del XML y recibes un error del tipo: "documento XML mal formado".

Solución

Aquí os dejo una función que a mí me sirve para limpiar de carácteres raros una cadena de texto (string). Uso PHP 5.2 corriendo sobre CentOS (linux), por lo que no sé si habrá diferencias con otros entornos, pero por probar no pierdes nada, y en todo caso la solución va por aquí:

1  <?php
2  
function f_remove_odd_characters($string){
3       
// these odd characters appears usually 
4       // when someone copy&paste from MSword to an HTML form
5       
$string str_replace("\n","[NEWLINE]",$string);
6       
$string=htmlentities($string);
7       
$string=preg_replace('/[^(\x20-\x7F)]*/','',$string);
8       
$string=html_entity_decode($string);     
9       
$string str_replace("[NEWLINE]","\n",$string);
10       return 
$string;
11  }
12  
?>


Unos pocos comentarios:
  • he mezclado lo mejorcito que he encontrado por ahí que no era mucho, pues al final he tenido que poner de mi parte ;)
  • lo del NEWLINE es para evitar que el preg_replace elimine los posibles cambios de línea
  • lo de los htmlentities es para evitar que se el preg_replace elimine las posibles vocales acentuadas y otros carácteres latinos!
  • efectivamente, el mérito de la limpieza se lo lleva la función preg_replace, habiendo protegido previamente las vocales acentuadas y los cambios de línea

Por favor, si no te ha servido y has podido "modificarla" para hacerla funcionar en tu caso, se agradecería que escribieras los detalles. ¿Te puedes creer que dónde he leído la mayor parte de esa función ha sido en un artículo que se escribió hace dos años y medio y aún la gente sigue aportando mejoras y comentarios?... qué alegría me da eso :)

Este era el enlace original, en dónde aporté mis cambios:
http://www.stemkoski.com/php-remove-non-ascii-characters-from-a-string

Actualización 27-Junio-2011


Acabo de descubrir que la función de arriba tiene problemas con el símbolo euro!! (€). Después de investigar, descubro que este símbolo no está en el charset latino habitual ISO-8859-1 y que por tanto la función nativa de PHP utf8_decode("€") devuelve "?" !!!! :(

Esto provoca que si el charset de tu web no es utf-8 entonces los simbolos de euro se te convierten en un interrogante si les aplicas utf8_decode() para guardarlo en tu base de datos! por si no lo sabías... Pero en fin, normalmente no deberías hacer esas cosas. Es decir, tener la base de datos y al web en dos charsets diferentes!

Bueno, en paralelo, si aplicamos la función f_remove_odd_characters($string) sobre el simbolo de euro, éste SIMPLEMENTE desaparece :( es decir, lo convierte a ''. De lo cuál me di cuenta cuando me fueron despareciendo los simbolos de euro que mis usuarios introducían en los formularios :(((

Conclusión, dejo pendiente este asunto de la eliminación de caracteres. He encontrado por internet una función que sustituye a utf8_decode() de manera que "evita" el problema del euro... por si a alguno le sirve, y también quiero ver si con ello también se eliminan otros caracteres raros como los que pretendía limpiar al inicio.

Es una lástima que no tenga ya "guardados" en mi base de datos esos carácteres raros para poder probar si efectivamente se pueden limpiar con la siguiente función, pero en fin, si alguien puede hacerlo, se lo agradeceré enormemente si comparte aquí el resultado ;)

1  <?php
2  
3  
function _utf8_decode($string){          
4       
5      
/* Only do the slow convert if there are 8-bit characters */
6      /* avoid using 0xA0 (\240) in ereg ranges. RH73 does not like that */
7      
if (! ereg("[\200-\237]"$string) and ! ereg("[\241-\377]"$string))
8          return 
$string;
9  
10      
// decode three byte unicode characters
11      
$string preg_replace("/([\340-\357])([\200-\277])([\200-\277])/e",       
12      
"'&#'.((ord('\\1')-224)*4096 + (ord('\\2')-128)*64 + (ord('\\3')-128)).';'",   
13      
$string);
14  
15      
// decode two byte unicode characters
16      
$string preg_replace("/([\300-\337])([\200-\277])/e",
17      
"'&#'.((ord('\\1')-192)*64+(ord('\\2')-128)).';'",
18      
$string);
19  
20      return 
$string;
21  } 
22  
23  
?>