Espiral

Expresiones

El concepto de expresión puede resultar un poco confuso, pero en realidad es muy sencillo. En PHP, las expresiones son trozos de código que devuelven un valor. Hay muchos tipos de expresiones; las más usadas y usuales son la asignación de variables ($var=1;), las llamadas a función (print("aiya");), la operación de variables y valores sueltos, ya sea aritméticamente o comparativamente (1==1, 1+1), o los simples valores o variables sueltos ($var, 123).

Como dije antes, las expresiones devuelven un valor. Un valor puede ser true (verdadero) si es distinto de 0, o false, si es igual a 0, o bien es nulo (sin valor).

No te preocupes si no has entendido muy bien qué son las expresiones; son algo muy sencillo que se aprende sobre la marcha, pero al menos te haces una idea.

Sentencias

Era necesario explicar más o menos lo que son las expresiones porque las sentencias funcionan en base a ellas.

En realidad, una sentencia es casi todo lo que acaba en punto y coma (;) o está entre llaves ({ }); serían algo similar a las frases de un texto, y se ejecutan una a una. Las sentencias muy a menudo también son expresiones que devuelven un valor. Pero yo me voy a referir a las sentencias de control, una serie de palabras clave que sirven para controlar la ejecución del programa, y encauzarla en una u otra dirección.

Sentencias condicionales

Las sentencias condicionales ejecutan una expresión (que suele ser una comparación) y, si es cierta (devuelve true), ejecuta un bloque de código.

Sentencia if

Es la más sencilla y la más usada.

<?
if(2+2==5) {
     print("Esto no se imprime, porque es falso.");
}
 
if(1) {
     print("Esto se imprime porque 1 devuelve true.");
}
 
$var=2;
 
if($var=1) {
     print("Cuidado con esto, = no es lo mismo que ==, por lo que esto se imprimirá.");
     // Ahora $var vale 1
}
 
if($var<=20) {
    print("1 es menor o igual que 20.");
}
?>

Combinadas con if van las sentencias elseif, que, si la expresión del if es falsa, vuelve a hacer otra comparación, y else, que, si las expresiones de los if y los elseif son falsas, se ejecuta.

<?
if(2+2==5) {
     print("No se imprime.");
} elseif(2+2==4) {
     print("Esto sí se imprime.");
} else {
     print("Esto se imprimiría si 2+2 no fuera 5 ni 4.");
}
?>
Sentencia switch

Este tipo de sentencia toma una expresión, y según lo que devuelva, ejecuta una cosa u otra. Vamos a verlo con un ejemplo con líneas numeradas.

1
2
3
4
5
6
7
8
9
10
11
12
13
<?
switch(2+2) {
     case 5:
          print("Esto no se imprimirá.");
          break;
     case 4:
          print("Esto sí se imprimirá.");
          break;
     default:
          print("Esto se imprimiría si 2+2 no fuera 5 ni 4.");
          break;
}
?>

En la línea 3 vemos una nueva sentencia, case, que lo que hace es comparar la expresión que viene detrás suya con la expresión del switch, la cual vemos en la línea 2. Además, vemos que los bloques case no tienen llaves, sino que empiezan por dos puntos (:), y terminan cuando ven una sentencia break como la de la línea 5.

En la línea 9 vemos otra sentencia nueva, default, que sería el equivalente a else en sentencias tipo if. También empieza por dos puntos y acaba con break;.

Como ya te habrás dado cuenta, este ejemplo y el anterior hacen exactamente lo mismo. Entonces, ¿para qué queremos las sentencias switch? Pues supongo que será simplemente por motivos de elegancia :P. No hay nada que if no pueda hacer que switch sí pueda, aunque sí al revés.

Sentencias de bucle

Un bucle es un bloque de código que se repite mientras una expresión sea verdadera. Estas expresiones casi siempre son comparaciones, ya que de lo contrario se generaría, en la mayoría de los casos, un bucle infinito, es decir, que nunca se detendría.

Bucle while

Este es el bucle más sencillo. Si una expresión es verdadera, se ejecuta el bloque, y al acabar, se vuelve a evaluar la expresión; si sigue siendo verdadera, se vuelve a ejecutar el bloque, y así consecutivamente hasta que la condición sea falsa.

1
2
3
4
5
6
7
<?
$var=1;
while($var<=9) {
     print($var);
     $var++;
}
?>

Este código imprimirá 123456789. Con cada repetición se incrementará el valor de $var, como vemos en la línea 5, y se irá repitiendo hasta que $var deje de ser menor o igual que 9, es decir, cuando $var valga 10.

Sentencias do… while

Son muy similares a while. El bloque de código se pone antes de la comparación de while, después de la palabra clave do, y lo que hace es ejecutar al menos una vez el bloque de código, independientemente de que se cumpla la condición; y después de la primera vuelta, si cumple la condición, funciona como un while normal.

<?
do {
     print("Esto se imprimirá una vez aunque 2+2 no sea 5.");
} while(2+2==5);
 
$var=0;
do {
     print("Esto se imprimirá tres veces.");
     $var++;
} while($var<3);
?>
Bucle for

Este es algo más complejo que los anteriores. Entre sus paréntesis se incluye la declaración de una variable, la condición y la operación que se le hará a la variable con cada vuelta. Generalmente esa variable se usará también en el bloque de código. Veamos un ejemplo.

<?
for($i=1;$i<=9;$i++) {
     print($i);
}
?&gt

El código anterior hace lo mismo que el ejemplo que pusimos con while: imprime 123456789. Entre los paréntesis vemos que primero se declara la variable $i con valor inicial 1, luego especificamos la condición, y luego se opera la variable, normalmente con un incremento.

Sentencias útiles en los bucles

Para usar en bucles tenemos algunas sentencias útiles de una sola palabra.

Una de ellas ya la hemos visto: break. Lo que hace es interrumpir en el punto en el que es ejecutada el bucle y continuar con el programa.

<?
$var=1;
while(1) {
     print($var);
     $var++;
     if($var==10) {
          break;
     }
}
?>

Sí, esto hace lo mismo que el ejemplo que puse con for y con while. No tiene mucho sentido, la verdad, porque es mucho más elegante hacerlo con for o while, pero break puede sernos útil en alguna ocasión.

Otra sentencia útil es continue. Es parecida a break; cuando es ejecutada detiene el bucle, pero no continua con el programa, sino que vuelve a comenzar el bucle desde el principio.

1
2
3
4
5
6
7
8
9
10
11
<?
$var=1;
while(1) {
     print($var);
     $var++;
     if($var<10) {
          continue;
     }
     break;
}
?>

Aquí tenemos otra forma aún más surrealista de expresar los ejemplos anteriores; por cada vuelta, si $var sigue siendo menor que 10, el bucle comienza desde el principio; cuando deje de ser menor que 10, el bucle seguirá y se ejecutará break, y el bucle se interrumpirá. También puede sernos útil en alguna ocasión.

Aunque no lo parezca, con el capítulo anterior y este ya se pueden hacer multitud de programas, aunque la verdad no muy útiles; las expresiones, las variables y las sentencias de control son los pilares base de todo PHP. Su uso combinado con las funciones y la entrada de datos por medio de formularios nos permitirán hacer todo lo que se nos ocurra.

Resumen

  • Las expresiones son trozos de código que devuelven un valor, que puede ser true (distinto de 0) o false (igual a 0, o bien nulo).

  • Las sentencias de control nos permiten controlar cómo funcionará el programa en base al resultado de expresiones.

  • Las sentencias condicionales if se ejecutan si una expresión devuelve true; switch toma una expresión y ejecuta una cosa u otra según lo que devuelva.

  • Los bucles while se ejecutan mientras una expresión sea verdadera; los bucles do... while se ejecutan al menos una vez; for es una forma compleka de bucle en la que se declara, compara y opera una variable.

  • La sentencia break interrumpe el bucle y sigue con el programa; continue vuelve al inicio del bucle.

Próximo capítulo: Funciones

Variables

Ya vimos algo de las variables en el capítulo anterior. Las variables son huecos de memoria a los que aisgnan un nombre (identificador) y que pueden contener valores. Puede compararse con unas taquillas de estas de los colegios de las películas, que se reconocen por el nombre del alumno al que pertenecen y donde el alumno guarda sus cosas.

Características de las variables en PHP

  • Todos los nombres de variables empiezan por $, como en Perl.
  • Sus nombres pueden contener caracteres alfabéticos (incluídos tildes, diéresis, etc.), numéricos (estos últimos no al principio) y rayas bajas (_). Son case-sensitive, es decir, distinguen entre mayúsculas y minúsculas ($Casa no es lo mismo que $casa).
  • Pueden contener números enteros, decimales, cadenas de caracteres y cosas más avanzadas (ver siguiente apartado más abajo).
  • Para los que vengan de C & Cía., las variables no necesitan ser declaradas. PHP es un lenguaje no tipado, es decir, no hace falta especificar el tipo de variable.

Tipos de variables

Existen tres tipos básicos de variables en PHP:

  • Enteros: almacenan números enteros, es decir, sin decimales. Sus valores se escriben sin comillas. En C, se corresponderían con el tipo int.

    <?
    $entero=1;
    $entero=245;
    $entero=-1124;
    ?>
  • Decimales: almacenan números decimales. El separador de decimales es el punto, no la coma. Sus valores, al igual que los enteros, se ponen sin comillas, aunque deben tener la parte decimal especificada. En C, se corresponden con el tipo double (no existe el float en PHP).

    <?
    $decimal=1.2;
    // $decimal=1,2; (Incorrecto, el separador es el punto.)
    $decimal=1.0; // No es igual que $decimal=1, porque con .0 se almacena como decimal y sin .0, como entero.
    ?>
  • Cadenas: almacenan cadenas de caracteres, como palabras, frases o lo que sea. Se escriben entre comillas dobles. En C, se correspondería con los arrays de char.

    <?
    $cadena="Aiya Arda";
    ?>

Hay otros tipos más avanzados de variables, como los arrays o las instancias de clases, pero ya los veremos en capítulos venideros.

Operadores

Los operadores son signos que, bueno, operan con expresiones y variables. Veamos los principales, y los más usados.

Aritméticos

Son + (suma), - (resta), * (multiplicación), / (división) y % (resto de una división entre enteros). Simplemente operan con dos valores, uno a la izquierda y otro a la derecha.

<?
$var=1+1;
print($var); // Imprime 2
print($var+1); // Imprime 3
print(5%2); // Imprime 1 (resto)
?>

Concatenación

¿Has oído alguna vez el típico chiste de 2+3=23? Pues precisamente eso hace el operador de concatenación: unir dos cadenas. Se representa con un punto . .

<?
$cadena1="Aiya";
$cadena2="Arda";
print($cadena1.$cadena2); // Imprime AiyaArda
print($cadena1." ".$cadena2); // Imprime Aiya Arda
?>

Asignación

Lo que hacen es asignar valores a una variable. Hemos visto el más básico de ellos, =, que simplemente asigna el valor de la derecha del signo a la variable de la izquierda.

<?
$var1=1;
$var2=2;
$var2=$var1; // $var2 coge el valor de $var1, no al revés
?>

Ahora bien, la combinación de = con los operadores aritméticos y el de concatenación da lugar a asignadores más complejos. Tienen la forma operador= (por ejemplo, += o -=). Asigna a la variable de la izquierda, el valor de la derecha operado con la variable misma. Lo veremos mejor con un ejemplo:

%lt;?
$var=2;
$var=$var+2; // Suma 2 al valor de la variable
$var+=2; // Hace lo mismo que lo anterior
 
$var="Aiya";
$var=$var." Arda";
$var.=" Arda";
?>

Incremento/decremento

Son ++ (incremento) y (decremento). Aumentan o decrementan en 1 el valor de una variable. Si se ponen antes de la variable, primero opera y después la procesa; si se pone después, primero la procesa y después opera. Lo veremos con un ejemplo:

<?
$var=1;
print($var++); // Imprime 1, y después increnta $var
// En este punto $var es igual a 2
print(++$var); // Incrementa $var en 1 (vale 3), y después lo imprime
?>

De comparación

Simplemente comparan dos expresiones, y si la condición es verdadera, devuelve true (esto lo explicaremos con más detalle en el próximo capítulo).

Son == (es igual), > (es mayor que), < (es menor que), >= (es mayor o igual que), &gt=; (es menor o igual que), != (no es igual). Ojo, no confundir == con =, es un error muy común y que da muchos quebraderos de cabeza, porque generalmente no provocan error al ejecutar el programa. = es de asignación, == de comparación.

Para ver los ejemplos, adelantaré que if es una sentencia condicional, y si la condición es verdadera, ejecuta lo que tiene dentro.

<?
$var1=1;
$var2=2;
 
if($var1==1) {
     print("Son iguales");
}
 
if($var1==$var2) { // No es cierto
     print("Son iguales"); // Esto no se imprimirá
}
 
if($var1<$var2) { // $var1 es menor que $var2
     print("Son iguales");
}
 
if($var1=$var2) { // Vemos que hemos puesto =, de asignación, luego $var1 valdrá como $var2
     print("Son iguales"); // Y esto se imprimirá
}
?>

Hay otros tipos de comparadores, como los lógicos y los de bits, pero prefiero verlos en capítulos próximos.

Resumen

  • Las variables almacenan valores, ya sean enteros, decimales o cadenas.

  • Las variables se identifican por nombres clave que empiezan por $.

  • Los operadores son signos que operan con expresiones y variables.

  • Los operadores aritméticos operan aritméticamente (suma, resta, etc.) y son +, -, *, / y %.

  • El operador de concatenación une cadenas y es un punto (.).

  • Los operadores de asignación dan valores a variables, y se pueden combinar con los aritméticos y el concatenador. Son =, +=, -=, *=, /=, %= y .=.

  • Los operadores de comparación comparan expresiones y son ==, <, > <=, >=, !=.

Próximo capítulo: Sentencias

Primer programa en PHP

Para crear archivos PHP necesitamos el editor. Al igual que con HTML y CSS, el código se guarda en archivos con una extensión estándar que indique que es PHP. En el caso de PHP, sería .php. Además, para que se pueda ejecutar hay que guardarlo en la carpeta del servidor. En Linux suele ser /var/www, en Mac, /User/usuario/Sites, y en Windows, C:/AppServ/www.

1
2
3
4
5
<?
// Primer programa en PHP
 
print("<p>Aiya Arda!</p>");
?>

Comentemos línea por línea:

  • 1: Este símbolo, , indica que ahí empieza código PHP. Todo lo que esté entre es código PHP; lo que esté fuera, el navegador lo interpreta como HTML. Por supuesto, podemos crear varios bloques de código en un mismo archivo.

  • 2: Las líneas que comienzan por // son comentarios, es decir, notas que ponemos para dejar más claro lo que hace el código, dejarnos recordatorios, o lo que queramos. No tienen efecto sobre el programa.

  • 4: Eso de ahí es una función, en este caso print, que lo que hace es mostrar HTML en el documento. Quedémonos por ahora con que las funciones son como comandos que nos permiten hacer cosas especiales, pero ya veremos mejor en próximos capítulos.

  • 5: ?>, como ya hemos dicho antes, cierra el bloque de código PHP.

Si ejecutáramos este programa, obtendríamos esto:

Aiya Arda!

Lo que no tiene utilidad alguna, y además podría haberse obtenido con sólo HTML :P.

Veamos otro ejemplo:

1
2
3
4
<?
$aiya="<p>Aiya Arda!</p>";
print($aiya);
?>

En la línea 2 vemos un nuevo elemento: la variable. Las variables son como objetos que contienen valores, ya sean numéricos, de cadena de caracteres (una palabra, una frase, etc.), o de otros muchos tipos: matrices, instancias, conexiones a bases de datos, etc., que veremos en próximos capítulos.

En este programa, a la variable $aiya le asignamos el valor “<p>Aiya Arda!</p>”, y luego imprimimos con print() el contenido de la variable. Hace exactamente lo mismo que el programa anterior :P.

Alguno se preguntará para qué sirven las variables, que si no sería lo mismo poner el contenido de la variable directamente, en este caso “<p>Aiya Arda!</p>”. Bueno, ya veremos algunas aplicaciones más útiles, pero por ahora quédate con el concepto.

Imaginemos que quisiéramos mostrar diez veces el famoso “<p>Aiya Arda!</p>”:

1
2
3
4
5
6
7
8
9
10
11
12
<?
print("<p>Aiya Arda!</p>");
print("<p>Aiya Arda!</p>");
print("<p>Aiya Arda!</p>");
print("<p>Aiya Arda!</p>");
print("<p>Aiya Arda!</p>");
print("<p>Aiya Arda!</p>");
print("<p>Aiya Arda!</p>");
print("<p>Aiya Arda!</p>");
print("<p>Aiya Arda!</p>");
print("<p>Aiya Arda!</p>");
?>

Pues vaya rollo, ¿no? Pero podemos recurrir a una de las herramientas principales de la programación: el bucle.

1
2
3
4
5
<?
for($i=0;$i<10;$i++) {
          print("<p>Aiya Arda!</p>");
}
?>

Esto habría repetido Aiya Arda! diez veces. Veamos cómo funciona:

  • 2: lo que tenemos ahí es un bucle for. En primer lugar, vemos una variable, $i, que vale inicialmente 0. Luego vemos $i>10, lo que significa “$i es menor que 10″. Mientras esto sea cierto, se ejecutará el bucle. Y luego vemos $i++, que significa que, por cada vez que se ejecute el bucle, se incrementará en 1 el valor de la variable $i. Como siempre, ya veremos todo esto con más detalle ;).

Resumen

  • Los archivos de código PHP se guardan en la carpeta de servidor con la extensión .php.

  • El código PHP se pone entre .

  • Las líneas que comienzan por // son comentarios.

  • Las variables son objetos que contienen muchas clases de valores.

  • Los bucles permiten repetir una serie de operaciones mientras se cumpla una condición.

  • Las funciones son una especie de comandos que permiten hacer operaciones especiales o repetitivas.

Bueno, este es el capítulo previo al curso de PHP de verdad. Explicaremos un poco de qué va PHP y qué necesitaremos para ponernos con él.

PHP

Todos hemos visto alguna vez alguna página que termina en .php o donde pone en un cartelito phpBB, phpNuke, etc. PHP es un lenguaje de programación, bastante diferente al HTML. Se utiliza principalmente para crear páginas web dinámicas, es decir, que no se limita simplemente a mostrar contenido fijo en pantalla, como el HTML, sino que el contenido de la página cambia según la programemos. Esto permite crear programas como foros, blogs, encuestas, etc. En el aspecto técnico, es un lenguaje de guiones, es decir, interpretado, y su intérprete es el motor Zend. En su versión más reciente (PHP 5) está orientado a objetos, además del paradigma estructural. (Si no entiendes nada de esto, no te preocupes, es para los que tienen experiencia en otros lenguajes de programación :P). Por último, es gratis y libre, no como otros :).

Requisitos previos para empezar con PHP

El primer requisito sería tener ordenador y saber usarlo, ya sea Linux, Mac, Windows o lo que tengas. También hace falta conexión a internet y un navegador (preferiblemente decente). También necesitas un editor de texto plano. Para Linux, mi preferido es Quanta, pero sirve cualquiera. Para Windows, puedes usar el mismo Bloc de Notas, pero es preferible usar programas dedicados a ello, como UltraEdit, o SciTE, que es libre.

Instalación del servidor Apache, MySQL y PHP

La instalación de PHP difiere según sistemas:

Linux

Si usas Debian, Ubuntu o derivadas, sólo tienes que instalar los siguientes paquetes desde apt o desde Synaptic, Adept o lo que tengas:

  • apache2

  • libapache2-mod-php5

  • mysql-common

  • mysql-client

  • mysql-admin

  • php5

  • php5-mysql

  • php5-common

  • phpmyadmin

Si te gusta copiapegar en consola: sudo apt-get install apache2 libapache2-mod-php5 mysql-common mysql-client mysql-admin php5 php5-mysql php5-common phpmyadmin

Si usas distros con RPM, trata de buscar los mismos paquetes, o similares, en formato RPM. Si eres aventurero y usas otro tipo de distros sin paquetes, pues tú sabrás :).

Mac

Con el sistema (al menos con Tiger) viene incluído un servidor Apache 1.3 y PHP 4, pero nosotros vamos a usar PHP 5, además de instalar MySQL:

  1. Ve aquí, bájate el paquete donde ponga PHP 5.2.1 for Apache 1.3 e instálalo.

  2. Ve aquí, busca el paquete que encaje con tu Mac (generalmente Mac OS X 10.4 (PowerPC, 64-bit), o bien (x86) si el tuyo es de los Core Duo), descárgalo e instálalo.

  3. Ahora, nos vamos a la Terminal (Finder > Aplicaciones > Utilidades > Terminal) y ponemos touch .profile (pulsamos intro) y nano .profile (volvemos a pulsar intro). Ahí, escribimos esto: PATH=”/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/mysql/bin”. Pulsamos Control+X, pulsamos Y cuando nos pregunte si guardar cambios, y pulsamos intro cuando nos pregunte el nombre de fichero.

  4. Ahora tenemos que reniciar el ordenador. Una vez cargado, volvemos a la Terminal y ponemos mysql_secure_installation. Nos saldrá esto (pongo en negrita las respuestas):

    NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
    In order to log into MySQL to secure it, we’ll need the current password for the root user. If you’ve just installed MySQL, and you haven’t set the root password yet, the password will be blank, so you should just press enter here.
    Enter current password for root (enter for none): [pulsamos enter]
    OK, successfully used password, moving on…

    Setting the root password ensures that nobody can log into the MySQL root user without the proper authorisation.
    Set root password? [Y/n] y
    New password: [nuestra contraseña]
    Re-enter new password: [la repetimos]
    Password updated successfully!
    Reloading privilege tables..
    … Success!
    By default, a MySQL installation has an anonymous user, allowing anyone to log into MySQL without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment.
    Remove anonymous users? [Y/n] y
    … Success!
    Normally, root should only be allowed to connect from ‘localhost’. This ensures that someone cannot guess at the root password from the network.
    Disallow root login remotely? [Y/n] y
    … Success!
    By default, MySQL comes with a database named ‘test’ that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment.
    Remove test database and access to it? [Y/n] y
    - Dropping test database…
    … Success!
    - Removing privileges on test database…
    … Success!

    Reloading the privilege tables will ensure that all changes made so far will take effect immediately.
    Reload privilege tables now? [Y/n] y
    … Success!
    Cleaning up…
    All done! If you’ve completed all of the above steps, your MySQL
    installation should now be secure.
    Thanks for using MySQL!

    (Copiado descaradamente de eScriptorium).

  5. Último paso: en la Terminal, ponemos mysql -u root –p, y después:

    mysql> SET PASSWORD FOR
    -> ‘root’@'localhost’ = OLD_PASSWORD(’la contraseña que elegiste’);
    Query OK, 0 rows affected (0.00 sec)
    mysql> quit
    Bye

    Date cuen de sustituir la contraseña que elegimos por la contraseña que elegiste :P.

Windows

Aquí es facilito, vamos a XAMPP, bajamos e instalamos :P.

Algunos datos de interés

Para acceder a tu servidor, sólo tienes que poner http://localhost en tu navegador. Es como si fuese una página web normal.

Algunos programas están diseñados exclusivamente para PHP 4, y no funcionarán con PHP 5. Si se da el caso, puedes probar a instalar conjuntamente PHP 4. Yo no tengo experiencia, así que tendrás que buscarte la vida. De todas formas, este es un curso de programación, no de instalación :P.

Bien, con todo esto, unido a muchas ganas de aprender, paciencia y perseverancia (creo que nunca había usado esa palabra), creo que estás listo para empezar :P.

Ego

  • Nombre: Shock Harad
  • Edad: 15 16 17 años
  • Profesión: Estudiante de 4º de ESO 2º de Bachillerato
  • Ubicación: Málaga, Andalucía, España, Tierra, Sistema Solar, Vía Láctea. [...]

Acerca de

[...] Generalmente se hablará de Linux/informática, proyectos propios, alguna reseña de lo que sea... pero, en realidad, cualquier frikada tiene cabida aquí. [...]

Gaticos y monetes

Baúl

Mésenyah Getalc

Tuitis

  • @infa_me Bueno, vale, basura no, pero tampoco es la cosa megatrascendental que se dice. Es una buena historia pero Bambi me hizo pensar más.
  • Ah, pues no me la he perdido, mola.
  • American History X es una basura de película, sólo merece la pena por la escenita comebordillos y voy y me la pierdo.
  • [...]

Hamijos

Bla bla bla

  • RSS
  • Egómetro
  • XHTML 1.0 Strict válido
  • CSS válido
  • Hecho en Linux
  • Licencia Creative Commons
  • Uso Konqueror
  • Anda con WordPress
  • RES