PHP Linux Moodle
PHP Linux Moodle
PHP Linux Moodle
Contenido dinámico
22 de abril de 2005
Thales-CICA 2005 Página 2
1. Páginas PHP 5
1.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2. Instalación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.2.1. Configuración . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.3. Primeros pasos con php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.3.1. Estructuras condicionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.3.2. Bucles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
1.4. Ejemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
1.4.1. Un ejemplo de Web con PHP . . . . . . . . . . . . . . . . . . . . . . . . . . 25
1.4.2. Representación gráfica de funciones con PHP . . . . . . . . . . . . . . . . . 31
2. MySQL 37
2.1. Introducción a las BDR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
2.2. Instalación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
2.2.1. Configuración del servidor . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
2.3. Inicio de MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
2.3.1. Aseguremos el servidor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
2.3.2. Un poco de comandos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
2.4. PHPMyAdmin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
2.4.1. Instalación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
2.4.2. ➥Base de datos cursolinux . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
2.5. PHP y MySQL: páginas web dinámicas. . . . . . . . . . . . . . . . . . . . . . . . . 59
2.5.1. Más sentencias de PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
2.5.2. Un ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
3. Moodle y PHP-Nuke 73
3.1. Entorno virtual de aprendizaje: Moodle . . . . . . . . . . . . . . . . . . . . . . . . 73
3.1.1. Introducción. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
3.1.2. Instalación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
3.1.3. Primeros pasos en la administración. . . . . . . . . . . . . . . . . . . . . . . 80
3.1.4. Nuestro primer curso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
3.1.5. Más configuración . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
3.2. PHP-Nuke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
3.2.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
3.2.2. Instalación de PHP-Nuke . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
3.2.3. Configuración básica del portal. . . . . . . . . . . . . . . . . . . . . . . . . . 95
3.2.4. Coppermine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
3
Thales-CICA 2005 ÍNDICE GENERAL Página 4
Páginas PHP
1.1. Introducción
Hace algún tiempo1 , la información de la Web era relativamente estática. El cliente/navega-
dor hacı́a una petición HTTP al servidor y éste le servı́a las páginas HTML que alguien habı́a
elaborado.
Este modelo se queda pequeño y tiene varios inconvenientes:
2. No enlaza con las bases de datos y aplicaciones que podamos tener en nuestra organización,
con lo que perdemos una gran cantidad de información o lo que es peor, debemos duplicarla
con el riesgo de desactualización.
En definitiva, podemos añadir más valor a la información si ésta es dinámica y se genera a petición
del usuario.
Con el paso del tiempo, se han inventado varios métodos para conseguir que la información se
genere de foma dinámica.
Los primeros en nacer fueron los Server Side Includes (SSI) y el interfaz Common Gateway
Interface (CGI).
Una página SSI es una página HTML con comandos incluidos que se ejecutan en el servidor
web. Por ejemplo, integrado con el código HTML se encuentra el SSI que nos detecta una cadena
e imprimirá un valor dependiendo de ésta:
<html>
...
<body>
1 En la escala temporal de Internet, varios años dan para mucho.
5
Thales-CICA 2005 Introducción Página 6
...
<!--#if expr="\"$DOCUMENT_URI\" = \"/linux/file.html\"" -->
En Linux
<!--#elif expr="\"$DOCUMENT_URI\" = \"/windows/file.html\"" -->
En Windows
<!--#else -->
Ni en Windows ni en Linux
<!--#endif -->
...
</body>
</html>
Es un avance, pero su potencia es muy limitada y complejo para sitios medianos y grandes.
CGI es un mecanismo estándar de comunicación entre un programa o script2 y un servidor web.
La limitación es que deben comunicarse de una manera determinada y poco eficiente. La entrada
del cliente web se pasa al programa a través del servidor web, según el mecanismo establecido. El
programa recibe la información, la procesa y devuelve el resultado al servidor web, que compone
la página definitiva. El mecanismo se presenta en la siguiente imagen:
Sin embargo, este mecanismo es muy rı́gido y al tener que invocar a un programa externo al
servidor web, es lento y consume muchos recursos tanto de memoria como de proceso.
Existen otros mecanismos para generar contenido dinámico, como los servidores de aplicaciones
Java3 , ColdFusion o ASP. Nuestro objetivo será conocer PHP, un lenguaje especialmente diseñado
para generar páginas web dinámicas, y fácil de aprender y ejecutar.
Haciendo un poco de historia4 , PHP comenzó en 1994 cuando Rasmus Lerdorf quiso dar un
paso más allá de los CGI. En los siguientes años evolucionó y comenzó a utilizarse en muchos sitios
web. Un gran salto se produjo en 1997 cuando Zeev Suraski y Andi Gutmans lo reescribieron
dando lugar a PHP 3.
En la actualidad disponemos de dos versiones estables de PHP, la 4 y la 55 . Ambas se basan
en un motor denominado Zend (la 5 en Zend II). La principal diferencia entre ambas es que la
versión 4 basa su programación en procedimientos y la 5, en cambio, está basada en objetos (POO
http://es.wikipedia.org/wiki/POO). En esta entrega, ası́ como el curso trabajaremos con la
versión 4.
PHP no solamente podemos utilizarlo en sistemas Linux/Unix, sino que está disponible en
multitud de plataformas, incluidas las Windows, siendo un gran competidor de ASP.
Datos recientes de Netcraft, estiman su uso en 18.455.683 dominios y 1.317.871 direcciones IP6 .
2 Puede estar escrito en varios lenguajes: C, Perl...
3 El estándar J2EE, está alcanzando su madurez y es adoptado por muchas empresas y organismos, pero su
complejidad es alta.
4 Para conocer mejor esta historia se puede consultar http://es.wikipedia.org/wiki/PHP
5 La primera versión estable vio la luz en julio de 2004
6 Seguramente os llamen la atención estos datos. Como ya sabéis, una IP puede dar soporte a múltiples dominios
virtuales.
La siguiente figura presenta la arquitectura de PHP. El interfaz SAPI permite integrarlo con
la mayorı́a de los servidores web existentes. Por supuesto con Apache, pero también con IIS, Zeus,
Netscape iPlanet, Java servlet, AOLServer, o Roxen.
Se pueden integrar módulos para conectarlo con bases de datos, servidores de directorios,
servidores de correo...
La sintaxis de PHP es similar a C, aunque hay caracterı́sticas que ha tomado “prestadas” de
Perl, C++ y Java.
PHP se ejecuta totalmente por el servidor web y al navegador le llega solamente código HTML.
Aunque es compatible con lenguajes de script como javascript que se ejecutan en el navegador,
con lo que podemos combinar ambas técnicas, si lo deseamos.
El siguiente código es una mezcla de HTML y PHP.
<html>
<? echo date("M d, Y H:i:s", time()); ?>
</html>
El circuito que se forma viene dado por la siguiente figura. El navegador (1) solicita una página
al servidor web. Éste ve que es una página con código PHP y la pasa al motor de PHP (2). Si es
necesario, interacciona con bases de datos u otros módulos (3 y 4). Cuando la página está generada,
se pasa al servidor web (5), que la traslada al cliente (6). Todo ello de una forma muy eficiente.
Resumiendo, PHP es un lenguaje de script que se ejecuta en el servidor web y permite que las
páginas sean dinámicas. Nos permite conexiones a bases de datos y muchas utilidades más. La
comparación con ASP de Microsoft es inmediata, pero, PHP es mucho mejor.
Páginas interesantes:
• http://www.rinconastur.com/php/
• http://jips.bankhacker.com/linux/apache/ssl/urlsphp.phtml
• http://www.desarrolloweb.com/directorio/programacion/php/
1.2. Instalación
Debian
Nos centraremos sólo en el módulo de php4 para Apache27 : libapache2-mod-php4
De los tres paquetes instalados, sólo el primero es imprescindible, los otros son:
php4-pear contiene archivos PEAR para php4. Esto es, numerosas clases para manejo más sencillo
y limpio de, p.ej., bases de datos.
php4-cgi suministra CGI. Los módulos compilados son bcmath, calendar, curl, dba, exif,
filepro, ftp, mm, sockets, wddx, xml, yp y zlib.
#apache2ctl restart
7
Es el paquete “importante” ya que nos va a permitir trabajar con código php embebido en html. No podremos
realizar scripts en lı́nea de comandos con php, para eso es necesario instalar el intérprete “completo”
pero en este caso, nos instalará a su vez Apache 1.3. Ası́ que no os lo recomendamos.
Red Hat/Fedora
Necesitamos el paquete8 php.
#apachectl restart
Hola Mundo
Ya tenemos php instalado, ejecutemos nuestro primer script:
# php -q prueba.php
Hola Mundo
/root
8 Viene en los CDs de Fedora
9
Pero no es la mejor forma de usarlo, ¿verdad?, veamos cómo usarlo dentro de una página web:
! Merece la pena pararse un poco en la salida del fichero anterior. En ella se nos informa del
estado del intérprete y del valor de las distintas directivas de configuración.
1.2.1. Configuración
php.ini
El fichero de configuración de php es
Fedora /etc/php.ini
Debian /etc/php4/apache2/php.ini
con él podemos controlar el comportamiento por defecto del intérprete. Nos centraremos en ana-
lizar el que se instala por defecto en Debian. A partir de él, comprender el de Fedora no presenta
dificultad.
Las directivas de este fichero mantienen las convenciones en cuanto a la sintaxis:
donde valor puede ser una cadena (error_log=syslog), un número (precision=14), una
constante de PHP (error_reporting=E_ALL), una de las constantes10 INI (On, Off, True,
False, Yes, No y None) o una expresión de constantes INI operadas con | (OR), & (AND), ~
(NOT) , ! (FALSE) o paréntesis ().
Las cabeceras de sección se indican encerrando el texto entre corchetes (por ejemplo [MySQL]).
! No es necesario conocer todas las directivas de este fichero ni para escribir script PHP ni para
seguir el resto de la entrega. El motivo de que se incluya es que os sirva de referencia por
si hay que ajustar el intérprete a casos particulares. De hecho, casi con toda seguridad no
tendremos que cambiar prácticamente ninguna directiva del fichero de configuración en un
uso normal de PHP. Por tanto: desde este punto hasta la sección Apache y php ( 1.2.1 en
la página 16) sólo habrı́a que dar una lectura por encima para conocer las posibilidades de
configuración.
Analicemos algunas directivas “importantes”. El fichero se inicia con la sección principal de confi-
guración del intérprete
[PHP]
Directivas generales
engine = On activa el intérprete de PHP como módulo de Apache.
short_open_tag = On si está en On, activa la posibilidad de que los scripts php se delimiten usan-
do etiquetas abreviadas <? ... ?>. Si es Off hay que usar <?php ... ?> o <script>.
asp_tags = Off si está en On permite el uso de etiquetas estilo ASP < % ... %>.
y2k_compliance = On hace cumplir la conformidad con el año 2000 (Causará problemas con
navegadores que no cumplan con esto).
...
...
;open_basedir = limita las operaciones que php puede realizar sobre archivos a los directorios
especificados (separados por :). Tal cual está, permite abrir todos los archivos. No
depende del valor de safe_mode
10 Para activar una directiva booleana es equivalente usar: 1, On, True o Yes.
Para desactivarla, podemos usar: 0, Off, False o No
11 Para ampliar sobre este tema: http://www.phpbuilder.com/manual2/manual/es/features.safe-mode.php
Lı́mites de recursos
max_execution_time = 30 tiempo máximo (en segundos) de ejecución de un script.
max_input_time = 60 tiempo máximo (en segundos) que un script puede invertir en analizar los
datos requeridos.
error_reporting = E_ALL & ~E_NOTICE muestra todos los errores y avisos (E_ALL), excluyendo
(~) las advertencias en tiempo de ejecución (E_NOTICE) del intérprete. Podemos usar
los parámetros recogidos en la tabla:
# Ejemplo
error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR
12 Si se piensa instalar Moodle (ya lo conocéis, ¿verdad?) es mejor poner este valor a 16M.
Manipulación de datos
;arg_separator.output = "&" separador usado por PHP para separar argumentos en las
urls generadas. Por defecto es &.
;arg_separator.input = ";&" lista de separadores usados por PHP para analizar una URL y
obtener las variables pasadas en ella. Por defecto es &.
variables_order = "EGPCS" establecemos el orden (de izquierda a derecha) en que PHP registra
las variables: GET, POST, Cookie, Entorno13 y variables internas (S). Tal cual está,
serı́a: Entorno, Get, Post, Cookie y Server.
register_globals = Off si se mantiene en Off impedimos que se creen automáticamente varia-
bles globales con los nombres de las variables pasadas como argumentos al script. Por
defecto está desactivada.
register_argc_argv = On le dice a PHP que declare las variables14 argv y argc.
post_max_size = 8M tamaño máximo permitido de los datos usando el método POST
magic_quotes_gpc = On el estar en On, añade una barra invertida antes de la comilla sencilla (’),
comilla doble (“), barra invertida (\) y los NUL en operaciones entrantes GET, POST
o Cookie.
auto_prepend_file = permite añadir el archivo especificado al final de todo fichero php ejecutado.
Se incluye como si fuese invocado por una llamada mediante la función include(). Si
se ponen a none, se desactiva la adición automática de archivos.
auto_append_file = permite añadir el archivo especificado al principio de todo fichero php eje-
cutado. Se incluye como si fuese invocado por una llamada mediante la función in-
clude().Si se ponen a none, se desactiva la adición automática de archivos.
default_mimetype = "text/html" tipo mime por defecto para la salida de datos.
Rutas y directorios
;include_path = ".:\php\includes" lista de directorios (separados por :) en los que las fun-
ciones require(), include() y fopen_with_path() buscarán los archivos requeridos.
Por defecto es el directorio “actual” (.).
doc_root = el raı́z desde donde se sirven las páginas. Usado si no está vacı́o.
user_dir = directorio desde el que php abre los scripts para un usuario (/~usuario). Si está
vacı́o, no se usa.
extension_dir =/usr/lip/php4 directorio desde donde cargar las extensiones dinámicas de los
módulos.
;cgi.rfc2616_headers = 0 informa a PHP del tipo de encabezados a usar cuando envı́a código
de respuesta HTTP. Si está a 0 (valor por defecto) envı́a Status: encabezado soportado
por Apache. Si está a 1, PHP enviará un encabezado RCF2616.
Subir ficheros
file_uploads = On permite subir archivos HTTP
upload_tmp_dir = directorio temporal para los archivos HTTP que hemos subido (si no se espe-
cifica, usará el del sistema por defecto)
Extensiones dinámicas
;extension=modulename.extension debemos usarlas si deseamos cargar extensiones automáti-
camente. Por ejemplo:
;extension=msql.so sólo debe estar el nombre del módulo, no es necesaria ninguna información
del directorio, ya que debemos especificar la localización de la extensión con la directiva
extension_dir. Nota: para Red Hat/Fedora la extensión de paquete de los módulos
se carga a través de los archivos ini en el directorio /etc/php.d
[Syslog]
define_syslog_variables = Off para definir o no las diversas variables syslog (ej. $LOG_PID,
$LOG_CRON). Es una buena idea ponerlo en off. En tiempo de ejecución podemos
definir estas variables con la llamada define_syslog_variables().
[MySQL]
mysql.allow_persistent = On permite o previene enlaces persistentes.
mysql.allow_persistent = -1 número máximo de enlaces persistentes (-1 equivale a: sin lı́mite).
mysql.max_links = -1 número máximo de enlaces (+número persistentes, -1 es sin lı́mite)
mysql.default_port = número de puerto por defecto para mysql_connect(). Si no se determi-
na, usará $MYSQL_TCP_PORT o la entrada en /etc/services o el valor de tiempo de
compilación definido en MYSQL_PORT (en ese orden).
mysql.default_socket = nombre de socket por defecto para las conexiones locales MySQL. Si
no se especifica, usa el que tiene por defecto MySQL.
mysql.default_host = host por defecto para mysql_connect() (no se aplica en modo “safe”)
mysql.default_user = usuario por defecto para mysql_connect() (no se aplica en modo “safe”)
[bcmath]
bcmath.scale = 0 número de cifras decimales para todas las funciones bcmath.
[browscap]
;browscap = extra/browscap.ini contiene información sobre las cadenas de identificación que
usa cada navegador.
[Session]
session.save_handler = files manipulador usado para guardar/recuperar datos.
;session.save_path = "N;/path" argumento pasado a save_handler. En el caso de archivos,
éste es el path donde se guardan los archivos de datos. Desde PHP 4.0.1 se define
como “N;/path” donde N es un entero. En lugar de guardar todos los archivos de sesión
en /path guardará los datos en subdirectorios de N niveles de profundidad (útil para
servidores que manejan gran cantidad de sesiones).
Nota: Php no crea esta estructura de directorios automáticamente. Para esto se puede
usar el script en ext/session dir. En Fedora está descomentada y vale /var/lib/php/-
session
;session.save_path = /var/lib/php4
session.use_cookies = 1 para usar cookies
session.use_only_cookies = 1 esta opción permite a los administradores proteger a los usua-
rios de ataques derivados de pasar la identidad de sesión en URLs, por defecto es
0.
session.name = PHPSESSID nombre de la sesión (usado como nombre de cookie).
session.auto_start = 0 inicia la sesión ante peticiones de arranque.
Apache y php
La interacción entre Apache y PHP se configura a través de:
Fedora /etc/httpd/conf.d/php.conf en él hay una serie de directivas que tienen que ver con
su instalación, y que comentaremos. En la siguiente lı́nea se carga el módulo de php con la
orden LoadModule:
Con
conseguimos que los archivos de extensión .php sean manejados por el intérprete de PHP,
y con la siguiente directiva, decimos qué páginas de un directorio15 pueden ser consideradas
de inicio (si no se especifica una página concreta). En este caso: index.php se añade a la
lista que ya existiera (index.html, index.htm, index.shtml...).
DirectoryIndex index.php
Debian el cometido del fichero anterior lo comparten los archivos:
/etc/apache2/mods-available/php4.conf
/etc/apache2/mods-available/php4.load
y los enlaces simbólicos a ellos (para que se active) del directorio /etc/apache2/mods-
enabled/
Con php4.load cargamos el módulo y con el fichero
$cat /etc/apache2/mods-available/php4.conf
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
conseguimos que los archivos de extensiones .php o .phps sean manejados por el intérprete
de PHP.
➥ Para practicar
Un ejemplo que simplemente esboza lo que podemos hacer con PHP es el siguiente, formado por los
ficheros prueba.html y accion.php
$cat prueba.html
<html>
<body>
<form action="accion.php" method="POST">
Su nombre: <input type=text name=nombre>
Su edad: <input type=text name=edad>
<input type=submit>
</form>
</body>
<html>
$cat accion.php
Hola <?php echo $nombre?>. Tienes <?php echo $edad?>a~
nos.
! Para poder trabajar con PHP tal cual aparece en el ejemplo hay que modificar una directiva
del fichero de configuración de php: php.ini. Esta directiva cambió su valor por defecto a partir
de la versión 4.2.0 de php (con versiones anteriores estaba en ON). Se trata de hacer que
register globals = ON, además hay que reiniciar apache:
Debian apache2ctl restart
Fedora apachectl restart
para que los cambios sean efectivos. Si se mantiene en OFF impedimos que se creen variables
globales con los nombres de las variables pasadas como argumentos al script.
Si ponemos esos ficheros en el raı́z del servidor Web y desde el navegador llamamos a prue-
ba.html veremos el resultado de mezclar formularios y php.
15 Cuando especificamos un directorio sin decir la página concreta (http://localhost o
http://localhost/pruebas, siendo el primer caso el directorio raı́z de los documentos y el segundo, un
directorio llamado pruebas, dentro de él)
PHP y HTML
Como ya hemos visto en los ejemplos anteriores el modo estándar16 de incrustar código PHP
en html es
<html>
<body>
<?php echo "Hola Mundo"; ?>
</body>
</html>
obtendrı́amos de salida el texto encerrado entre comillas (es que el dichoso Hola Mundo no puede
faltar)
Como es el servidor el que ejecuta el código PHP, el usuario nunca llega a ver el código
PHP, solamente el resultado en formato HTML, como podremos observar si en el navegador
seleccionamos la opción de “Ver código fuente”.
!
Como ya hemos dicho, el código PHP se inserta en las páginas HTML entre las etiquetas
<?php ?>; para insertar instrucciones HTML dentro de estas etiquetas se utiliza la
instrucción echo. Hace que la cadena entrecomillada (echo "Hola Mundo";) o variable
(echo $variable;) escrita a continuación se escriba en el documento HTML.
Las instruciones de PHP se cierran con un punto y coma17 . Uno de los errores más
comunes (y que más dolores de cabeza da) es que se nos olvide poner el punto y coma
final.
16 En realidad existen cuatro estilos diferentes de etiquetas para hacerlo:
Tipo Descripción
Integer Números enteros
Double Números en coma flotante
String Cadenas de caracteres
Boolean valor lógico: TRUE o FALSE
Array Matrices de datos del mismo tipo
Object Tipo especial de dato complejo
Comentarios
Disponemos de varias formas de introducir comentarios que aclaren el código, se trata de
Variables
Se pueden definir las variables como puntos de almacenamiento en la memoria del ordenador.
Durante la ”vida útil” de una variable siempre se puede acceder a los valores que ésta almacena,
siendo posible modificarlos.
Con PHP no es necesario declarar las variables (aunque es conveniente hacerlo), cuando se
utiliza una variable por primera vez, ésta se considera declarada. El nombre de cualquier variable
ha de empezar siempre con un signo de dólar ($). Además, la primera letra del nombre de la
variable no puede ser un número.
PHP soporta varios tipos de datos (véase la tabla 1.2) que se reconocen y asignan automáti-
camente. Los básicos son: string (texto), integer (número entero) y double (número de coma
flotante).
Cuidado, que PHP discrimina entre mayúsculas y minúsculas en los identificadores de las
variables. De esa forma, las dos variables siguientes son diferentes:
$mivariable=1;
$Mivariable=’uno’;
¿Qué se obtendrı́a?
Es decir, hemos pasado al script accion.php, de forma directa, las variables $nombre y $edad,
que provienen de los campos de tipo texto del formulario definido en el fichero prueba.
Como ya comentábamos en el ejemplo, para que eso sea posible, hemos tenido que modificar
el fichero de configuración de PHP. Pero podemos hacerlo de otra forma.
Hay tres formas de acceder a las variables de un formulario:
Estilo corto, es el comentado antes. Para eso es necesario poner register_globals en18 On.
Estilo intermedio19 . Surge a partir de la versión 4.1 de PHP. Consiste en recuperar las
variables del formulario en alguna de las matrices $_POST (si hemos usado el método POST),
$_GET (si lo enviamos por el método GET) y $_REQUEST (para ambos).
Estilo largo. Es el más “engorroso” pero funciona siempre. En este caso, las variables del for-
mulario las podemos recuperar a través de las matrices $HTTP_POST_VARS y $HTTP_GET_VARS
Arrays
“Un array es un conjunto de variables o registros del mismo tipo que puede estar almacenados
en memoria principal o en memoria auxiliar. Los arrays de 1 dimensión se denominan también
vectores, los de 2 o más dimensiones se denominan matrices. La forma de acceder a los elementos
del array es directo, es decir, el elemento deseado es obtenido a partir de su ı́ndice” http://es.
wikipedia.org/wiki/Array
A “grosso modo”, y sin entrar en más tecnicismos, podemos entender un array (table o matriz)
como un nombre que permite almacenar varios datos del mismo tipo, que son accesibles usando
el lugar que ocupan (comenzando desde el cero) o mediante una clave que los identifica (son los
arrays asociativos). En la página 30 vemos más ejemplos sobre su uso.
# Por ejemplo,
$semana= array("Lunes","Martes","Miércoles","Jueves","Sábado","Domingo")
o equivalentemente,
$semana[0]="Lunes";
$semana[1]="Martes";
$semana[2]="Miércoles";
$semana[3]="Jueves";
$semana[4]="Viernes";
$semana[5]="Sábado";
$semana[6]="Domingo";
Por ejemplo, para visualizar el 4o dato almacenado escribiremos
echo $semana[3]
Podemos usar un array asociativo para almacenar los datos de una persona20 :
$alumno = array(nombre=>"Thales", apellido=>"de Mile-
to", edad=>"16");
y accederemos a los datos con:
echo $alumno["nombre"];
echo $alumno["apellido"];
echo $alumno["edad"];
Constantes
Una constante (como su nombre indica) no puede modificar su valor, se definen usando la
palabra define
define[’iva’,16];
Operadores
Para conocer los operadores de PHP, os remitimos a la información disponible en la pági-
na http://www.php.net/manual/es/language.operators.php. Son los habituales en cualquier
lenguaje de programación. Aquı́ tenéis un pequeño ejemplo de algunos de ellos.
Funciones
PHP trae una gran cantidad de funciones que nos pueden facilitar de forma considerable la
realización de scripts (véase http://es2.php.net/manual/es/funcref.php). Además, podemos
definir funciones. La idea de función surge de la necesidad de no repetir el mismo código21 varias
veces. La forma general de definir una función es:
<?php
function foo ($arg_1, $arg_2, ..., $arg_n)
{
echo "Función de ejemplo.\n";
20 Es equivalente a usar:
$alumno[nombre]="Thales";
y ası́, con el resto de valores
21 También para facilitar su legibilidad
return $retval;
}
?>
# Por ejemplo, veamos una función que nos calcula el iva del valor pasado como argumento22 :
Para ejecutarla sólo hemos de llamarla con los parámetros adecuados, por ejemplo, con
echo iva(50,16);
obtendrı́amos de salida 8.
Básicamente, PHP permite trabajar con dos tipos de variables: locales y globales. Una variable
es local cuando su uso está restringido al ámbito23 de una función, es decir, sólo son accesibles
dentro del cuerpo de la función. Una variable global es visible en toda la secuencia de comandos.
Las variables globales se declaran anteponiendo la palabra global. Por ejemplo:
global $mysql_server;
# En la sección 2.5.2 en la página 65 sobre PHP y MySQL hay un script en el que es necesario
usar estas últimas (en él, además, hacemos uso de un par de funciones).
Reutilización de código
PHP dispone de dos instrucciones que permiten la reutilización del código, se trata de
include cuando el intérprete llega a esta instrucción, sustituye el nombre del fichero que aparece
entrecomillado por el código contenido en él. Existe otra instrucción parecida, que es
require.
require se evalúa antes de procesarse el fichero. Es decir, PHP recorre el fichero antes de
ejecutarlo, y donde encuentra un require, lo sustituye por el fichero ”requerido” en
cuestión, ejecutándose luego el código. Include en cambio, sólo se sustituye cuando el
intérprete llega a la instrucción.
if (condicion) {comandos_si_verdadera_condicion;}
else {comandos_falsa_condicion;}
sı́mbolo &
23 Con ámbito nos referimos a las zonas de código en las que es visible (y utilizable) una variable dada.
24 Se analiza un ejemplo un poco más complejo en la página 29.
! Un par de notas:
Se pueden anidar.
Notar que las expresiones relacionadas con estructuras if, funciones o bucles se suelen agru-
par mediante un par de llaves {}.
switch
Permite que se ejecute un bloque de instrucciones en función de un valor que tome una ex-
presión. Es similar a una instrucción if. pero permitiendo que la condición tome más de dos
valores.
La sintaxis es la siguiente:
switch (expresión)
{
case resultado1:
instrucciones;
break;
case resultado2:
instrucciones2;
break;
....
default:
instrucciones por defecto;
}
La sentencia switch ejecutará selectivamente los comandos que correspondan con la primera coin-
cidencia. Esto se ve mejor con un sencillo ejemplo:
Si el valor de $vehiculo coincide con automóvil, se ejecutará el comando echo "cuatro rue-
das" e irá al final. El otro patrón es similar, pero en el caso de que no coincida con ninguno, se
ejecutarán los comandos de la entrada default.
1.3.2. Bucles
for (y foreach)
Su sintaxis es:
# Por ejemplo
<?php
for ($i = 1; $i <=6; $i++ )
{
echo "El número es: ".$i."<br>";
}
?>
La sentencia foreach permite recorrer todos los elementos de una matriz de una forma sencilla,
su sintaxis es
while (condición) {
instrucciones;
}
<?php
$i=1;
while ($i <=6)
{
echo "El número es: ".$i."<br>";
$i++;
}
?>
El bucle do...while es similar al generado con la instrucción while. La diferencia estriba en que
si la condición es falsa, con el bucle while no ejecutamos ninguna instrucción, mientras que con
el do...while siempre se ejecuta al menos una vez.
<?php
$i=1;
do
{
echo "El número es: ".$i."<br>";
$i++;
}while ($i <=6);
?>
1.4. Ejemplos
1.4.1. Un ejemplo de Web con PHP
Como hemos comentado en la introducción, PHP es un sencillo lenguaje de secuencias de
comandos. Normalmente se escribe directamente en las páginas HTML y es el servidor Web quien
lo interpreta.
Para ver de una forma muy sencilla algunas de las cosas que se pueden hacer con PHP anali-
zaremos el código de los siguientes ejemplos que componen un sitio web25 :
index.php pagina2.php
inicio.php cabecera.php
pagina1.php menu-izq.php
Además, vamos a usar la siguiente hoja de estilo (estilo.css) que se lista a continuación.
1 H2 { t e x t −a l i g n : c e n t e r }
H3 { t e x t −a l i g n : c e n t e r }
#c a b e c e r a { margin−bottom : 10 px ;
background−c o l o r : #000099;
c o l o r : #f f c c 9 9 ;
6 padding : 3px ;
t e x t −a l i g n : c e n t e r ;
border −bottom−s t y l e : s o l i d ;
border −top−s t y l e : s o l i d ;
}
11
#i z q u i e r d a { padding : 5px ;
margin : 0px ;
25 Pondremos todos los ficheros en el servidor, en un fichero comprimido de nombre ejemplo-php.tgz
width : 10 %;
float : left ;
16 border −c o l o r : #000099;
border −s t y l e : s o l i d ;
border −width : 1px ;
background−c o l o r : #f f c c 9 9 ;
}
21
#c o n t e n i d o { padding : 10 px ;
margin− l e f t : 8 %;
float : left ;
width : 70 %;
26 border −c o l o r : #000099;
border −s t y l e : s o l i d ;
border −width : 1px ;
}
Listado 1.1: estilo.css
Cabecera
Izquierda Contenido
! Si no conocemos las hojas de estilo y estamos interesados en ellas, en internet existen multitud
de manuales que nos pueden ayudar sobre este tema. Una de las más interesantes es la Web
de la especificación de las hojas de estilo http://www.sidar.org/recur/desdi/traduc/
es/css/cover.html
Antes de analizar el código PHP de estas páginas, observaremos la página de inicio (index.php) a
través de un navegador web donde podemos ver las distintas partes que componen la página Web
y que se podrı́an reducir a:
cabecera
menú lateral izquierdo
contenido de la página
Si accedemos a los distintos enlaces del sitio desde el menú lateral izquierdo, podemos observar
que tanto éste, la cabecera y el estilo se mantienen, variando sólo el contenido central de las
distintas páginas.
Estarı́a muy bien, por lo tanto, no tener que escribir en cada página los elementos que se repiten
y escribir sólo lo que varı́a, que es el contenido central. Para ello podrı́amos pensar en generar
una especie de esqueleto e insertar en él los distintos elementos de la página. Lo podemos hacer
creando una página llamada index.php.
El código de las páginas php es el siguiente:
1 <html>
<head>
< t i t l e >PHP</ t i t l e >
<meta http−e q u i v=”Content−Type ” c o n t e n t=” t e x t / html ; c h a r s e t=i s o −8859−1
”>
<l i n k r e l=” s t y l e s h e e t ” type=” t e x t / c s s ” h r e f=” e s t i l o . c s s ”>
6 </head>
<body>
<d i v i d=” c a b e c e r a ”><?php include ” c a b e c e r a . php ” ; ?></div>
<h2>
Página de i n i c i o
3 </h2>
Listado 1.3: inicio.php
<h1>CABECERA</h1>
Listado 1.4: cabecera.php
<p>
<a h r e f=”i n d e x . php ” t i t l e =” I r a l a p á g i n a p r i n c i p a l ”>I n i c i o </a>
</p>
4 <p>
<a h r e f=”i n d e x . php? pag=p a g i n a 1 ” t i t l e =” I r a l a p á g i n a 1 ”>Página 1</a>
</p>
<p>
<a h r e f=”i n d e x . php? pag=p a g i n a 2 ” t i t l e =” I r a l a p á g i n a 2 ”>Página 2</a>
9 </p>
Listado 1.5: menu-izq.php
1 <h2>
Página 1
</h2>
<?php
6 // Se c r e a una t a b l a
echo ”<t a b l e summary = ’ ’ b o r d e r = ’1 ’ width =’100 %’> ” ;
<h2>
2 Página 2
</h2>
Dı́as de l a semana
7 <?php
$semana = array ( ”Lunes ” , ”Martes ” , ” M i é r c o l e s ” , ”J u e v e s ” , ” V i e r n e s ” , ”
Sábado ” , ”Domingo ”) ;
Como se puede observar, el código de esta página es similar al de una página HTML excepto por
las etiquetas <?php ?> que aparecen en él26 .
Podemos ver que hay definidos tres elementos DIV que es donde van las distintas partes de la
página.
Como primera parte del código a destacar, parémonos en los comentarios27 . Recordemos que
se pueden insertar comentarios de (al menos) dos formas:
<?php
$contenido;
if (isset($_GET[’pag’])){$contenido = $_GET[’pag’].".php";}
else {$contenido = "inicio.php";}
include $contenido;
?>
Si analizamos esta parte del código, vemos que en primer lugar se ha definido la variable
$contenido, que almacena el valor de la página a incluir en este elemento de la web.
Veamos ahora de dónde sale la variable $_GET[’pag’]. Si observamos los enlaces de menu-
izq.php nos encontramos:
Junto al nombre de la página introducimos una variable (pag) con valor = pagina1.28 En
nuestro caso definimos una variable $contenido. La variable $contenido puede ser:
• igual al valor de pag (que tomará los valores pagina1 o pagina2) junto a la cadena
”.php” en caso de estar definida $_GET[’pag’],
• o igual a ”inicio.php” si dicha variable no está definida (como ocurre en el primer enlace
del menú)29 .
26 El código incluido en las etiquetas <?php ?> es el código PHP que el servidor web interpreta, terminando todas
las instrucciones que aparecen entre estas dos etiquetas, en punto y coma.
27 Los comentarios no afectan a la ejecución del programa.
28 Se pueden adjuntar datos mediante la URL de esta forma, (method="GET") o bien mediante un formulario
(method="POST"). Se debe acceder a los datos adjuntos con la URL a través de la matriz $_GET.
29 Recordemos que se pueden concatenar strings y variables, bien escribiéndolas directamente unas a continuación
Si observamos el código de las páginas pagina1.php y pagina2.php veremos que hemos utilizado
la instrucción php: echo.
Hemos añadido \n al final de cada fila para añadir un salto de lı́nea y facilitar ası́ la lectura del
código HTML generado.
En la página pagina2.php definimos otro tipo de variables, los array o matrices, que como
hemos visto, pueden almacenar un conjunto de valores.
Se define una variable ($i=1), una condición ($i<6) y un patrón contador ($i++).
Las instrucciones que hay dentro del bucle se siguen realizando mientras que el valor de $i sea
menor que 6, sumando 1 a la variable $i cada vez que se realiza el bucle ($i++), de esa forma
construimos la tabla de la página 1.
Observar que en el fichero pagina2.php, para ejecutar el bucle, necesitamos contar primero el
número de elementos del array usando la función count($semana) (darı́a como resultado 7)
Para recorrer los elementos del array en el que se almacenan los dı́as de la semana, también
podemos usar la sentencia foreach, en ese caso quedarı́a:
1 <h2 >
Página 2
</ h2 >
Dı́as de la semana
6
<? php
$semana = array ( " Lunes " , " Martes " , " Miércoles " , " Jueves " , "
Viernes " , " Sábado " , " Domingo " ) ;
Para facilitar las rutas, vamos a trabajar en el directorio creado (aunque no es obligatorio).
$ cd phplot
$ chmod 644 phplot.php
! Documentación:
La disponible en la Web del programa y que se instala al descomprimir el programa.
Un tutorial sobre su uso http://www.programacion.net/php/tutorial/phpsol_phplot/
En nuestro ejemplo, vamos a crear una Web que nos va a permtir representar parábolas. Para
conseguirlo necesitamos dos ficheros:
formulario.html lo usaremos para introducir los coeficientes de la parábola, dominio de definición
y resolución gráfica.
parabola.php para obtener los datos de la parábola y pasar los datos a la librerı́a phplot
Analicemos su contenido
< !DOCTYPE HTML PUBLIC ”−//W3C//DTD HTML 4 . 0 1 T r a n s i t i o n a l //EN” ”h t t p : / /www.
w3 . o r g /TR/ html4 / l o o s e . dtd ”>
<html>
3 <head>
<t i t l e></ t i t l e>
</head>
<body>
<form action=” p a r a b o l a . php ” method=” p o s t ”>
8 C o e f i c i e n t e s de l a p a r á b o l a
<br>
a= <input type=” t e x t ” name=”a ” s i z e=”3 ” maxlength=”3 ”>
b= <input type=” t e x t ” name=”b ” s i z e=”3 ” maxlength=”3 ”>
c= <input type=” t e x t ” name=”c ” s i z e=”3 ” maxlength=”3 ”>
13 <br>
Dominio de d e f i n i c i ó n :
<br>
I n i c i o= <input type=” t e x t ” name=” x i n i ” s i z e=”3 ” maxlength=”3 ”>
F i n a l= <input type=” t e x t ” name=” x f i n ” s i z e=”3 ” maxlength=”3 ”>
18 <br>
Número de puntos a e v a l u a r ( por d e f e c t o 5 0 ) : <input type=” t e x t ”
name=” e v a l u a ” value=”50 ” s i z e=”3 ” maxlength=”3 ”>
<br>
<center>
<input type=”submit ” name=” R e p r e s e n t a r ”>
23 </ center>
</form>
</body>
</html>
Listado 1.9: formulario.html
Del formulario hay poco que comentar (salvo que el formato de salida es manifiestamente
mejorable -:) ). Lo utilizamos para introducir las 6 variables que necesitamos:
2 para el dominio de definición (x_ini y x_fin). Deberı́amos usar JavaScript para controlar
su valor y obligar a que no se puedan pasar valores incorrectos.
Y el script en php
<?php
// i n c l u i m o s l a c l a s e p h p l o t
i n c l u d e o n c e ( ” p h p l o t . php ”) ;
4
// v a l o r de i n i c i o d e l e j e x
$ i n i c i o=$ POST [ ” x i n i ” ] ;
// v a l o r f i n a l d e l e j e x
9 $ f i n a l=$ POST [ ” x f i n ” ] ;
// numero de puntos a e v a l u a r
$ e v a l u a=$ POST [ ” e v a l u a ” ] ;
14 // I n cr e m e n t o en cada paso .
//Lo obtenemos d i v i d i e n d o l a amplitud d e l i n t e r v a l o
// e n t r e e l número de puntos a e v a l u a r
//No s e c o n t r o l a su v a l o r
$paso =( $ f i n a l −$ i n i c i o ) / $ e v a l u a ;
19
// Parámetros de l a p a r á b o l a . No s e t e s t e a e l v a l o r
// de a , s i e s c e r o s e p i n t a r á una r e c t a
$a=$ POST [ ”a ” ] ;
$b=$ POST [ ”b ” ] ;
24 $c=$ POST [ ”c ” ] ;
// Valor i n i c i a l d e l c o n t a d o r
$ i=$ i n i c i o ;
29 // D e f i n i m o s e l a r r a y que c o n t i e n e l o s v a l o r e s a r e p r e s e n t a r
// e l f o r m at o de cada dato e s ( e t i q u e t a , x , y )
while ( $ i<=$ f i n a l ) {
$ d a t o s=array ( ” ” , $ i , $a ∗ $ i ∗ $ i+$b ∗ $ i+$c ) ;
$data [ ] = $ d a t o s ;
34 $ i=$ i+$paso ;
}
// Tı́ t u l o d e l g r á f i c o
44 // e s m e j o r a b l e e l f o r m at o de s a l i d a
$ g r a f i c o −>S e t T i t l e ( ” G r á f i c a de y=( ” . $a . ”) xˆ2+( ” . $b . ”) x+( ” . $c . ”) ”) ;
// Tipo d e l g r á f i c o , en e s t e c a s o ” l i n e s ”: une
// Grosor de l a lı́ n e a
$ g r a f i c o −>SetLineWidth ( 3 ) ;
54 // Longitud de l a s r a y i t a s de l o s e j e s en pı́ x e l
$ g r a f i c o −>S e t T ic k L e ng t h ( 1 ) ;
// I n cr e m e n t o d e l e j e y
//En e s t e e j e m p l o no l o usamos y dejamos que l o
59 // r e p r e s e n t e de forma a u t o m á t i c a
// $ g r a f i c o −>S e t V e r t T i c k I n c r e m e n t ( 1 0 ) ;
// I n cr e m e n t o d e l e j e X
//En e s t e c a s o numeramos e l e j e X de uno en uno
64 // a p a r t i r d e l v a l o r i n i c i a l
$ g r a f i c o −>S e t H o r i z T i c k I n c r e m e n t ( 1 ) ;
// E t i q u e t a s de l o s e j e s
$ g r a f i c o −>SetXLabel ( ”Eje X”) ;
69 $ g r a f i c o −>SetYLabel ( ”Eje Y”) ;
// Pasamos a PHPlot l o s d a t o s d e l g r á f i c o
$ g r a f i c o −>SetDataValues ( $data ) ;
?>
Listado 1.10: parabola.php
while ($i<=$final){
$datos=array("",$i,$a*$i*$i+$b*$i+$c);
$data[]=$datos;
$i=$i+$paso;
}
Con este bucle construimos la matriz de datos que usaremos para representar nuestra
parábola. Los datos que usa phpplot son un array cuyos datos son a su vez otro array.
Cada uno de los datos tiene la forma (etiqueta, valor eje x,valor eje y). Por eso, lo que
hacemos es recorrer el dominio de definición de la función ($i<=$final) avanzando
en cada iteración el valor de paso (obtenido al dividir la amplitud del intervalo entre
el número de puntos a evaluar).
En cada punto a evaluar creamos un array de nombre datos en el que almacenamos
los valores
com/doc/user_functions.html
36 Como dominio se ha tomado [0, 5]
MySQL
A menudo la gente se pregunta “¿Cómo es que tengo que obtener una licencia para el servidor
de MySQL simplemente porque estoy ejecutando Windows?” Es una pregunta razonable
y tiene una respuesta razonable.
...
Todo esto quiere decir que mientras los costes de desarrollo de sotware en UNIX son práctica-
mente cero, en WINDOWS pueden ser considerables. A los desarrolladores de MySQL les
gusta trabajar en MySQL, pero no tanto como para que quieran pagar por ese privilegio.
Los costes de desarrollo en Windows deben recuperarse de algún modo y el coste de la
licencia es el método empleado.
Además, los desarrolladores se han encontrado con que necesitan emplear mucho más tiempo
para el desarrollo en Windows que en UNIX. (MySQL, Paul DuBois, Edit. Prentice
Hall)
2. En el nivel conceptual se describe la estructura de toda la base de datos para una comunidad
de usuarios (todos los de una empresa u organización), mediante un esquema conceptual.
Este esquema oculta los detalles de las estructuras de almacenamiento y se concentra en
describir entidades, atributos, relaciones, operaciones de los usuarios y restricciones. En este
nivel se puede utilizar un modelo conceptual o un modelo lógico para especificar el esquema.
1 Relational DataBase Management System (RDBMS) en la lengua de Chespir ;-).
37
Thales-CICA 2005 Introducción a las BDR Página 38
3. En el nivel externo se describen varios esquemas externos o vistas de usuario. Cada esquema
externo describe la parte de la base de datos que interesa a un grupo de usuarios determinado
y oculta a ese grupo el resto de la base de datos. En este nivel se puede utilizar un modelo
conceptual o un modelo lógico para especificar los esquemas.
El modelo relacional fue propuesto originariamente por E.F. Codd en 1970 y se basa en la teo-
rı́a de conjuntos y la lógica de predicados de primer orden. Sin entrar en demasiados formalismos,
significa que un sistema relacional almacena y recupera datos que están en forma de relaciones,
que más gráficamente las vemos como tablas.
A muchos os parecerá que la tabla es la manera natural de guardar los datos, pero esto no
ha sido siempre ası́, ni dentro de algún tiempo será lo común. Estructuras en forma de árbol,
jerárquicas o en red se han usado para representar los datos, y la tendencia actual es a guardar
“objetos”.
Un Sistema Gestor de Bases de Datos Relacionales se encarga de administrar múltiples Bases
de Datos Relacionales. Una Base de Datos Relacional almacena los datos en tablas separadas, pero
que se pueden relacionar entre sı́.
Las siglas SQL que en parte dan nombre a MySQL, provienen de “Structured Query Language”2 .
SQL es un lenguaje de definición y acceso a las Bases de Datos Relacionales y está definido por el
estándar ANSI/ISO SQL. Desde 1986 han surgido varias versiones del estándar. Las de uso más
común son “SQL-92”, referida a la versión surgida en 1992, “SQL:1999” y “SQL:2003” que es la
versión actual del estándar.
Cada tabla representa a una entidad del universo que estamos modelando y consiste en una
serie de filas (o tuplas) y de columnas (o atributos). Cada fila de una tabla tiene el mismo número
de columnas y representa una instancia de esa entidad. Cada columna representa un atributo o
propiedad de la entidad y es de un tipo determinado.
2 Lenguaje de Consultas Estructurado, pero el peso de la historia hace que siempre hablemos de Ese-ku-ele.
La siguiente tabla, de nombre “CURSO”, posee cuatro columnas denominadas: Número, Nom-
bre, Apellidos y Fecha Nacimiento. Existen tres filas de datos, cada una correspondiente a un
alumno de dicho curso, con sus atributos: número en la clase, nombre, apellidos y fecha de na-
cimiento. Cada atributo será de un tipo; por ejemplo, Nombre y Apellidos serán cadenas de
caracteres, Número será un valor entero y Fecha Nacimiento será de un tipo fecha, si existe en
nuestro sistema. La primera fila que representamos es una cabecera que contiene los nombres de
las columnas y no son datos de la tabla.
Número Nombre Apellidos Fecha Nacimiento
1 Juan Pérez Gil 07/01/1992
2 Dolores Fuertes Cabeza 12/03/1991
3 Carmelo Cotón Rojo 22/10/1991
Una de las grandes ventajas del modelo relacional es que define un método de manipulación de
los datos mediante el “álgebra relacional”. Todas las manipulaciones posibles sobre las relaciones
se obtienen gracias a la combinación de tan sólo cinco operadores: SELECT, PROJECT, TIMES, UNION
y MINUS. Por comodidad, se han definido también tres operadores adicionales que de todos modos
se pueden obtener aplicando los cinco fundamentales: JOIN, INTERSECT y DIVIDE. Los operadores
relacionales reciben como argumento una relación o un conjunto de relaciones y devuelven una
única relación como resultado.
Veamos brevemente estos ocho operadores:
SELECT: devuelve una relación que contiene un subconjunto de las tuplas de la relación a la
que se aplica. Los atributos se quedan como estaban. También se denomina RESTRICT.
PROJECT: devuelve una relación con un subconjunto de los atributos de la relación a la que
se ha aplicado. Las tuplas de la relación resultado se componen de las tuplas de la relación
original, de manera que siguen siendo un conjunto en sentido matemático.
TIMES: se aplica a dos relaciones y efectúa el producto cartesiano de las tuplas. Cada tupla de
la primera relación está concatenada con cada tupla de la segunda.
JOIN: se concatenan las tuplas de dos relaciones de acuerdo con el valor de un conjunto de sus
atributos.
UNION: aplicando este operador a dos relaciones compatibles, se obtiene una que contiene las
tuplas de ambas relaciones. Dos relaciones son compatibles si tienen el mismo número de
atributos y los atributos correspondientes en las dos relaciones tienen el mismo dominio.
MINUS: aplicado a dos relaciones compatibles, devuelve una tercera que contiene las tuplas que
se encuentran sólo en la primera relación.
INTERSECT: aplicado a dos relaciones compatibles restituye una relación que contiene las
tuplas que existen en ambas.
DIVIDE: aplicado a dos relaciones que tengan atributos comunes, responde con una tercera que
contiene todas las tuplas de la primera relación que se puede hacer que correspondan con
todos los valores de la segunda relación.
Por ejemplo, la operación
SELECT CURSO donde FechaNacimiento > 05/05/1991
devolverá la relación:
Número Nombre Apellidos Fecha Nacimiento
1 Juan Pérez Gil 07/01/1992
3 Carmelo Cotón Rojo 22/10/1991
en la que no aparece la tupla que no cumplı́a la condición de una fecha de nacimiento mayor
del 05/05/1991. Al ataque con MySQL.
2.2. Instalación
Fedora
Instalemos los paquetes que permiten disponer de la base de datos MySQL3
y activémosla:
# service mysqld start
Lo mejor es usar ntsysv para que se active en el arranque.
Como vamos a trabajar con el módulo que pemite a PHP disponer de soporte de base de datos
MySQL, lo instalamos a su vez:
Debian
# apt-get install mysql-server mysql-client mysql-common mysql-doc
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias... Hecho
Se instalarán los siguientes paquetes extras:
libdbd-mysql-perl libdbi-perl libmysqlclient12 libnet-daemon-
perl libperl5.8 libplrpc-perl perl perl-base
perl-modules
Paquetes sugeridos:
3 El último no es estrictamente necesario. Todos ellos están en los CDs de Fedora
Como nuestra intención es trabajar con PHP y MySQL instalemos, además, el módulo ade-
cuado6 :
#apt-get install php4-mysql
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias... Hecho
Se instalarán los siguientes paquetes NUEVOS:
php4-mysql
0 actualizados, 1 se instalarán, 0 para eliminar y 730 no actualizados.
Necesito descargar 21,2kB de archivos.
Se utilizarán 119kB de espacio de disco adicional después de desempa-
quetar.
Debian /etc/mysql/my.cnf
Fedora /etc/my.cnf
[sección] indica que se inicia una sección. Los parámatros incluidos dentro de una sección afectan
sólo a ésta.
opcion = valor
Usando este fichero podremos, por ejemplo, optar por el tipo de tabla predeterminado o que
los mensajes de error aparezcan en castellano. En general, para un trabajo normal no es necesario
modificar nada en este fichero, salvo conseguir que los mensajesde error se muestren en castellano
10
[mysqld]
....
language = /usr/share/mysql/spanish
....
8 Para ampliar y si hemos instalado el paquete mysql-doc:
file:///usr/share/doc/mysql-doc/manual_Using_MySQL_Programs.html#Program_Options
9 /usr/share/doc/mysql-sever-x-x-x/ en Fedora
10 Y, en su caso, permitir accesos vı́a red. Por defecto, sólo se permite accesos desde el bucle local:
bind-address = 127.0.0.1
Si deseamos conectar desde otra máquina, habrá que permitirlo haciendo que el servidor escuche en el interfaz de
red. Por ejemplo, si nuestra IP local es 192.168.0.1 escribiremos
bind-address = 192.168.0.1
root@guada04:~# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5 to server version: 4.0.24_Debian-5-log
Type ’help;’ or ’\h’ for help. Type ’\c’ to clear the buffer.
mysql>
mysql> quit
Pero todavı́a no vamos a salir. Veamos antes un par de ejemplos de cómo trabajar con él. En
primer lugar listaremos las dos bases de datos que ya hay creadas, se consigue con el comando
En las sentencias, da igual que los escribamos en mayúsculas o no. No es ası́ en los nombres
de los campos, tablas, bases de datos, etc.
mysql> exit
Bye
11 MySQL no es casesensitive (sensible a mayúsculas y minúsculas) en cuanto a los comandos, es decir, que
sh-2.05b$ mysql
ERROR 1045: Access denied for user: ’root@localhost’ (Using pass-
word: NO)
ası́ que, avisemos al servidor MySQL de quién somos (-u root, es decir el usuario root) y que,
además, vamos a introducir la contraseña (-p)
Pero sigamos. Demos un breve repaso a algunos comandos básicos. Creemos una base de datos13
(que luego borraremos)
Pero sólo hemos creado la base de datos, ası́ que está vacı́a. Creemos una tabla (muy simple)
que va a contener sólo dos campos: nombre y apellidos, serán de tipo texto de un máximo de
20 caracteres, longitud variable (VARCHAR) y no permitimos que ninguno de los dos quede vacı́o14
(not null)
mysql> USE prueba;
Database changed
mysql> CREATE TABLE datos(nombre VARCHAR(20) not null, apellidos VAR-
CHAR(30) not null);
Query OK, 0 rows affected (0.06 sec)
En primer lugar, usamos la base de datos en la que crearemos la tabla, para después crearla.
Comprobemos las tablas creadas con15 :
13 De forma equivalente, podemos usar:
#mysqladmin -u root -p create prueba
14 Formalmente hablando, si espeficamos que una columna es NOT NULL obligamos a que la columna no pueda
contener valores NULL. Pero didácticamente es más sencilla y efectiva la idea de campo vacı́o o no vacı́o.
15 Con:
Pero deseamos que el usuario Thales pueda manejar esta base de datos (tal cual está, sólo el root
tiene acceso a ella). Ası́ que lo autorizamos con:
1. Comprobar que ahora el usuario al que hayamos dado permiso con la lı́nea anterior, puede
acceder a esta base de datos. Habrá que conectarse al servidor con:
$mysql -u usuario -p
e introducir la contraseña “password”
2. Si hemos permitido accesos vı́a red y deseamos que nuestro usuario Thales pueda conectar de
forma remota desde cualquier IP (eso significa el %) escribiremos
mysql> GRANT ALL ON prueba.* TO thales@’ %’ IDENTIFIED BY ’password’;
Query OK, 0 rows affected (0.00 sec)
Si nuestro servidor de bases de datos está a la escucha en la IP 192.168.0.1, para conectar,
usaremos el comando
! Usando
17
GRANT16 y REVOKE podemos conceder y retirar, respectivamente, derechos a los usua-
rios de cuatro maneras distintas: a nivel global, de base de datos, de tablas o de columnas.
Los objetos a los que se puede conceder cada privilegio son:
donde
Sin que nuestro sufrido usuario se entere de que podı́a conectar, nos arrepentimos y le revocamos
los privilegios concedidos con:
! El comando SELECT es quizás el más utilizado cuando trabajamos con MySQL. Sirve para
recuperar las filas de una base de datos que cumplan con los criterios especificados. Su
sintaxis es “potente y compleja”, permite usar operadores de comparación y recuperar datos
combinados de varias tablas. Más adelante, cuando estudiemos el programa phpMyAdmin
( 2.4) y la integración de PHP y MySQL ampliaremos sobre su uso.
Tras esta pequeña introducción dejemos las cosas (casi) como estaban, ası́ que antes de seguir
borremos la base datos19 :
El número de sentencias y posibilidades es muy grande, ası́ que pensando en gente “desmemoriada”
como nosotros, mejor si usamos: PHPMyAdmin
2.4. PHPMyAdmin
Se trata de un conjunto de scripts de php que permiten gestionar bases de datos MySQL usando
un navegador web. Usándola, y sin conocer las sentencias de MySQL, es posible (entre otras cosas)
gestionar los permisos de acceso de los distintos usuarios a las bases de datos o tablas, ası́ como
consultar, crear, borrar, modificar bases de datos o tablas.
La web principal es http://www.phpmyadmin.net/home_page/ y la última versión estable la
podemos bajar de http://www.phpmyadmin.net/home_page/downloads.php
2.4.1. Instalación
! Si usamos Debian, podemos instalarlo con:
#apt-get update
#apt-get install phpmyadmin
19 Con este comando podemos borrar, a su vez, una tabla.
El que para Fedora no exista el paquete en los repositorios oficiales, añadido a la facilidad
de instalación si usamos el paquete comprimido, nos ha hecho optar por el método general
común a ambas distribuciones.
# cp phpMyAdmin-2.6.1-pl3.tar.bz2 /var/www/
# cd /var/www/
# tar -xjvf phpMyAdmin-2.6.1-pl3.tar.bz2
Una vez desempaquetado, os recomendamos que le cambiéis el nombre al directorio o que, usando
un enlace simbólico, facilitéis el acceso a él desde el navegador web tecleando menos
En el directorio creado, tenemos dos ficheros que nos explican la forma de finalizar la instalación,
se trata de Documentation.txt o Documentation.html. En resumen, los pasos a seguir son:
$cfg[’PmaAbsoluteUri’] = ’http://localhost/phpMyAdmin/’;
Si hemos puesto contraseña para acceder al motor de base de datos, nos aparecerá el error
y tendremos que configurar adecuadamente las variables:
20 En Fedora hay que adecuar lo que sigue al DocumentRoot de Apache: /var/www/html
21 Si no tenemos un nombre de máquina completamente cualificado, podemos optar por escribir localhost.
22
Si no hemos puesto contraseña de acceso al gestor de base de datos, se nos avisará además de que:
“Su archivo de configuración contiene parámetros (root sin contraseña) que corresponden a la cuenta privi-
legiada predeterminada de MySQL. Su servidor de MySQL está usando estos valores, que constituyen una
vulnerabilidad. Se le recomienda corregir esta brecha de seguridad.”
Si nos aparece en inglés sólo hemos de optar por el idioma adecuado.
$cfgServers[$i][’user’]= ’root’;
$cfg[’Servers’][$i][’password’] = ’contrase~
na’;
con ellas, definimos el usuario y contraseña que usará el programa para iniciar la conexión
con el servidor MySQL.
# cat .htaccess
AuthType Basic
AuthName "phpMyAdmin"
AuthUserFile /var/www/passwd/.htpasswd
AuthGroupFile /dev/null
require user thales
! Actualizar: Para actualizar a una versión más moderna, sólo hay que descomprimir la nueva
versión en el lugar adecuado (raı́z de Apache) y copiar el fichero viejo config.php.inc a la
nueva situación.
Con phpMyAdmin
Mediante este ejemplo, introduciremos los conceptos básicos para trabajar con bases de datos.
La base de datos de ejemplo va a constar incialmente de dos tablas.
23 EnFedora, htpasswd y ajustar el DocumentRoot
24 Si
bien aparecen en la capturas gráficas, hemos optado “por sacarlos” de ellas para facilitar su lectura y no tener
que agrandar en exceso los gráficos.
La tabla alumnos, que constará de los campos: codigo, nombre, apellido1, apellido2,
curso y dni
El único campo extraño es codigo, va a ser la clave principal, la generará el propio MySQL
y nos va a permitir (después) establecer una relación uno varios (un alumno puede tener
varias faltas) entre ambas bases de datos.
La tabla faltas, de estructura: codigo, fecha
Lo primero será crear la base de datos. Iniciamos la aplicación, escribimos el nombre de nuestra
base de datos y pulsamos sobre [Crear]
Type ’help;’ or ’\h’ for help. Type ’\c’ to clear the buffer.
Campo se trata del nombre del campo en el que vamos a almacenar los datos.
Tipo básicamente disponemos de tres tipos de datos en MySQL: numéricos, de cadena y fechas.
Seleccionar el tipo y tamaño que mejor se adecúen a nuestra base de datos no es tarea sencilla,
aunque para comenzar podemos permitirnos ciertos lujos que seguro que en la “facultad”
serı́an gravemente penalizados. Las tablas 2.2 en la página siguiente, 2.4 en la página 53, 2.6
en la página 54 y 2.7 en la página 54, resumen los tipos soportados25 .
Longitud/Valores aquı́ introduciremos los tamaños máximos para nuestros campos o, en el caso
de enumeraciones o conjuntos, los posibles valores a tomar.
# Por ejemplo, el campo codigo lo dejamos con el valor por defecto (de 0 a 255). El
campo nombre tendrá una anchura máxima de 20 caracteres que si no rellenamos en
su totalidad, no ocuparán espacio26 (tipo VARCHAR). Sin embargo, el campo dni está
limitado a 8 pero de tipo CHAR: aunque un dni tenga 5 dı́gitos se completará con espacios
en blanco hasta llegar a los 8. El campo curso es una enumeración de posibles valores
1, 2, 3 y 4.
Atributos se puede dejar vacı́o o ser27 : BINARY (si se opta por este atributo, hacemos distinción
entre mayúsculas y minúsculas), UNSIGNED o UNSIGNED ZEROFILL.
Nulo si optamos por null , permitimos que ese campo se pueda dejar vacı́o. Si optamos por not
null obligamos a que se tenga que rellenar de forma obligatoria.
# Observar que salvo la columna en donde se almacenará el segundo apellido (en previsión
de inmigrantes que provengan de paı́ses en el que sólo usan el primer apellido) el resto
de campos hay que rellenarlos de forma obligatoria.
# En el ejemplo, y como este año tenemos muchos primeros de ESO, hemos optado por
poner un 1. Un caso un poco más real28 puede ser: una base de datos en la que almacenar
el domicilio de nuestos alumnos y optar por poner como valor predeterminado del campo
“provincia” aquella en la que se sitúe el centro de enseñanza.
Extra si deseamos que el campo se autoincremente cada vez que introduzcamos un registro,
optaremos por marcar auto_increment. Sólo puede usarse con tipos enteros. Los campos
de este tipo se usan en general para las claves principales y sólo puede existir uno por tabla.
Este tipo de columnas debe estar indexadas.
Primaria si marcamos esta casilla, la columna se tratará como clave principal de la tabla y
se indexará de forma automática. Las entradas en esta columna han de ser únicas.
Índice usar ı́ndices es el mejor método para hacer las consultas más rápidas.
Único con UNIQUE obligamos a que en esa columna no puedan existar datos repetidos.
# El dni es un buen ejemplo de ello. Podemos tener varias personas con el mismo nombre
y apellidos pero no deberı́an existir dos con el mismo dni
28 O al menos eso os deseamos -;)
Nota: Los tipos binarios discriminan entre mayúsculas y minúsculas (CHAR y VARCHAR lo admiten como
opción).
Los atributos NULL y NOT NULL se pueden especificar para cualquiera de los tipos (el predeterminado
es NULL).
L es la longitud de la cadena y M el ancho fijo.
Texto Completo si optamos por marcar esta casilla, crearemos un ı́ndice ”especial” de tipo
FULLTEXT, con un ı́ndice de este tipo (sólo se usa con tablas MyISAM29 ) para columnas del
tipo CHAR, VARCHAR o TEXT. Con bases de datos muy grandes es mejor no usarlos.30
Al pulsar sobre [Grabar]31 obtendremos una nueva ventana desde la que podremos modificar los
valores de todos los campos introducidos hasta ahora, añadir nuevos campos o borrar algunos de
los existentes.
29 En realidad, esto no es una limitación seria ya que son las las tablas que usa MySQL desde la versión 3.23. Son
# ls -al /var/lib/mysql/cursolinux
total 16
-rw-rw---- 1 mysql mysql 8712 abr 1 17:58 alumos.frm
-rw-rw---- 1 mysql mysql 0 abr 1 17:58 alumos.MYD
-rw-rw---- 1 mysql mysql 1024 abr 1 17:58 alumos.MYI
el primero (.frm) contiene la estructura de la tabla, el segundo (.MYD) contendrá los datos y el tercero (.MYI) los
ı́ndices asociados a esa tabla.
' $
mysql> CREATE TABLE ‘alumnos‘ (
‘codigo‘ TINYINT UNSIGNED NOT NULL AUTO_INCREMENT ,
‘nombre‘ VARCHAR( 20 ) NOT NULL ,
‘apellido1‘ VARCHAR( 15 ) NOT NULL ,
‘apellido2‘ VARCHAR( 15 ) ,
‘curso‘ ENUM( ’1’, ’2’, ’3’, ’4’ ) DEFAULT ’1’ NOT NULL ,
‘dni‘ CHAR( 8 ) NOT NULL ,
PRIMARY KEY ( ‘codigo‘ ) ,
INDEX ( ‘apellido1‘ , ‘apellido2‘ ) ,
UNIQUE (
‘dni‘
),
FULLTEXT (
‘dni‘
&) %
Creemos ahora la segunda tabla. Para ello, en la parte izquierda del navegador, pulsemos sobre la
base de datos sobre la que vamos a crear la nueva tabla (cursolinux) y en la página mostrada
introduciremos el nombre de la tabla (faltas) ası́ como el número de campos (2)
Para volver a la página inicial, pulsaremos sobre Página de Inicio (parte superior derecha
de la ventana)
mysql> CREATE TABLE ‘faltas‘ (
‘codigo‘ TINYINT NOT NULL ,
‘fecha‘ TIMESTAMP( 6 ) NOT NULL ,
INDEX ( ‘codigo‘ )
);
En este caso, acabamos de usar un nuevo tipo de columna. Se trata del tipo fecha timestamp
de longitud 6, eso significa que nuestras fechas serán del tipo AAMMDD (véase la tabla 2.7 en la
página 54). El resto no presenta problemas, indexamos por el código para optimizar las búsquedas
y no permitimos campos vacı́os.
Ya vimos que usando el comando INSERT ( en la página 45) podı́amos hacerlo, pero en general
y en espera de usar php y formularios Web, la mejor forma de hacerlo es usando un archivo auxiliar
que contenga los datos. En primer lugar, vamos a usar el interfaz Web de phpMyAdmin, pulsemos
sobre la tabla alumnos para acceder a
mysql> INSERT INTO ‘alumnos‘ ( ‘codigo‘ , ‘nombre‘ ,
‘apellido1‘ , ‘apellido2‘ , ‘curso‘ , ‘dni‘ )
VALUES (
", ’Pepe’, ’Pinto’, ’Gorgorito’, ’1’, ’12345678’
);
Notar que:
Desde esta página y si introducimos algunos registros más, podemos comprobar la potencia y
versatilidad del comando SELECT. Las pestañas del gráfico 2.1 en la página anterior no comentadas
aún, nos permiten32 :
Estructura nos permite modificar la estructura de la tabla (es la captura gráfica 2.1)
Exportar nos permite exportar los datos y la estructura de nuestra tablas a varios formatos
estándar.
32 Para bases de datos, las opciones son: Estructura, SQL, Exportar, Buscar, Generar una consulta y
Operaciones para realizar distintas operaciones sobre ella: cambiarle el nombre, el orden,
copiarla a otra base de datos, tabla, etc
Vaciar con esta opción podemos eliminar los registros de nuestra tabla.
➥ Insertar registros desde un fichero. Vamos a realizar algunas funciones más con el par de
alumnos que hemos introducido
1. Desde la pestaña Exportar exportemos los datos (no la estructura) a formato SQL
enviándolos a un archivo descargable de nombre datos_alumnos.sql.
Si lo visualizáis después de exportarlos, su contenido33 será similar a:
como siempre, lo importante son las dos últimas lı́neas, el resto son comentarios. Con este
fichero podremos insertar datos en nuestra tabla alumnos.
2. Borremos los datos introducidos desde la pestaña Vaciar (la pestaña Examinar se
pondrá “negra”)
De esta forma, estamos introduciendo datos desde un fichero de texto que podrı́a estar
preparado por nosotros previamente. Podemos comprobar que todo ha ido bien recargando
phpMyAdmyn y tras llegar a la ventana Examinar, ver que tenemos de nuevo a nuestros
dos alumnos.
4. Exportemos ahora de nuevo la tabla, pero esta vez dejando marcada la opción de exportar la
Estructura. El resto igual que antes. El resultado final del fichero de nombre alumos.sql
será34
33 Si no se exporta a un fichero externo se muestra el resultado en el navegador.
34 Aquı́ hemos eliminado algunos comentarios.
Usando este fichero podremos crear la tabla alumnos e insertar datos, todo de una sola vez.
Veamos cómo.
5. Borremos ahora la tabla entera, datos y estructura pulsando sobre [ Eliminar]. Tras
recargar la aplicación, comprobaremos que sólo tenemos ya la tabla faltas.
6. Creemos la tabla alumnos e insertemos los dos datos usando el comando
mysql_connect(host, usuario, password) Abre una conexión a un servidor MySQL36 . Los tres
argumentos son opcionales. Si falta alguno se toman los valores por defecto:
host ’localhost’
usuario que conectará con la base de datos
password vacı́a
# Ejemplo
<?php
//variables para almacenar los datos de la conexión
//se puede optar por declararlas o por escribir los datos di-
rectamente
$mysql_server="localhost";
$mysql_login="thales";
$mysql_pass="contrase~
na";
$c = mysql_connect($mysql_server,$mysql_login,$mysql_pass){
or die ("No he podido conectar");
}
! Notar que hacemos uso de una función “añadida”, se trata de la función die(). Se
ejecuta en el caso de que falle la conexión (or). En ese caso, finaliza el script y se
muestra en el navegador el mensaje especificado.
# Ejemplo
# Ejemplo: mysql_close($c);
36 Devuelve un identificador de enlace positivo si tiene éxito, o falso si error.
37 Si no se especifica un identificador de enlace, se toma como identificador de enlace el último que se ha abierto.
38 Si no se especifica, se asume el último enlace.
Preparación de la consulta
mysql_query(consulta, conexión) ejecuta la sentencia de MySQL especificada en el primer
parámetro, sobre el identificador de conexión del segundo parámetro39 .
# Ejemplo:
Recuperación de resultados
mysql_num_fields(cursor) devuelve el número de campos de un resultado
# Ejemplo:
# Ejemplo:
//se almacena en la variable el número
//de filas obtenido en el resultado
$numero_filas=mysql_num_rows($resultado);
# Ejemplo: para obtener el nombre del segundo campo de una consulta podemos usar
mysql_field_name($resultado,2)
# Ejemplo:
# Ejemplo: Con el código siguiente, podemos recorrer varias filas de una con-
sulta y mostrarlas en pantalla
# establecemos un bucle que recoge en un array
# cada una de las lı́neas del resultado de la
# usamos < <mysql_fetch_array> > y para evitar dupli-
cados
# optamos por el parámetro MYSQL_ASSOC
while ($regis-
tro= mysql_fetch_array($resultado, MYSQL_ASSOC)){
# Ejemplo:
2.5.2. Un ejemplo
Vamos a ver, de forma bastante simplificada, cómo podemos usar conjuntamente MySQL y
PHP. Para esto vamos a echar mano de la Web creada en el capı́tulo sobre PHP (apartado 1.4.1
en la página 25) y de la base de datos cursolinux que tenemos creada (suponiendo que hemos
introducido los datos previamente). En primer lugar vamos a “simplificarla” un poco eliminando
algunos campos (grupo y dni) para centrarnos sólo en las cuestiones más elementales.
Eliminemos pues, los campos. Desde phpMyAdmin, nos situamos sobre estructura y tras marcar
las casillas de verificación que hay a la derecha de grupo pulsaremos sobre
#
mysql> ALTER TABLE ‘alumnos‘ DROP ‘curso‘;
Query OK, 2 rows affected (0.01 sec)
Registros: 2 Duplicados: 0 Peligros: 0
mysql> ALTER TABLE ‘alumnos‘ DROP ‘dni‘;
Query OK, 2 rows affected (0.01 sec)
Registros: 2 Duplicados: 0 Peligros: 0
" !
42 Estarán a vuestra disposición en el servidor todos los ficheros, en un archivo comprimido de nombre mysql-
php.tgz
sólo se han cambiado los textos que se muestran en pantalla para adecuarlos a la nueva
situación. Si pulsamos sobre Insertar o Listar obtendremos una página de contenido similar,
pero de funcionalidad final diferente.
Con:
Insertar se carga el fichero pagina1.php y nos permite poner la falta del dı́a en curso a
uno de los alumnos.
Listar se carga pagina2.php y nos permite visualizar las faltas de asistencia del alumno
seleccionado.
<h2>
I n t r o d u c i r f a l t a s a un alumno
3 </h2>
<?php
// v a r i a b l e para l a a c c i ó n a r e a l i z a r
$ a c c i o n=” i n t r o d u c i r −f a l t a s ” ;
8 // l i s t a d o común a l a a p l i c a c i ó n
require ” l i s t a r −grupo . php ” ;
?>
Listado 2.1: pagina1.php
<h2>
L i s t a r l a s f a l t a s de un alumno
</h2>
4
<?php
// v a r i a b l e para l a a c c i ó n a r e a l i z a r
$ a c c i o n=” l i s t a r −f a l t a s ” ;
9 // l i s t a d o común a l a a p l i c a c i ó n
require ” l i s t a r −grupo . php ” ;
?>
Listado 2.2: pagina2.php
Este par de ficheros tienen poco que comentar. Se declara la variable $accion que va a permitir
el que con un solo fichero (listar-grupo.php) realicemos acciones diferentes dependiendo de la
página desde la que se cargue (más adelante volveremos sobre ella). Es importante reseñar la
ventaja que supone la posibilidad de reutilizar el código en ambos archivos.
Comencemos con el primer fichero“nuevo”y dejemos para después el fichero listar-grupo.php.
Se trata del fichero que nos va a permitir conectar con la base de datos cursolinux y obtener o
modificar los datos de las tablas que la componen. Se tendrá que incluir en los script PHP en los
que conectemos con la base de datos.
<?php
// V a r i a b l e s para almacebar l o s d a t o s de l a c o n e x i ó n
// s e puede o p t a r por d e c l a r a r l o s o por e s c r i b i r l o s
4 // d a t o s d i r e c t a m e n t e en l o s s c r i p t s php
$ m y s q l s e r v e r=” l o c a l h o s t ” ;
$ m y s q l l o g i n=” t h a l e s ” ; // e s t e v a l o r hay que a d e c u a r l o a v u e s t r o s i s t e m a
$ m y s q l p a s s=” c o n t r a s e ñ a ” ; // poner a q uı́ l a c o n t r a s e ñ a de l a b a s e de d a t o s
9 // Nombre de l a b a s e de d a t o s que c o n t i e n e t o d o s l o s d a t o s
// n e c e s a r i o s para l a p r á c t i c a , usamos una c o n s t a n t e
define ( ” b a s e d e d a t o s ” , ” c u r s o l i n u x ”) ;
// v a r i a b l e que r e c o g e e l i d e n t i f i c a d o r de c o n e x i ó n
14 $c ;
<?php
// d a t o s comunes
require ”comun . i n c ” ;
14
// e s t a b l e c e m o s l a c o n e x i o n con e l s e r v i d o r
c o n e c t a r b d ( $c ) ;
// t a b l a en l a que h a c e r l a c o n s u l t a
19 $ t a b l a=”alumnos ” ;
// campos a l i s t a r , en e s t e c a s o t o d o s
$campos=”∗ ” ;
24 // cadena para l a c o n s u l t a
$ c o n s u l t a=”SELECT ” . $campos . ” FROM ” . $ t a b l a ;
// e j e c u t a l a c o n s u l t a e s p e c i f i c a d a
$ r e s u l t a d o= mysql query ( $ c o n s u l t a , $c ) ;
29
// número de campos s o l i c i t a d o s
$numero campos=mysql num fields ( $ r e s u l t a d o ) ;
// Aviso s o b r e cómo p r o c e d e r
34 echo ”<h3>Marca s o b r e e l c&o a c u t e ; digo </h3>” ;
# e s t a b l e c e m o s un b u c l e que r e c o g e en un a r r a y
# cada una de l a s lı́ n e a s d e l r e s u l t a d o
49 # usamos m y s q l f e t c h a r r a y y para e v i t a r d u p l i c a d o s
# optamos por e l parámetro MYSQL ASSOC
while ( $ r e g i s t r o= m y s q l f e t c h a r r a y ( $ r e s u l t a d o , MYSQL ASSOC) ) {
// i n s e r t a m o s un s a l t o de lı́ n e a en l a t a b l a HTML
54 echo ”<t r >” ;
# e s t a b l e c e m o s e l b u c l e de l e c t u r a d e l ARRAY
# con l o s r e s u l t a d o s de cada lı́ n e a
# y e n c e r r a m o s cada v a l o r en e t i q u e t a s <td></td>
59 # para que a p a r e z c a n en c e l d a s d i s t i n t a s de l a t a b l a
foreach ( $ r e g i s t r o a s $ c l a v e => $ v a l o r ) {
i f ( $ c l a v e == ” c o d i g o ” ) {
echo ”<td><c e n t e r ><a h r e f=j a v a s c r i p t : a b r i r ( ’ $ a c c i o n . php? c o d i g o=
$ v a l o r ’ ) ;> ” . $ v a l o r . ”</a></c e n t e r ></td>” ;
64 }
else
{
echo ”<td><c e n t e r >” , $ v a l o r , ”</c e n t e r ></td>” ;
}
69 }
}
74 // l i b e r o l o s r e c u r s o s de l a s c o n s u l t a s
mysql free result ( $resultado ) ;
// c e r r a m o s l a c o n e x i ó n
d e s c o n e c t a r b d ( $c ) ;
79 ?>
Listado 2.4: listar-grupo.php
La primera parte es código javascript. Nos permite abrir una ventana emergente en la que se
nos informa del resultado y se ha puesto sólo con la intención de que no se pierda de vista la
página principal.
Aparece una función43 nueva de PHP en la lı́nea:
echo ucfirst(mysql_field_name($resultado,$i));
if ( $clave == "codigo" ) {
echo "<td><center><a href=javascript:abrir(
’$accion.php?codigo=$valor’);>".$valor."</a></center></td>";
}else{
echo "<td><center>",$valor,"</center></td>";
}
que nos permite diferenciar el primer campo del resto (campo código), de esa forma creamos el
enlace sólo con él.
El enlace creado llama a la función javascript (abrir) que permite ver los resultados en la
ventana emergente. Notar además que en el argumento de la llamada se introduce la variable
$accion. De esa manera, cuando se ejecuta desde pagina1.php, $accion=introducir-faltas y
sin embargo, si se hace desde pagina2.php su valor es listar-faltas. La consecuencia es que si
bien el código es común, dependiendo de dónde se llame, ejecutaremos el script php adecuado. Es
decir, si
strings.php
Además, en ambos casos le pasamos al script una variable ($codigo) cuyo valor coincide con el
código del alumno sobre el que pulsemos. El resto se reduce a cuestiones ya estudiadas, o a crear
la tabla en que se muestran nuestros alumnos.
El script que se lista a continuación nos permite poner la falta de asistencia (la fecha del dı́a
en curso) al alumno sobre cuyo código hayamos pulsado:
1 <?php
// d a t o s comunes
require ”comun . i n c ” ;
// t a b l a en l a que i n t r o d u c i r l a s f a l t a s
6 $ t a b l a=” f a l t a s ” ;
// capturamos l a f e c h a d e l s i s t e m a
$ f e c h a=date ( ”ymd”) ;
11 // almacenamos l a v a r i a b l e c ó d i g o
$ c o d i g o=$ GET [ ’ c o d i g o ’ ] ;
// Añadimos e l nuevo r e g i s t r o
// Primero e s t a b l e c e m o s l a c o n e x i ó n con e l s e r v i d o r
16 c o n e c t a r b d ( $c ) ;
$ c o n s u l t a=”INSERT ” . $ t a b l a . ” ( c o d i g o , f e c h a ) VALUES ( ’ $ c o d i g o ’ , ’ $ f e c h a ’ ) ” ;
mysql query ( $ c o n s u l t a , $c ) ;
// comprobamos e l r e s u l t a d o de l a i n s e r c i ó n
21 // e l c ó d i g o de e r r o r CERO s i g n i f i c a NO ERROR
i f ( mysql errno ( $c )==0){
echo ”<p><br><p><br><c e n t e r ><h2>R e g i s t r o a&n t i l d e ; adido </b></H2></
c e n t e r >” ;
} else {
echo ”<p><br><c e n t e r ><h2>Se ha p r o d u c i d o un e r r o r <br></h2></c e n t e r >
”;
26 }
# c e r r a m o s l a c o n e x i ó n
d e s c o n e c t a r b d ( $c ) ;
?>
31
$fecha=date("ymd");
con ella capturamos la fecha del sistema. Además, al pasarle los parámetros “ymd” la almacenamos
en la variable $fecha de la forma adecuada (AAMMDD) para insertarla en el campo fecha de la tabla
faltas. Con
creamos la cadena que contiene la sentencia de inserción. Recordar que el campo codigo es el que
nos permite establecer la relación uno a muchos entre ambas tablas (alumnos y faltas). Como
pasamos el código de alumno en la URL, sólo tenemos que recuperarlo en una variable y, junto a
la fecha del sistema, insertamos ambos valores en la base de datos faltas.
Por último, otro añadido (que no es imprescindible):
La función mysql_errno($c) nos devuelve el código de error para la última función llamada. Si
bien aquı́ no está muy “explı́cito”, su uso nos permite (usando ese código de error) detectar a qué
puede ser debido el que un registro no se haya insertado correctamente.
Llegamos al último archivo, con él listamos todas las faltas del alumno seleccionado. De nuevo
tendremos que pasar en la URL el valor del código de ese alumno que recuperaremos en una
variable ($codigo=$_GET[’codigo’];).
1 <?php
// d a t o s comunes
require ”comun . i n c ” ;
// e s t a b l e c e m o s l a c o n e x i ó n con e l s e r v i d o r
6 c o n e c t a r b d ( $c ) ;
// almacenamos l a v a r i a b l e c ó d i g o
$ c o d i g o=$ GET [ ’ c o d i g o ’ ] ;
11 // t a b l a en l a que h a c e r l a c o n s u l t a
$ t a b l a=”alumnos ” ;
// campos a m o s t r a r
$campos=”nombre , a p e l l i d o 1 , a p e l l i d o 2 ” ;
16
// cadena para l a c o n s u l t a
$ c o n s u l t a=”SELECT ” . $campos . ” FROM ” . $ t a b l a . ” WHERE c o d i g o=” . $ c o d i g o ;
// e s t a b l e c e m o s e l c r i t e r i o de s e l e c c i ó n
21 $ r e s u l t a d o= mysql query ( $ c o n s u l t a , $c ) ;
26 // t a b l a en l a que h a c e r l a c o n s u l t a
$ t a b l a=” f a l t a s ” ;
// cadena para l a c o n s u l t a
// e j e c u t a m o s l a c o n s u l t a
36 $ r e s u l t a d o= mysql query ( $ c o n s u l t a , $c ) ;
// número de f a l t a s d e l alumno
$ n u m e r o f i l a s=mysql num rows ( $ r e s u l t a d o ) ;
// mostramos e l número de f a l t a s
echo ”</b> ha f a l t a d o ” . $ n u m e r o f i l a s . ” d&i a c u t e ; as , l a f e c h a s son :< br><
br>” ;
# e s t a b l e c e m o s un b u c l e que r e c o g e en un a r r a y
51 # cada una de l a s lı́ n e a s d e l r e s u l t a d o de l a c o n s u l t a
# como s ó l o c o n s t a n de un campo s e r á e l de ı́ n d i c e 0
while ( $ r e g i s t r o= mysql fetch row ( $ r e s u l t a d o ) ) {
echo ” ” . date ( ”d m Y” , $ r e g i s t r o [ 0 ] ) . ” ; ” ;
}
56
// r e t o r n o de lı́ n e a
echo ”<p><br>” ;
// l i b e r o l o s r e c u r s o s de l a s c o n s u l t a s
61 mysql free result ( $resultado ) ;
// c e r r a m o s l a c o n e x i ó n
d e s c o n e c t a r b d ( $c ) ;
?>
66
Después, con date("d m Y",fecha), le damos el formato que deseamos (al poner Y en
mayúsculas nos devolverá el año con 4 cifras y no con dos, que es como está almacenado)
de 1970.
Moodle y PHP-Nuke
Aunque PHP compite con ASP de Microsoft, Cold Fusion de Allaire, JSP de Sun, e incluso
un primo de código fuente abierto llamado mod_perl, realmente se encuentra por encima
de prácticamemente todos sus competidores por al menos un año. (Servidor Apache 2,
Mohammed J. Kabir)
3.1.1. Introducción.
Las plataformas educativas o sistemas de gestión de aprendizaje son paquetes de software que
permiten la educación a distancia. Esta fórmula educativa tiene cada vez mayor aceptación y se
usa no sólo en educación a distancia sino también en la educación presencial. Ejemplos cercanos
de esto son estos cursos y los centros TIC.
Dentro del software libre hay distintos proyectos donde poder elegir. Nosotros hemos optado
por Moodle por su potencia y facilidad de uso, razones que determinaron ası́ mismo su uso en
estos cursos.
Para conocer qué software hay disponible para este cometido se puede consultar:
http://www.linuxjournal.com/article/7817
http://www.elearningworkshops.com/modules.php?name=Web_Links&l_op=MostPopular
http://www.uv.es/ticape/docs/sedelce/mem-sedelce.pdf.
Además de Moodle, una plataforma que merece mención especial es Ilias, en la 2a URL (documento
en PDF) aparece justificada su valı́a y una guı́a de cómo instalarla. http://www.gate.upm.es/
Moddle es una “plataforma educativa” que se desarrolla bajo licencia GPL, se trata de “un
paquete de software para la creación de cursos y sitios Web basados en Internet. Es un proyecto
en desarrollo diseñado para dar soporte a un marco de educación social constructivista.”
73
Thales-CICA 2005 Entorno virtual de aprendizaje: Moodle Página 74
3.1.2. Instalación
! Con objeto de homogeneizar el proceso de instalación en ambas distribuciones antes de iniciar
la instalación vamos a adecuar la configuración de Debian para que sea similar a la de Fedora.
De esa forma todo lo que sigue será válido para ambas. Para eso, en Guadalinex crearemos
un directorio de nombre html dentro del raı́z de Apache2
#mkdir /var/www/html
DocumentRoot /var/www/html
<Directory /var/www/html>
#RedirectMatch ^/$ /apache2-default/
# apache2ctl restart
! Existe un paquete para Debian de nombre moodle que nos automatiza el proceso de insta-
lación. Pero en general no es mucho más sencillo que el proceso manual. El hecho de que
además el método “general” es válido para ambas distribuciones nos ha llevado a optar por
él.
La Web principal del programa es http://moodle.org/. Desde allı́ (sección Downloads) podemos
bajar la última versión estable (por ahora), se trata de
moodle-latest-14.tgz
Para instalar Moodle en nuestro sistema necesitamos tener en funcionamiento: Apache, php1
y MySQL, y partiremos de esto.
1 Además es necesario que estén instalados los paquetes (se instalarán con ellos las librerı́as GD):
php-gd en Fedora
php4-gd en Debian
AcceptPathInfo on
Una vez en nuestra máquina, el proceso de instalación es muy simple y se encuentra bien guiado en
las intrucciones de la web de moodle (http://moodle.org/doc/?file=install.html). Se resume
en:
Asignamos como dueño del directorio al usuario bajo el que se ejecuta el servidor Web4
Debian
#mkdir /var/moodledata
#chown www-data /var/moodledata
Fedora
# mkdir /var/www/moodledata
# chown apache /var/www/moodledata
Debian /etc/apache2/apache2.conf
Fedora /etc/http/conf/httpd.conf
• Es necesario para que el script de instalación pueda hacer los cambios por nosotros. Si no lo hacemos, en el
proceso de instalación se nos indicará la forma de corregir este pequeño problema.
• En Fedora será:
#chown apache moodle
# mysqladmin -u root -p
mysql> CREATE DATABASE moodle;
mysql> quit
! De forma opcional, podemos optar porque un usuario (Thales por ejemplo) se conecte a esa ba-
se de datos. Para eso en la ventana principal de phpMyAdmin pulsemos sobre Privilegios→Agregar
nuevo usuario
Introducimos el nombre de usuario, optamos porque las conexiones se realicen sólo desde
Local y contraseña de acceso, y pulsamos sobre Continúe. Se nos abren más posibilidades
y optamos por moodle en la lista desplegable Añada privilegios en esta base de datos.
Después, marcamos todos los privilegios para ella:
' $
# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 55 to server version: 4.0.18-log
Type ’help;’ or ’\h’ for help. Type ’\c’ to clear the buffer.
Después, cuando se han creado las tablas de la base de datos y directorios de datos, accederemos
a la primera ventana de configuración propiamente dicha. Salvo que nos guste el inglés, lo mejor
es seleccionar el castellano7 . La ayuda de contexto es muy buena8 , ası́ que sólo comentaremos las
variables susceptibles de ser cambiadas desde el principio:
lang Espa~
nol-Espa~
na (es_es)
locale optaremos por escribir es_ES
zip en general será /usr/bin/zip
unzip en general será /usr/bin/unzip
country deberı́amos elegir el paı́s por defecto para los nuevos usuarios.
loginhttps Deberı́amos activar esta opción si hemos montado un servidor seguro, de esa forma el
nombre de usuario y contraseña de entrada no viajarán en texto plano. Se iniciará una
conexión segura (https) para la página de entrada y, una vez autenticados, se volverá
a trabajar con una conexión http normal. Si no tenemos un servidor seguro en
marcha y activamos esta opción no podremos acceder a Moodle.
Merece la pena pararse en la que nos informa de los cambios surgidos en esta versión.
Sólo tenemos que ir aceptando en las distintas pantallas que nos van a ir saliendo, con ellas se
van creando las tablas necesarias para los distintos módulos y bloques de la aplicación. Configu-
remos la página de inicio
7 Todo lo que cambiemos desde este momento podrá ser modificado después. Ası́ que no hay ningún problema si
Con la lista de forma de encabezado podemos optar por la forma que tendrá la página inicial de
la aplicación, podemos elegir entre Mostrar items de noticias (captura siguiente), Mostrar un
listado de cursos o Mostrar un listado de categorias (véase la figura 3.1 en la página 74
para las dos últimas). Merece la pena pararse un poco en el magnı́fico editor de html que integra.
Tiene de casi todo.
A continuación debemos configurar la cuenta para el administrador principal. Debemos asegu-
rarnos de darle un nombre de usuario y contraseña seguras, completar adecuadamente los campos
relativos a la Ciudad y Paı́s, y de una dirección de correo electrónico válida (y cómo no, la foto
de rigor).
Posteriormente podremos crear más cuentas de administración.
poder modificar todas la variables que definen el sitio, podremos acceder a la magnı́fica ayuda (en
castellano) que acompaña al programa.
! Antes de seguir es importante tener en cuenta que algunos módulos de Moodle necesitan
revisiones continuas para llevar a cabo tareas. Por ejemplo, Moodle necesita revisar los foros
para poder enviar copias de los mensajes a las personas que están suscritas. Lo podemos
hacer de forma manual usando
http://www.midominio.org/moodle/admin/cron.php
o bien seguir la indicaciones de la documentación de Moodle:
“En un sistema Unix: Use cron. Edite las opciones de cron desde la lı́nea de comandos usando
”crontab -e” y añada una lı́nea como la siguiente:
*/5 * * * * wget -q -
O /dev/null http://www.midominio.org/moodle/admin/cron.php
Normalmente, el comando ”crontab” le enviará al editor ’vi’. Se entra en ”modo de inserción”
presionando ”i”, después teclee la lı́nea de arriba, luego salga del modo de inserción presio-
nando [ESC]. Se guardan los cambios y se sale tecleando ”:wq”, se puede salir también sin
guardar usando ”:q!” (sin las comillas).”
Pulsamos sobre Nuevos Usuarios e introducimos los datos, por último guardamos los cambios
del formulario de introducción de datos y se nos mostrará la ventana de administración de usuarios.
Volvamos a la página de administración de usuarios y pulsemos sobre Asignación de autores
de cursos13 , desde ella y pulsando sobre la flecha (←) que hay delante del nombre hagamos que
nuestra compañera Matilde pueda crear14 nuevos cursos y administrar los profesores de esos cursos
Hasta ahora Matilde puede crear cursos pero no asignarlos a una categorı́a, ası́ que antes de
terminar el trabajo como administrador vamos a crearle la categorı́a Lengua para que sus cursos
se sitúen dentro de ella. Pulsamos15 sobre Administración y después sobre Cursos
10 También se puede dar de alta ella sola y nosotros después, sólo tenemos que permitirle esta opción.
11 También se accede desde Configuración→Administración→Usuarios
12 Como podemos observar el “manual” está incorporado.
13 De esta forma podrá crear nuevos cursos y enseñar en ellos
14 No pensemos que este proceso es “obligatorio”, el administrador es el root de la plataforma y se puede optar
por que sea él solo el que tenga el control de toda ella.
15 También se puede acceder aquı́ de otras formas, por ejemplo desde la página inicial de la aplicación.
Como ya hemos dicho, el uso de Moodle es intuitivo (estáis trabajando con él en los cursos de
formación). Pero para iniciarnos con él nada mejor que ver cómo configurar nuestro primer curso.
Le toca el turno a Matilde, va a crear un curso que integrará dentro de la categorı́a Lengua
recién creada. Ası́ que, se autentifica en la plataforma, pulsa sobre Lengua y crea su primer curso
(Lengua de 1o de ESO A)
pulsa sobre Añadir un nuevo Curso, e introduce los datos adecuados en el formulario que
se le presenta:
Formato puede ser de tres tipos: semanal, temas y social. Como no sabe muy bien de qué va
cada uno pulsa sobre y se abre la ventana de ayuda:
está claro, el que mejor se ajusta a lo que ella pretende es el formato temas. Opta por él y sigue
con el campo Disponibilidad, no le interesa que cualquier alumno pueda acceder a su curso, ası́
que selecciona
! De esa forma, para que un alumno pueda después matricularse en el curso, además de darse
de alta en Moodle, tendrá que conocer la palabra de paso. Es un sistema que permite que los
alumnos se automatriculen en los cursos pero manteniendo nosotros el control sobre quién
lo hace.
Además, opta por no admitir invitados y guarda los cambios. Entra entonces por primera vez en
Como además, es aficionada a las matemáticas les va a gastar una broma a sus alumnos, y tras
pulsar sobre el icono que hay encima de Foro de Noticias, comienza a escribir su texto de
bienvenida
memory_limit = 8M
Para seguir trabajando y conocer qué puede seguir haciendo sólo tiene que echar mano de
la Ayuda accesible desde esta misma página17 y sobre todo un documento ya comentado en la
página 82: El manual del profesor.
post_max_size = 16M con este valor establecemos el tamaño máximo de archivos enviados usando
el método POST. Su valor condiciona el valor de la directiva siguiente ası́ que debe ser
siempre más grande que el asignado a upload_max_filesize.
upload_max_filesize = 16M del fichero de configración de php (php.ini) ajustándola al valor
deseado.
Debian /etc/apache2/mods-available/php.conf
Fedora /etc/httpd/conf.d/php.conf
Cuando terminemos de hacer los cambios, reiniciemos el servidor Apache, por ejemplo con:
17 Un documento que os puede resultar interesante es http://www.iesmurgi.org/~ljoya/moodle/ o en la versión
#apache2ctl restart
Copias de seguridad
y porgramamos la polı́tica de copias. Es buena idea (si nuestro disco lo permite) mantener
varios ficheros y programar las copias para que se realicen en un par de dı́as y a una hora en que
sepamos que el servidor está con poca carga. En cada curso se creará una carpeta accesible desde
Administración→Archivos→Backupdata
Añadir cursos
Desde cualquier curso podemos crear copias de seguridad que tienen una funcionalidad añadida:
podemos restaurarlas en cualquier otro moodle. Para crear una copia de seguridad para un curso
en concreto pulsaremos sobre Administración→Copia de seguridad
➥ Restaurar cursos de un Moodle a otro. En esta práctica vamos a guiar la forma de restaurar
un par de cursos en castellano que tenemos disponibles en la Web de Moodle http://moodle.org/
course/view.php?id=11. Se trata de los cursos:
Guiaremos el proceso sólo para el primero dejando los otros dos como ejerecicio.
Bajaremos el fichero a nuestro equipo19 . Después, desde la página principal de Moodle pulsaremos
sobre Restaurar
para subir el fichero a la plataforma. Una vez en ella, sólo hemos de marcarlo y pulsar sobre res-
taurar.
19 Si intentamos subir a Moodle ficheros de un tamaño mayor del que permite la configuración del sistema (por
defecto 2MB) no nos lo permitirá. Aunque aumnetemos ese tamaño, la única solución para ficheros muy grandes es
ponerlos en el sitio adecuado a mano. Por ejemplo con:
El proceso no presenta mayor dificultad y sólo hay que fijarse bien en las distintas opciones que
se nos ofertan. Cuando acabemos tendremos creado un nuevo curso (si hemos elegido esa opción)
similar a
Añadir módulos
Si bien las posibilidades de la instalación por defecto de Moodle son muy amplias, existen
una serie de añadidos que nos puede interesar tener en nuestro sitio. Podemos ver cuáles hay
disponibles en http://moodle.org/download/modules/. De los que hay disponibles, la mayorı́a
están instalados pero hay otros que son interesantes y no lo están, por lo que tendremos que
instalarlos nosotros. El proceso para todos ellos es parecido ası́ que vamos a instalar sólo uno, se
trata de:
Questionnaire que nos va a permitir poder realizar encuestas desde Moodle.
Para instalarlo, lo bajamos a nuestro ordenador y descomprimimos el fichero en el lugar ade-
cuado
# cp questionnaire.zip /var/www/html/moodle/mod/
# cd /var/www/html/moodle/mod/
# unzip questionnaire.zip
Ya está, ası́ de fácil. Cuando como administrador entremos en la configuración de los módulos20
(en Administración) él sólo se encargará de todo: actualizar la base de datos, crear las tablas,
etc.
20 Desde aquı́, a su vez, podremos borrar los módulos que no nos interesen.
Añadir en un curso un cuestionario es fácil. Con la edición activa marcaremos sobre Agregar
Actividad...→Encuesta phpESP
Actualizaciones de Moodle
La versiones de Moodle se suceden casi a diario y a veces es necesario actualizar el sistema
porque hay bugs que se han corregido para la versión con la que trabajamos o porque se han
añadido funcionalidades interesantes que nuestra verisión no soporta. Afortunadamente, este tema
también está bien resuelto. Para no alargar la entrega tenéis la forma de hacerlo (en castellano)
explicada en http://localhost/moodle/doc/?file=upgrade.html.
Se puede resumir en:
Si hemos hecho cambios en el Moodle que tenı́amos instalado tendremos que pasarlos al
Moodle nuevo: por ejemplo módulos añadidos, temas instalados, etc.
Por útlimo sólo hemos de ejecutar (él sólo se encarga del resto):
http://www.midominio.org/moodle/admin
3.2. PHP-Nuke
¿Qué es PHP-Nuke?
PHP-Nuke es un sistema automatizado de noticias especialmente diseñado para ser usado en
Intranets e Internet. El Administrador tiene el control total de su sitio Web, sus usuarios
registrados, y tendrá a la mano un conjunto de herramientas poderosas para mantener
una página web activa y 100 % interactiva usando bases de datos.
Su autor es Francisco Burzi, que es el que mantiene el código y realiza todas las modificaciones
que lleva el paquete original. Podemos encontrar su trabajo en http://www.phpnuke.org.
Los requisitos para usar PHP-Nuke, que veremos posteriormente, no forman parte del
sistema y han de instalarse independientemente. (Manual de referencia rápida para
PHP-Nuke, Carlos Pérez Pérez http://www.forodecanarias.org/doc/nuke/
html/node4.html
3.2.1. Introducción
Los portales web son sitios web pensados para manejar una gran cantidad de información y
permitir el mantenimiento de páginas web actualizadas y dinámicas usando bases de datos.
En http://www.aferve.com/index.php?module=bkbCompare&func=narrow_selection&id=
1 tenéis un estudio comparativo de los distintos portales y sus caracterı́sticas.
Hemos optado por PHP-Nuke porque es un clásico, su uso está bien documentado (lo que os
permitirá seguir profundizando en su conocimiento) y es fácil de instalar. Además, una vez que se
aprenda a manejar uno, el uso de cualquier otro portal es similar y no presentará ningún problema.
Vamos a ver la potencia de instalar MySQL (servidor de base de datos) y, junto con PHP y el
software PHPNuke (http://phpnuke.org/), montar una web altamente configurable.
4. Instalar el módulo que permite a PHP disponer de soporte de base de datos MySQL
# cp PHP-Nuke-7.5.zip /var/www
# cd /var/www
# unzip PHP-Nuke-7.5.zip
para crear las tablas de esta base de datos según se establece en el fichero nuke.sql.
$dbuname = "root";
$dbpass = "contrase~
na";
! Podemos tener varios Nukes instalados en nuestra máquina. Para eso sólo debemos
descomprimirlos en directorios diferentes y crear bases de datos diferentes para cada
uno de ellos, por ejemplo para el segundo nuke
# mysqladmin -u root -p create nuke2
# mysql -u root -p nuke2 < nuke.sql
y ajustar la variable adecuada a la base de datos para ese phpNuke, en concreto en el
fichero config.php
$dbname = "nuke2";
8. Comprobar que todo está bien, apuntando con nuestro navegador a24 http://localhost/
21 Lo podemos bajar de http://www.phpnuke.org/modules.php?op=modload&name=Downloads&d_op=
viewdownload&cid=1.
22 Véase el fichero /var/www/html/INSTALL para ampliar sobre los detalles de la instalación.
Podemos usar phpMyAdmin para hacerlo, pero en general es más rápido desde el modo comando.
23 Lo deseable es que sea otro usuario el que pueda conecar con la base de datos. para saber cómo se hace con
¡Bienvenidos a PHP-Nuke!
¡Enhorabuena!¡Ya tiene instalado un portal web! Puede editar o cambiar este men-
saje desde la página “Administration”.
Por razones de seguridad lo mejor es crear AHORA MISMO el Super-usuario
pinchando AQUÍ.
En primer lugar pongamos el portal en castellano para eso optemos porque el interfaz se
muestre ası́, seleccionando el idioma español del bloque de la derecha
Una vez pasado este trámite, vamos crear el super-usuario (para nosotros el socorrido tha-
les) pinchando allı́25 :
! Al crear la cuenta GOD (se puede poner el nombre que se quiera) no podemos usar ni
espacios ni caracteres “extraños”. Si los usamos no podremos acceder al portal. En este
caso, una solución rápida (ya que estamos empezando) puede ser:
# mysqladmin -u root -p drop nuke
Enter password:
Dropping the database is potentially a very bad thing to do.
Any data stored in the database will be destroyed.
Nos queda configurar el portal, ponerlo por defecto en castellano, crear usuarios del sistema,
etc. Pero eso lo dejamos para el punto siguiente, salgamos de él pulsando sobre Salir .
!
Antes de meternos en la configuración, en /var/www/html/docs se nos ha instalado la do-
cumentación que acompaña al portal. Más de una duda seguro que se puede resolver desde
aquı́.
26 Es conveniente guardar a buen recaudo los datos del administrador y la contraseña de acceso.
Si lo que desamos es actualizar nuestro Nuke a una versión posterior podéis consular en:
http://www.phpnuke-hispano.com/modules.php?name=News&file=article&sid=77
y en italiano:
http://www.claudioerba.com/
Después, si pulsamos sobre Preferencias nos llevará a una página desde la que podremos
configurar los aspectos generales del portal27 . Si nos desplazamos hacia abajo en la ventana del
navegador, podremos modificar el valor de la lista desplagable Seleccionar el Idioma para el
sitio (Spanish), además cambiaremos el Formato de Tiempo Local (Locale Time Format) a
es_ES
Está claro que antes de salir deberı́amos adecuar algunos de los campos de esta sección y
adaptarlos a nuestro sitio.
De esta ventana comentaremos únicamente que podemos optar por distintos temas por defecto
para nuestro phpNuke. Sólo hay que pulsar sobre Tema por defecto del sitio, ir seleccionando
los que nos van apareciendo en la lista desplegable y guardar los cambios.
27 Una descripción más completa de las distintas opciones se puede consultar en: http://www.forodecanarias.
org/doc/nuke/html/node36.html
1. Desactivar el mensaje de bienvenida por defecto. Para eso pulsamos sobre Editar el mensaje
inicial
! Si queremos remarcar el texto hay que usar las etiquetas del html.
El resto de opciones no presentan problema. Optamos por dejar las opciones por defecto y
pulsamos sobre [Agregar Mensaje].
Topics (Módulos)
Es desde donde definiremos los temas en los que se clasificarán nuestras noticias. Por defecto
sólo viene un tema predeterminado y, como es obvio, aquı́ tendremos que dedicar un tiempo antes
de que nuestra web esté operativa. Vamos a añadir un tema sobre las cuestiones relacionadas con
las matemáticas.
1. Lo primero es buscar un gráfico que se adecúe a nuestro propósito, por ejemplo, el fichero28
28 Tendrán que ser gráficos apropiados: png, gif o jpg y de reducido tamaño.
/usr/share/pixmaps/gnome-gnotravex.png ( ).
2. Situémoslo en su sitio:
# cp /usr/share/pixmaps/gnome-gnotravex.png
/var/www/html/images/topics/gnomegnotravex.png
! Notar que hemos sido cuidadosos y en el nombre de fichero no hemos permitido caracteres
extraños (el guión), si no lo hacemos ası́, phpNuke no podrá trabajar con ese gráfico.
3. Añadamos el tema.
News (Módulos)
Una vez definidos los temas, desde aquı́, podemos añadir las noticias que se mostrarán en
nuestro portal. Su uso no es complicado y sólo hay que tener en cuenta que:
Hay que seleccionar obligatoriamente un tema principal desde la lista desplegable Tópico.
Es opcional marcar las casillas de Tópicos asociados.
Para remarcar el texto es necesario usar las etiquetas de html.
El Texto de la Noticia es lo que se verá en la página principal. Al Texto extendido hay
que acceder.
Podemos programar la fecha en que se mostrará la noticia en la página principal (por ejemplo
el 31/12/2004 a las 0 horas para felicitar del año nuevo) y añadir una encuesta a cada noticia
que pongamos.
Si pulsamos sobre Aceptar estando activa la opción de Vista Previa se nos mostrará
cómo quedará la noticia, pero no se envı́a. Para enviarla hay que optar por Enviar Noticia
y Aceptar.
Desde la ventana principal de administración siempre podremos editar o borrar las noticias
que nosotros hayamos enviado.
Administración
Respaldo
Es para crear una copia de seguridad de la base de datos de nuestro PHP-Nuke.
Banner
Por si deseamos añadir carteles publicitarios a nuestro sitio y gestionar la “cartera” de clientes.
Bloques
Es uno de los elementos fundamentales de nuestro portal.
Desde aquı́ podemos administrar los bloques de nuestro portal. Las dos columnas “importantes”
son:
Peso Nos permite subir o bajar un bloque con sólo pulsar sobre las flechas ⇑ ⇓
➥ Añadamos un bloque: en esta práctica vamos a añadir un bloque en el que se mostrarán las
noticias de la web de Barrapunto. Para poder hacerlo necesitamos que el sitio de donde las vamos
a “coger” tenga un fichero dentro de su servidor, del tipo RSS/RDF. La URL es:
http://backends.barrapunto.com/barrapunto.rss
Editar Admins
Si trabajamos en un centro de enseñanza y hemos sido o somos los
WebMaster sabemos que es más que deseable poder repartir el trabajo.
Desde esta página podemos dar de alta a usuarios que van a poder
administrar con nosotros el portal. Está en nuestras manos definir qué
nivel de “trabajo” le vamos a permitir al autor:
Para que el nuevo “administrador” ejecute sus funciones en nuestra máquina www.midomio.org
tendrá que usar la URL: http://www.midomio.org/admin.php
Forums
phpNuke integra como módulo uno de los mejores paquetes para gestionar foros de la actuali-
dad. Se trata de sistema de foros phpBB
La web del programa es, http://www.phpbb.com/, desde la sección downloads podemos acceder
a los módulos de lenguaje. Se trata de bajarnos los que nos van a permitir poner nuestros foros en
castellano, es decir, los paquetes29 :
lang_spanish.tar.gz
subSilver_spanish.tar.gz
# cp subSilver_spanish.tar.gz /var/www/html/modules/Forums/templates/
# cd /var/www/html/modules/Forums/templates/
# tar -xzvf subSilver_spanish.tar.gz
Está claro que ahora es más fácil modificar y adecuar la configuración de los foros: se deja como
ejercicio :-).
Users Groups
Permite crear grupos y asignar usuarios a esos grupos, además se puede conseguir que los
grupos puedan ver sólo ciertos módulos y bloques.
HTTP Referers
¿Quién enlaza nuestro sitio? El número (1000 por defecto) de referencias se controla desde la
página de Preferencias
IP Ban
Para bloquear las IP de los “chicos malos”
Módulos
Se trata de uno de los elementos más importantes de la configuración. Los módulos son los que
dotan (junto con los bloques) de contenido a nuestra Web.
En esta sección accederemos a una tabla en la que se nos informa de los distintos módulos, ası́
como de sus caracterı́sticas.
gallery http://gallery.menalto.com/
My Photo Gallery http://www.fuzzymonkey.org/cgi-bin/newfuzzy/software.cgi
$ mkdir coppermine
$ cp coppermine1,1d6.5.zip coppermine
$ cd coppermine
$ unzip coppermine1,1d6.5.zip
Al descomprimir se crean varios directorios35 : block y modules. Lo primero será actualizar la base
de datos nuke con:
#mysql -u root -p nuke <coppermine.sql
Por útlimo copiemos el contenido de los directorios anteriores en los lugares adecuados:
block en /var/www/html/block
modules en /var/www/html/modules
Ya está. Reiniciemos el bloque de módulos y activémoslo. Mejor si además le ponemos un nombre
en castellano.
Para administrarlo, pulsaremos sobre Fotos del bloque Módulos (Modules) de la página principal
del portal
Al pusar sobre Config podremos optar por cambiar el idioma y configurarlo a nuestro gusto.
Para no perder de vista lo que es importante (por ahora) aparquemos la configuración de este módulo
hasta la 3.2.4 en la página 104. En ella se explica cómo crear una galerı́a y la forma de introducir
nuestras fotos. Ası́ que continuemos con la configuración del portal.
Boletı́n
Para enviar un correo (boletı́n) a los usuarios que están suscritos o a todos los usuarios del
portal.
Optimize DB
Para optimizar la base de datos de nuestro portal.
Envios
Permite configurar desde Preferencias si deseamos que usuarios anónimos puedan poner ar-
tı́culos en nuestro portal o si, antes de que se publique, el administrador o usuarios han de darle
el visto bueno.
35 Además del fichero que explica cómo se instala: Installation-english.txt
Módulos
Contenido
Nos permite crear páginas de contenido diverso (“cajón de sastre”) clasificadas por temas. Si
usamos la etiqueta <!-pagebreak-> podremos crear documentos (usando las etiquetas del HTML)
de varias páginas.
Descargas (Downloads)
En primer lugar tendremos que crear las categorı́as de descargas, después añadiremos los pro-
gramas y/o materiales que deseamos se puedan bajar desde nuestro portal. Una vez creada la
categorı́a principal se nos “complicará” la página permitiéndonos añadir subcategorı́as y descargas
clasificadas dentro de esas categorı́as. No presenta mayor dificultad.
Enciclopedia
Permite generar una enciclopedia basada en categorı́as. Se pone el nombre a la enciclopedia y
después se agregan los términos. El trabajo es ir alimentando los términos.
FAQ
O su traducción PUF, es decir, que como estamos de trabajo fatal, seguro que diremos ¡puuf!
cuando nos digan que hagamos la FAQ (Frequently Asked Questions). Es broma: se trata de que
podemos crear una serie de preguntas de uso frecuente (PUF) con sus respuestas, que facilite a los
usuarios el uso del portal.
Reviews
Abre una página dedicada al análisis de productos y servicios. Los usuarios pueden introdu-
cir comentarios amplios sobre un determinado producto, su nombre, e-mail, enlaces. Permite un
análisis más completo e interactivo que las encuestas.
Secciones
Para crear secciones especiales, es el lugar adecuado para situar artı́culos que no entran dentro
de la página principal.
Encuestas (Survey/Polls)
Administración de encuestas, su uso es sencillo e intuitivo.
Efemérides
Desde aquı́ tendremos la posibilidad de programar las efemérides que deseamos se muestren en
la web principal para los dı́as establecidos.
1. Tendremos que garantizarnos que nuestro logo es un fichero en formato gif y de nombre
logo.gif. Los temas de phpNuke se guardan en el directorio html/themes
# ls /var/www/html/themes/
3D-Fantasy ExtraLite Karate Odyssey SlashOcean
Anagram index.html Milo Sand_Journey Sunset
DeepBlue Kaput NukeNews Slash Traditional
En general, en cada uno de ellos existe un directorio de nombre images. En él se encuentra el
fichero logo.gif. Sólo hemos de sobreescribirlo.
2. La segunda forma de hacerlo es:
a) Crear nuestro logo, por ejemplo, logomicentro.png y ponerlo en el subdirectorio images
de ese tema (por ejemplo en /var/www/html/themes/Kaput/images).
b) Entrar en el directorio del tema en el que deseamos poner nuestro logo y modificar el
fichero theme.php36 , buscar una lı́nea de la forma:
<img border=\"0\" src=\"themes/DeepBlue/images/logo.gif\"
alt=\"Welcome to $sitename!\" hspace=\"20\">
y modificarla a nuestro gusto
<img border=\"0\" src=\"themes/DeepBlue/images/logomicentro.png\"
alt=\"Bienvenidos a $sitename!\" hspace=\"20\">
3.2.4. Coppermine
Sigamos con este módulo que habı́amos dejado a medias y vamos a iniciarnos sobre su uso37 .
Vamos a crear un albúm de forma rápida en el que poner las fotos de la última Olimpiada Mate-
mática Thales, esas fotos las hemos puesto en un directorio de nombre olimpiada. De nuevo os
recordamos que no pretendemos tratar todas las posibilidades, sólo dar una primera idea de qué
se puede hacer.
! Antes de seguir, varias cuestiones a tener en cuenta si las fotos son de aproximadamente 512KB
o más. Si es ası́, en la pestaña que permite configurar Coppermine (Config) accedemos a
dos parámetros de configuración para los cuales es necesario aumentar38 los valores:
Máximo tamaño de los ficheros añadidos por los usuarios (KB), por defecto está a 1024,
doblar su valor no es mala idea.
Máxima anchura o altura de las imágenes/videos añadidos (pixels). Puede que no sea
necesario modificar en exceso este parámetro, en cualquier caso aumentarlo un poco no
debe generar ningún problema. Se trata de ajustarlo a las fotos de la máquina con que
trabajamos.
Añadir la ruta del programa convert, en general será de la forma /usr/bin/
Además, si al intentar añadir fotos a un álbum, el proceso no finaliza, se debe a que tenemos
que aumentar la directiva memory_limit del archivo de configuración de PHP(php.ini) a
32 MB al menos39 . Si no tiene ese valor no podremos añadir a los álbumes fotos de calidad
media.
La primera labor a realizar consiste en crear una categorı́a en la que pondremos las fotos de las
distintas Olimpiadas celebradas. Para eso pulsamos sobre la pestaña Categorı́as y le ponemos el
nombre y descripción adecuados.
36 En los temas 3D-fantasy, NukeNews y Odyssey se trata del fichero header.html
37 Un manual en Inglés sobre él: http://coppermine.sourceforge.net/manual.php
38 Si además, deseamos permitir que se puedan subir ficheros de más de 2MB véase 3.1.5 en la página 85
39 Habrá que reiniciar el servidor web para que los cambios tengan efecto.
Creemos ahora el álbum de fotos para esta convocatoria de Olimpiada, se trata de la XXI
edición, ası́ que pulsamos sobre Albums y, al pulsar sobre Nuevo añadimos el álbum XXI dentro
de la categorı́a Olimpiadas.
Una vez que tenemos creado el álbum, vamos a añadir todas las fotos de una tajada (es posible
hacerlo de una en una, tanto como administrador como permitı́rselo a los usuarios). Pondremos
nuestras fotos en el lugar adecuado40 para no tener que subirlas una a una, por ejemplo con
# mv olimpiada/ /var/www/html/modules/coppermine/albums/userpics/
Y nos garantizamos que el directorio y las fotos tengan los permisos adecuados, bien haciendo que
sean del usuario Apache41
# cd /var/www/html/modules/coppermine/albums/userpics/
# chown www-data olimpiada/*
# chown www-data olimpiada
o bien relajándole al directorio los permisos al modo 777. Una vez que tenemos nuestras fotos
listas pulsamos sobre Agregar Imágenes, nos situamos en el directorio olimpiada y marcamos
las que deseamos añadir al álbum.
40 Este directorio se puede cambiar desde la pestaña Config
41 En realidad es suficiente con que tenga permisos sobre el directorio. El que tenga permisos sobre las fotos nos
sirve sólo en el que caso de que deseemos hacer cambios sobre ellas desde el propio programa.
En Fedora, el usuario por defecto del servidor Web no es www-data, es apache.
Ya podemos ir añadiendo las de la semana cultural de Instituto, las del viaje de estudios, etc.
Sacarle más partido a este magnı́fico módulo es cosa vuestra.
[1] Creación de sitios web con PHP4, Fo javier Gil Rubio y otros, Osborne McGraw-Hill
[2] Desarrollo Web con PHP y MySQL, Luke Welling & Laura Thomson, Anaya Multimedia
[3] MySQL, Paul DuBois, Editorial Prentice-Hall
[4] MySQL, Ian Gilfillan, Anaya Multimedia
[5] Servidor Apache. Rich Bowen & Ken Coar. Prentice Hall
107