# Soluciones de los ejercicios (cursos anteriores)

Estos enlaces permiten descargar soluciones de cursos anteriores de algunos de los ejercicios. Cada archivo comprimido contiene todos los archivos necesarios (html, css, php, imágenes, etc). Se recomienda utilizar las soluciones más actuales.

## Soluciones del curso 2009/2010

Las soluciones proporcionadas durante el curso 2009/2010 se distribuyen bajo licencia AGPL 3 o posterior.

- Comprobación de datos (versión 2010-02-16)
- Controles en formularios (versión 2010-02-17)
- Operaciones aritméticas (versión 2010-03-02)
- if ... elseif ... else ... (versión 2010-03-02)
- for 1 (versión 2010-03-03)
- Expresiones regulares (versión 2010-04-24)
- for 2 (versión 2010-04-13)
- validacion (versión 2010-03-25)
- Repaso (versión 2010-03-30)
- Agenda 1 (sólo creación de tablas) (versión 2010-04-13)
- Agenda (completa) (versión 2009-05-21)
- Biblioteca 1 (sólo creación de tablas) (versión 2010-04-20)
- Biblioteca (completa) (versión 2009-05-21)
- Blog 1 (sólo creación de tablas) (versión 2010-04-28)
- Blog (completa) (versión 2010-04-28)
- Cookies (versión 2010-05-09)
- Sesiones (versión 2010-05-11)
- Multiagenda 1 (sólo creación de tablas) (2009-05-21)
- Multiagenda (completa) (2009-05-21)

## Ejemplos del curso 2009/2010

Los ejemplos proporcionados durante el curso 2009/2010 se distribuyen bajo licencia AGPL 3 o posterior.

- Diferencias entre MYSQL y SQLite - Fecha (versión 2010-02-20)

## Soluciones curso 2008/2009

Las soluciones proporcionadas durante el curso 2008/2009 se distribuyen bajo licencia AGPL 3 o posterior.

- Controles en formularios (versión 2008-04-27)
- Operaciones aritméticas (versión 2008-04-27)
- If ... elseif ... else ... (versión 2008-04-27)
- for (1) (versión 2009-04-27)
- for (2) (versión 2009-04-27)
- Expresiones regulares (versión 2009-04-27)
- Validación (versión 2009-04-27)
- Repaso 1 (versión 2009-04-27)

- Agenda de teléfonos (versión 2009-05-21)
- Biblioteca (versión 2009-05-21)
- Foro (versión 2009-05-21)
- Blog (versión 2009-05-21)
- Multiagenda (versión 2009-05-21)
- Ejercicios de repaso
  - Generador de formularios (pendiente de revisar)
  - Generador de <select> (pendiente de revisar)
  - Nonogramas (pendiente de revisar)
  - Campeones de fútbol (versión 2009-05-21)
  - Apuestas (versión 2009-05-21)

## Cambios realizados en las soluciones en el curso 2008/09

Los cambios realizados en las soluciones de los proyectos en el curso 2008/2009 con respecto al curso anterior son los siguientes:

- css: añadir input { font-family: monospace; }. El nombre de la hoja de estilo es mclibre_php_soluciones_proyectos_comun.css si es la hoja básica, si tiene algo más entonces en vez de _comun.css se llama _nombreEjercicio.css.
- funciones.php: cambiar la extensión de las bases de datos squlite, de squlite3 a squlite.
- funciones.php: cambiar a constantes las variables que no cambian (tamaños de los campos en la base de datos, número máximo de registros en la base de datos, etc.).
- funciones.php: zona horaria como constante, método de formulario (get o post) como constante.
- funciones.php: añadido ini_set('session.save_handler', 'files'); por si session.save_handler = user en php.ini. En el resto de páginas he puesto el include('funciones.php'); al principio de cada página.
- cabecera(): línea en blanco en código fuente páginas después de </head>.
- cabecera(): añadir parámetro a función cabecera para que ponga cursor o no (parámetro en segunda posición, usar constantes CABECERA_CON_CURSOR y CABECERA_SIN_CURSOR). El motivo para hacerlo es que si se pone document.getElementById('cursor').focus() en <body> y luego no hay ningún elemento con id="cursor", IE da un error.
- cabecera(): si hay CABECERA-CON_CURSOR, la llamada a cabecera con cursor sólo tiene que estar cuando la página contiene un formulario, en los mensajes de error tiene que llamarse a cabecera sin cursor.
- formularios: añadir maxlength a <input> en formulario (con el mismo valor que size).
- formularios: en el código fuente de la página, todo los atributos de un <input> salen en la misma línea.
- formularios: constante FORM_METHOD que indica si el método es get o post.
- al comprobar si ya existe un registro comprueba !=0 y no ==1 como hacía antes (para evitar que si hay dos registros en la base de datos no diga que no hay ninguno).
- eliminar espacios alrededor de comparaciones: == != >= <= etc.
- añadir espacios alrededor de operadores lógicos: && ||.
- sesiones: añadido ini_set('session.save_handler', ... para evitar incompatibilidades con algunas configuraciones de php.ini (por ejemplo, si está instalado Drupal).

## Soluciones Curso 2007/2008

Las soluciones proporcionadas durante el curso 2007/2008 se distribuyen bajo licencia AGPL 3 o posterior.

- Controles en formularios (versión 2008-02-21)
- Operaciones aritméticas (versión 2008-02-21)
- If ... elseif ... else ... (versión 2008-02-12)
- for (1) (versión 2008-02-12)
- Google Chart 1 (versión 2008-01-31)

- Agenda de teléfonos (versión 2008-02-26)
- Biblioteca (versión 2008-02-26)
- Foro (versión 2008-02-26)
- Blog (versión 2008-02-26)
- Agenda de teléfonos multiusuario (versión 2008-02-26)

## Soluciones Curso 2006/2007

Las soluciones proporcionadas durante el curso 2006/2007 se distribuyen bajo licencia GPL 2 o posterior.

- Agenda de teléfonos (versión 2007-02-23)
- Biblioteca (versión 2007-02-23)
- Foro (versión 2007-02-23)
- Blog (versión 2007-03-05)
- Agenda multiusuario (versión 2007-02-27)
- CompraVenta (versión 2007-02-27)
- Veterinaria (versión 2007-03-08)
- Foro multiusuario sin imágenes (versión 2007-03-13)

Esta obra está bajo una licencia de Creative Commons.