Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Curso Completo PHP & MYSQL PDF
Curso Completo PHP & MYSQL PDF
Una sencilla clasificacin de los Cualquier usuario que acceda a sta -ya sea en modo local, o a travs de un servidor
tipos de pginas web podra ser remoto visualizar siempre la misma fecha: 11 de julio de 2005.
esta:
<HTML>
Pginas estticas <HEAD>
Pginas dinmicas </HEAD>
<BODY>
Pginas estticas Hoy es 11-7-2006 y son las 14:23:57 horas
</BODY>
Diremos que una pgina es </HTML>
esttica cuando sus contenidos no
pueden ser modificados ni desde
el servidor que la aloja (ordenador ejemplo1.html
remoto) ni tampoco desde el
cliente (navegador) mediante
ninguna intervencin del usuario ni Una par de pginas dinmicas
tampoco a travs de ningn
programa.
Si pulsas en el enlace del primero de estos dos ejemplos vers que la fecha que
Pginas dinmicas aparece en la pgina es la fecha actual de tu sistema, y adems, cada vez que pulses el
botn Actualizar de tu navegador podrs comprobar que se actualiza la hora.
Llamaremos dinmicas a las
pginas cuyos contenidos s Una intervencin del usuario modifica los contenidos.
pueden ser modificados de forma
automtica o mediante la
intervencin de un usuario bien <HTML>
sea desde el cliente y/o desde el <HEAD>
servidor. <script language="JavaScript">
var son= new Date();
Para que esas modificaciones var fecha=son.getDate()+" - "+(son.getMonth()+1)+" - "+son.getFullYear();
puedan producirse es necesario
var hora=son.getHours()+":"+son.getMinutes()+":"+son.getSeconds();
que algo o alguien especifique:
document.write('Hoy es '+fecha+' y son las '+hora+' horas');
qu, cmo, cundo, dnde y de
qu forma deben realizarse, y que </script>
exista otro algo o alguien capaz de </HEAD>
acceder, interpretar y ejecutar <BODY>
tales instrucciones en el momento </BODY>
preciso. </HTML>
Si en la peticin se alude a un
documento con extensin .htm o .
html el servidor entender que
esa pgina no requiere la
intervencin previa de ningn
intrprete de su lado y entre- gar
la pgina tal cual. La de la izquierda consecuencia de haber hecho doble click sobre el icono del
documento contiene como direccin una ruta (el path que conduce hasta el documento)
Si en esa peticin se aludiera a
mientras que en la de la derecha aparece el sintagma http al principio de la direccin.
una extensin distinta .php, por
ejemplo el servidor enten- dera
En el primer caso no hemos hecho ninguna peticin de pgina web sino que hemos
que antes de servir la pgina debe
abierto un documento cuya extensin (html) est asociada con Internet Explorer en
leerla y requerir al intrprete de
PHP que ejecute los scripts nuestra configuracin de Windows. El proceso ha sido exactamente el mismo que si
desarrollados en ese lenguaje (en hubiramos hecho doble click sobre el icono de un documento con extensin txt, con la
caso de que los contuviera) y nica salvedad de que en este ltimo caso se habra abierto el block de notas (por la
devolvera al cliente el asociacin de extensiones y aplicaciones en la configuracin de Windows).
documento que resultara de las En el segundo caso las cosas son distintas. Se incluye el sintagma http acrnimo de
eventuales ejecuciones de tales HiperText Transfer Protocol para indicar que ese es el protocolo que debe ser utilizado
scripts. y que ser preciso que el servidor que reciba la peticin sea capaz de interpretarlo. Por
eso a los servidores que alojan pginas web se les suele llamar servidores HTTP y se
Algunos lenguajes les requiere que soporten este protocolo.
con nombre y apellidos
Siguiendo con los esquemas, he aqu el correspondiente a una peticin de pgina en la
que hay incrustados scripts escritos en lenguaje del lado del cliente:
Sin pretender hacer una enu-
meracin exhaustiva, los len-
guajes de script ms populares son
los siguientes:
DHTML
JavaScript
VBScript
DHTML no es exactamente un
lenguaje de programacin. Se
trata ms bien de una serie de
capacidades que se han ido
aadiendo a los navegadores
modernos mediante las cuales las
pginas pueden contener hojas de
estilo y/o organizarse en capas
susceptibles de ser
redimensionadas, modificadas,
desplazadas y/o ocultadas.
Editor Dev-PHP
El editor Dev-PHP
A lo largo del curso va a sernos de En el directorio Extras de este CD encontrars un fichero llamado devphp2012.exe.
gran utilidad el uso un editor de Tambin podrs descargar este programa de instalacin desde la direccin: http://devphp.
textos que nos permita identificar sourceforge.net/.
los nmeros de lnea de nuestros
scripts y que a la vez nos ayude En la opcin Downloads de esta pgina encontrars enlaces a la ltima versin de
mediante resaltado de textos a este editor. Probablemente tendrs dos opciones de descarga: Dev-PHP IDE 2.0.12 y
depurar la sintaxis. FullPackage with php. Sera suficiente con descargar la primera ya que la segunda
mucho ms pesada incluye el intrprete de PHP.
Existen multitud de editores y
podrs utilizar a tu gusto este o
cualquier otro que uses Configuracin de Dev-PHP en castellano
habitualmente. El hecho de
sugerirte este obedece a al hecho
de que es gratuito, bastante Una vez hayas descomprimido el fichero spDevPHP.zip al que hacemos referencia al
completo, consume pocos recursos margen la configuracin en castellano de Dev-PHP sigue la secuencia que puedes ver en
y se va actualizando las imgenes.
peridicamente.
Instalacin
Mensajes de error
Qu es
Proceso de instalacin
un servidor WEB?
En el CD-ROM que contiene los materiales de este curso hay un directorio llamado
Software. En l tienes un fichero llamado apache_1.3.35-win32-x86-src.msi.
Podramos definir un servidor WEB
como una aplicacin que permite
Al hacer doble click sobre su icono deber aparecer una pantalla como esta:
acceder a los recursos contenidos
en algunos de los directorios del
ordenador que la alberga a
usuarios remotos que realizan sus
peticiones mediante el protocolo
HTTP.
Qu es Apache?
Apache Software Foundation tiene Al pulsar Next en la ventana anterior se llega a esta otra en la que es preciso tener
su origen en febrero de 1995. seleccionada la opcin I accept the terms in the license agreement para que se active el
Hasta ese momento el software botn Next y poder continuar la instalacin.
ms popular de servidores de
HTTP era el desarrollado por Rob
McCool, miembro del Centro
Nacional para Aplicaciones de
Super computacin (NCSA), de la
Universidad de Illinois.
Manual o automtico
Al describir el proceso de
instalacin aqu a la derecha
sugeramos elegir la opcin Run
when started manually, only for
me frente a la otra alternativa
Como Network Domain y como Administrator's e-mail adress puedes poner nombres
posible la reco- mendada en la
cualesquiera siempre que no contengan espacios ni caracteres especiales y en el
pantalla de instalacin Run as a
service for All Users. caso de la direccin e-mail sta debe contener el smbolo @. Como Server Name escribe
localhost.
La instalacin recomendada
contempla el uso del servidor Por ltimo, elige la opcin Run when started manually, only for me (al margen te
como un servidor de red de rea comentamos el por qu de esa eleccin) y pulsa de nuevo Next.
local accesible desde el resto de
los ordenadores de esa red. Es En la pantalla que aparece inmediatamente despus de la anterior se permite elegir el
lgico que en esas circunstancias modo de instalacin: Complete Custom. Elige la opcin Complete y pulsa nuevamente
el servidor se configure con sobre Next.
autorranque y que se inicie
automticamente en el momento
en que se arranca el ordenador,
con lo cual empezar a consumir a
partir de ese instante y en todo
momento recursos del sistema.
Arrancar Apache
http://localhost/
Una vez hayas pulsado OK volver a aparecer la ventana que permite cambiar el
o, tambin directorio de instalacin. Comprueba que ahora diga Install Apache HTTP Server to
http://127.0.0.1/ the folder C:\ y pulsa Next en esa ventana y en las siguientes.
con lo que deber abrrse una Aparecer una ltima ventana donde dice Installation Wizard Completed y una vez que
pgina idntica a la ves un la hayas pulsado el botn Finish la instalacin de Apache habr terminado.
ltima de las imgenes. Esa ser
la prueba definitiva de que el
servidor est funcionando Probando Apache
correctamente.
Si te ests preguntado por qu Estas tres imgenes ilustran el proceso de prueba que te describimos al margen.
esas direcciones localhost
127.0.0.1 o por qu no hemos
escrito el nombre de ninguna de
pgina web, ten un poco de
paciencia! Trataremos de ello
cuando configuremos Apache.
Apagar Apache
El desinstalador de Apache no
eliminar ni el directorio raz C:
\Apache ni los subdi- rectorios
conf y htdocs del mismo. La
razn es la seguridad. El directorio
conf contiene los archivos de
configuracin del servidor en
pginas posteriores veremos que
hay que modificar sus valores por
defecto y al no eliminarlos nos
estar dando la opcin de poder
reutilizarlos (sin tener que
empezar de cero) en futuras
instalaciones.
http://mispruebas.com
Cuidado!
Qu es PHP?
Instalando el PHP
El lenguaje PHP -acrnimo de En el CD-ROM del curso dentro de la carpeta Software podrs encontrar un fichero
Hypertext Pre Processor- suele llamado php-4.4.2-Win32.zip.
definirse como: interpretado y de
alto nivel. El cdigo de sus Si tienes instalado Winzip, al hacer doble click sobre el icono se te abrir la ventana de
instrucciones va insertado en este descompresor y al pulsar sobre el icono Extract se te abrir una ventana como la que
pginas HTML (es un lenguaje de aparece en la imagen.
script) y es interpretado, siempre,
en el servidor. Si has seguido los pasos indicados en la pgina anterior para la instalacin del servidor
Apache, tendrs en tu ordenador un directorio llamado C:\Apache.
Se trata un lenguaje de estilo
clsico, cercano en su sintaxis a C+ Selecciona como directorio de descompresin C:\Apache tal como ests viendo en la
+. figura y presta atencin a que en las opciones de descompresin de Winzip est
seleccionada la opcin All files y marcada nicamente la casilla de verificacin Use folder
Qu se necesita para names.
trabajar con PHP?
Podemos
probar ahora PHP?
En la segunda modificacin le
hemos indicado a Apache que
deber cargar un mdulo que se
encuentra en el sitio que indican la
ruta y el nombre del fichero.
Este mdulo es el que permite esto ocurre como consecuencia de haber puesto el signo menos delante de Indexes
que el servidor interacte con PHP (cuidado! debe ir pegado a Indexes sin ningn espacio intermedio) en la lnea Options -
cuando sea necesario.
Indexes FollowSymLinks MultiViews.
En la tercera modificacin
indicamos al servidor que debe El subdirectorio images no contiene ficheros con nombre index.html, ni tampoco index.
utilizar un mdulo propio php ni index.htm (los especificados en la directiva DirectoryIndex) y el signo menos lo
(programa escrito en lenguaje C) que hace es denegar el acceso (en el caso de no indicar el nombre de algn documento
mod_php4.c especfico para PHP en la direccin) a los directorios que no los contengan.
y para este tipo de configuracin.
Si no hubiramos modificado esa directiva nos aparecera una lista con todos los ficheros
Aqu estamos instalando PHP como contenidos en ese subdirectorio, tal como puedes ver en esta imagen.
mdulo de Apache, pero existe
otra posibilidad conocida como
instalacin en modo CGI
(Common Gateway Interface).
Otras modificaciones
en httpd.conf
Aunque no vamos a modificarlos, es conveniente saber que existen algunos otros
A lo largo de curso iremos elementos importantes en httpd.conf.
incorporando algunos servicios que
requerirn algunos otros cambios DocumentRoot "C:/Apache/htdocs"
en la configuracin de Apache.
Esta lnea que se ha incluido automticamente al hacer la instalacin indica la ruta y el
Hablaremos de ellos cuando sea nombre del directorio en el que, obligatoriamente, han de estar los documentos y los
necesario realizarlos. subdirectorios susceptibles de ser servidos a travs del protocolo HTTP.
Cualquier documento que estuviera fuera de este directorio sera inaccesible, por lo
tanto todos los documentos que vayamos generando a lo largo del curso, deberemos
guardarlos dentro de este directorio htdocs.
Como es lgico, bastara cambiar esa lnea de la configuracin para utilizar como raz del
servidor otro directorio cualquiera.
ServerName localhost
Esta otra lnea tambin contenida en httpd.conf es la que determina el nombre del
servidor y a travs de ella se identifican las peticiones que el navegador realiza a ese
servidor. Por esta razn, cuando probbamos la instalacin de Apache, escribamos como
direccin http://localhost.
Para esta muy improbable Como medida de seguridad y anticipndonos a razones que comentaremos ms adelante,
emergencia, te hemos puesto en el guarda con el mismo nombre una copia del fichero php.ini, que acabamos de configurar,
directorio cursoPHP del CD-ROM en el directorio c:\Apache\php4\
una carpeta llamada
Configuraciones donde tienes
ambos ficheros: httpd.conf y php.
ini.
Anterior Indice Siguiente
Autoinstalacin de Apache+PHP
Precauciones previas
Instalacin automtica
En el directorio Extras del CD-ROM encontrars un fichero llamado Apache_PHP.exe.
Esta instalacin no es otra cosa Bastar con que hagas doble click sobre su icono y comenzar el proceso de instalacin
que una alternativa de emergencia automtica cuyas ventanas y secuencia de instalacin puedes ver en la imagen.
para aquellos casos en los que
tengas dificultades durante el
proceso de instalacin y
configuracin manual.
La instalacin automtica
Instalar Apache en el
Una vez concluido el proceso anterior aparecer un nuevo grupo de programas tal
directorio c:\Apache
como el que ves en esta imagen.
Descomprimir PHP en c:
\Apache\php4
Desinstalacin Solo faltara abrir el navegador y escribir una de estas dos direcciones:
http://localhost/info.php o http://127.0.0.1/info.php y aparecera en pantalla una pgina
como esta:
Para realizar la desinstalacin es
necesario tener apagado el
servidor Apache. Basta con
acceder a la opcin Agregar o
quitar programas y elegir: Apache
1.3.35 + PHP 4.4.2 para que se
realice la desinstalacin completa y
el borrado tanto del fichero php.ini
del directorio Windows como de
php4ts.dll del directorio del
sistema.
De ser as, el proceso de instalacin y configuracin habra terminado y esa pgina nos
estara facilitando toda la informacin relativa a la configuracin actual de nuestro PHP.
Apagar Apache
Acceso a
Proceso de instalacin MySQL
las bases de datos
Dentro del directorio Software del CD-ROM del curso podrs encontrar el fichero
mysql-4.0.26-win32.zip que contiene los ficheros de instalacin de MySQL. Lo primero
El acceso y tratamiento de la
informacin en bases de datos que tenemos que hacer es descomprimirlo en un directorio provisional, en cualquier parte
MySQL requiere que los usuarios de nuestro disco duro.
estn identificados mediante un
nombre (login) y opcionalmente
una contrasea de acceso.
Arrancar y parar el
servidor MySQL
Algunos comandos
para ejecutar MySQL
desde MS-DOS
a partir de su ejecucin el servidor MySQL ya estar activo y podramos gestionarlo desde
Antes de empezar a ejecutar los PHP desde la propia consola MS-DOS.
comandos de MySQL es necesario
situarse en el subdirectorio bin
que est dentro de c:\mysql. Cuidado!
Para ello hemos de escribir en el En algunas versiones de Windows es posible que, al arrancar el servidor, se quede el cursor
prompt de DOS lo siguiente: intermitente en la ventana de MS-DOS sin que regrese al prompt. Basta con cerrar la
ventana Smbolo del Sistema y reabrirla. El servidor seguir activo y ya ser posible la
CD C:\mysql\bin
ejecucin de comandos desde esta consola.
Una vez en el directorio bin (all
estn los ejecutables de MySQL)
los comandos bsicos de arrancar Apagar el servidor MySQL
y parar, as como el de creacin de
un usuario los tienes descritos Para poder apagar el servidor es necesario utilizar un nombre de usuario. En este caso
junto a las ilustraciones de la
utilizaremos el nombre de usuario root (el usuario que se crea por defecto.
derecha.
La sintaxis sera la siguiente:
Creacin de un nuevo
usuario
En la columna de la derecha tienes Para crear el nuevo usuario utiliza exactamente la sintaxis que ves en la imagen.
descrito e ilustrado el proceso de
puesta en marcha y apagado del
servidor MySQL mediante esta
utilidad.
WinMySQLadmin el programa al
que accedemos desde el icono del
semforo tiene una peculiaridad
que hemos de tener muy en Cuidado!
cuenta.
El pulsar Enter en MySQL no significa como ocurre en DOS que se vaya ejecutar el
Al hacer click sobre el semforo comando. Si observas la imagen, hemos pulsado Enter detrs de la palabra localhost de la
disponemos de dos opciones, tal
primera lnea y lo que ha ocurrido es que el cursor ha saltado hasta la segunda incluyendo
como podemos ver en la ltima
imagen de esta pgina. La opcin automticamente > que significa que continua la instruccin anterior.
Win 9x slo ser accesible para En MySQL las ejecucin de las instrucciones requiere que haya un ; inmediatamente antes
quienes usen Windows98 mientras del pulsar la tecla Enter.
que la opcin Win NT podr ser
utilizada por los usuarios de
Windows2000, NT o XP. Salir del interface de usuario
Show me es independiente del
sistema operativo que estemos Para abandonar la interface de usuario basta con escribir exit tal como ves en la
usando. imagen. El sistema escribir su mensaje de despedida de forma automtica y el prompt
regresar a c:\mysql\bin.
Cuando elegimos la opcin Show
me aparece una ventana en la que
mediante diferentes pestaas se
nos va mostrando toda la
informacin relativa a la
configuracin actual de MySQL.
Tenlo en cuenta. Puede que te Cuando un usuario registrado con contrasea (tal como ocurrira al usuario pepe
evite algunos sobresaltos. creado en los prrafos anteriores) trate de acceder al interface de usuario deber usar
siempre una sintaxis como esta:
Desactivacin
del autorranque
No debes borrarlas!
en la que vamos a escribir como nombre de usuario y contrasea los mismos del usuario
La base de datos mysql contiene que acabamos de crear, es decir: pepe y pepa, y luego pulsaremos OK.
los datos relativos a usuarios y si
no est presente, MySQL no La ventana se cerrar y en la barra de herramientas de Windows aparecer este
funcionar.
Posibles problemas de La imagen que tienes en la parte superior corresponde a una instalacin bajo Windows98.
instalacin En otras versiones de Windows (2000, NT XP) aparecer activado Win NT, el submen
contendr opciones aadidas y ser preciso como paso previo activar el servicio antes de
poner en marcha el servidor.
Si trataras de instalar MySQL en
Tambin es probable que bajo WindowsXP no aparezca la ventana en la que se recoge
un directorio distinto al
especificado por defecto en el nombre de usuario y contrasea. No tiene ninguna importancia. No altera la forma de
instalador C:\mysql (podra ser funcionar de MySQL.
una unidad distinta, un directorio
diferente o ambos) el servidor no
arrancara a travs del interface de Ejemplo de my.ini para usar un directorio distinto
MS-DOS descrito anteriormente.
Este sera el formato ms simple del fichero my.ini que habras de crear (y guardar en
Eso ocurrira porque MySQL no el directorio windows) si trataras de instalar MySQL en el directorio basededatos de la
encontrara la ruta adecuada. La unidad F:. Mediante la inclusin de este fichero (inmediatamente despus de la
forma de solventar este problema
instalacin de MySQL) y antes de hacer la puesta en marcha bajo MS-DOS solventaras la
sera crear un fichero con nombre
my.ini (en el que se especificaran
incidencia que te comentamos al margen.
esas rutas) y guardarlo en el
directorio windows. La sintaxis y [mysqld]
contenido de es fichero la tienes al basedir=F:/basededatos/
margen. datadir=F:/basededatos/data/
Qu es PHPMyAdmin?
Proceso de instalacin
PHPmyAdmin es, simplemente, un En el directorio Software del CD-ROM hay un fichero llamado phpMyAdmin-2.8.1.zip
conjunto de utilidades y scripts que tenemos que descomprimir obligatoriamente (contiene scripts de PHP) en el
escritos en lenguaje PHP que directorio c:\Apache\htdocs.
permiten gestionar bases de datos
MySQL a travs de una pgina Al hacerlo se crear un directorio llamado phpMyAdmin-2.8.1 al que vamos a
web. cambiar el nombre por otro ms cmodo y fcil, dado que al utilizar phpMyAdmin
tendremos que escribir el nombre de ese directorio con bastante frecuencia.
Mediante esta herramienta, sin
conocer el lenguaje MySQL, Vamos a renombrarlo como MyAdmin.
podremos modificar, consultar,
crear y borrar tanto bases de Dentro de ese directorio que acabamos de renombrar hay un subdirectorio con nombre
datos como tablas y registros libraries y, en l, un fichero llamado config.default.php. Abrmoslo con nuestro editor
contenidos en ellas. DEV-PHP, guardmoslo (sin hacer ninguna modificacin) con el nombre config.inc.php,
Tambin permite la gestin de
y ya, en este ltimo fichero busquemos la lnea n 31 y donde dice:
usuarios recuerda que MySQL
requiere claves y contraseas y
$cfg['PmaAbsoluteUri'] = ' ';
modificar sus privilegios de acceso. y, pongamos
$cfg['PmaAbsoluteUri'] = 'http://localhost/MyAdmin/';
Cul es su utilidad? Guardemos los cambios. Ser necesario editar y modificar, tambin, el fichero Config.
class.php (contenido igualmente en el directorio libraries) y modificar la lnea n 10.
La versin de MySQL para Dnde dice:
Windows no dispone de una
interface propia que permita var $default_source = './libraries/config.default.php';
gestionar sus bases de datos a deberemos poner
travs de Windows. var $default_source = './libraries/config.inc.php';
La nica posibilidad de gestin es Hechas las modificaciones en ambos ficheros ya estaremos en condiciones de probar su
a travs de MS-DOS y eso requiere funcionamiento.
que el usuario sepa utilizar los
comandos propios de las funciones
MySQL. Prueba de funcionamiento de PHPMyAdmin
Sin esos conocimientos de SQL,
tendramos como recurso la Ya estamos en condiciones de hacer una prueba de phpMyAdmin.
posibilidad de gestionar las bases
de datos a travs de nuestros Arranquemos Apache dejando minimizada su ventana MS-DOS y arranquemos
propios scripts PHP, pero eso nos tambin MySQL -el semforo debe quedar en verde. Con ambos servidores activos
exigira conocer con una cierta escribamos ahora en la barra de direcciones de nuestro navegador:
profundidad a medida que
avancemos en el curso lo iremos http://localhost/MyAdmin/
logrando las funciones que PHP
posee para la gestin de este tipo y se nos abrir una pgina como esta:
de bases de datos.
La advertencia
No te preocupes!.
Por qu transferir
Proceso de transferencia
los documentos?
Ahora es el momento de transferir todos los materiales del curso al servidor que
hemos instalado y configurado.
Dado que estamos en un curso de
PHP y teniendo en cuenta que PHP
Vamos a buscar en el CD-ROM una carpeta llamada cursoPHP y vamos a copiarla
es un lenguaje del lado del
servidor, resulta imprescindible ntegra dentro del directorio C:\Apache\htdocs.
que, a partir de ahora, trabajemos
desde el servidor. Una vez transferida esta carpeta arrancaremos nuestro servidor Apache y abriremos el
navegador poniendo como direccin http://localhost/cursoPHP/ y ya tendremos acceso al
Tanto los ejemplos como los ndice principal de este Curso.
ejercicios que tendrs que ir
realizando van a requerir, de Ahora podemos prescindir del CD-ROM. De aqu en adelante con la excepcin del
forma ineludible, que utilicemos software para seguir el curso slo ser necesario que arranquemos el servidor
continuamente el servidor. Apache y accedamos a la direccin:
Por esta razn es necesario que http://localhost/cursoPHP/
toda la documentacin est
accesible a travs de nuestro Ha llegado el momento de empezar con PHP. Adelante!
propio servidor.
Qu es un servidor FTP?
Instalacin de un servidor FTP
Conceptualmente un servidor FTP
no difiere en nada de un servidor Se trata del instalador de un servidor FTP, que tal como te indicamos en el apartado
HTTP. Software del Curso puedes descargar desde FileZilla_Server_0_9_18.
Las diferencias entre los diversos Podemos instalarlo con las opciones por defecto, salvo en el caso de las dos ventanas
tipos de servidores estriban en los que ves en la imagen:
programas que usan software de
servidor en el tipo de peticin que
aceptan y en el protocolo que
requieren las peticiones que
atiende.
Arrancar y apagar el
servidor
en las que elegiremos Start manually en ambas opciones. De esta forma evitaremos que
servidor arranque al conectar el ordenador -consumiendo menos recursos- y tendremos
Como resulta obvio, el sealado la opcin de activarlo slo en el momento en que necesitemos usarlo.
con Start permite la puesta en
marcha del servidor y el sealado
con Stop para detener su Server Interface
funcionamiento.
Definicin de los servicios Se deja la opcin None (por defecto) en el men de opciones User should.. (4) y
se pulsa el botn OK
El directorio raz (o root) de un Se escribe -en la nueva ventana-el nombre de usuario(5).
servidor FTP igual que ocurra en
el caso de Apache puede ser uno
cualquiera de los existentes en el
ordenador en el que tengamos
instalado el software de servidor.
Cada uno de los directorios accesibles para un usuario (Shared folders) puede gozar de
privilegios distintos. Al seleccionar un directorio se activan las casillas de verificacin que
ves en la imagen y desde ellas se pueden conceder privilegios a dos niveles: ficheros y
directorios.
A nivel de ficheros cuenta con las opciones Read (descargar), Write (escribir, subir),
Delete (borrar) y Append (aadir a un fichero preexistente cuando la transferencia ha
sido interrumpida). Cada una de ellas puede configurarse como opcin permitida no
permitida.
Cuando se trata de directorios las opciones (tambin puede configurarse cada una de
ellas como permitida/no permitida) son: Create (Crear), Delete (borrar), List (ver una
lista de los contenidos) y +SubDirs (Cuando est activado asigna automaticamente a
todos los subidrectorios que contenga los mismos privilegios que al directorio actual).
Roots de usuarios
admin
En C:
List. Al concederle este privilegio
podran visualizarse (al acceder al
root de este usuario mediante un
cliente FTP) la lista de directorios y
documentos que contiene.
En C:\Apache
Todos. Al ser el usuario admin
parece razonable concederte el
mayor grado de libertad.
En C:\ServidorFTP
Todos. Por idnticas razones al
caso anterior.
secre
En c:\ServidorFTP
List. Las razones son idnticas al
caso de admin
En Documentacin
Todos>. Se entiende que este
usuario es quien realiza la gestin Directorios accesibles por del usuario secre
completa de este directorio.
En Gestin
Todos. Las razones son idnticas
a las del caso anterior.
Clientes FTP
Si escribimos en la barra de
direcciones del navegador se
requiere la versin 5 superior de
IE:
ftp://admin:admin@localhost
y un servidor FTP con nombre La razn de estas asignaciones las justificamos al margen.
localhost est activo, veremos
que aparecen en la ventana del Observars que el directorio raz est marcado con la letra H. Para cambiarlo bastar con
navegador los iconos de los seleccionar otro cualquiera y pulsar sobre el botn que ves en esta imagen.
ficheros contenidos en el directorio
root del servidor y que, a la vez,
se nos ofrece la posibilidad de:
borrar archivos; crear
subdirectorios; copiar ficheros
(desde el servidor a cualquier otro Acceso de usuarios
directorio de nuestro ordenador o
viceversa) sin ms que seguir
mtodos idnticos a los que se La direccin localhost apunta siempre hacia el directorio root de usuario. Eso quiere
utilizan habitualmente en Windows. decir que si escribimos en el cliente FTP esa direccin y nos identificamos como admin
(indicando la contrasea de usuario) veramos algo como esto:
El acceso a un servidor FTP
utilizando un navegador como
cliente requiere tres datos:
nombre de usuario, nombre del
servidor y contrasea, que son los
que aparecen en azul un poco ms
arriba.
Grupos de usuarios
La configuracin de grupos de
usuarios es una opcin que ofrece
bastante inters. Mediante esta Utilizacin de alias
opcin se pueden establecer
privilegios comunes a una serie de
usuarios. Ello facilita la Este servidor tambin permite ser configurado para la utilizacin de Alias. Pulsando
configuracin cuando se trata de con el botn derecho del ratn sobre el nombre de uno de los directorios aparece un
grupos numerosos que van a men como este:
compartir directorios y privilegios.
La opcin autocreate
Supongamos que pretendemos
que cada uno de los alumnos de
nuestro supuesto disponga de un
subdirectorio propio para poder
subir y gestionar sus propios
trabajos de cada materia.
Incluir en Shared folders la ruta Una vez creados los alias podremos utilizarlos para acceder a los espacios
del directorio base (en el que (sustituyendo el nombre del directorio por el alias). Aqu tienes imgenes del ejemplo.
pretenden crearse los Observars que localhost/Apache, localhost/servidor y localhost/indio nos conducen al
subdirectorios de cada uno de los mismo sitio.
usuarios pertenecientes al grupo)
acabada con /:u
Privilegios de los
diferentes grupos de
usuarios
Fichero de configuracin
de Filezilla Server
FTP y hosting
Hay otros casos en los que est Directorios accesibles y privilegios del grupo
desactivado, como ocurre con el
popular geocities, que no permite
FTP y donde el mantenimiento de La configuracin de los directorios accesibles y de los privilegios en cada uno de ellos
los espacios de alojamiento de
es idntica a la descrita para el caso de usuarios no pertenecientes a un grupo.
pginas web de sus servidores
requiere de forma ineludible La nica diferencia estriba en que aade una nueva e interesante posibilidad a travs
acceder por medio de una pgina de la opcin Autocreate.
WEB especfica que permite
realizar las transferencias de
ficheros por un mtodo alternativo
al FTP tradicional.
Una vez creado un grupo (o grupos) es necesario asignar los usuarios a ese grupo. El
proceso es muy similar al de creacin de usuarios no adscritos a ningn grupo. La nica
diferencia est en el punto (4) del proceso, ya que ahora hemos de elegir el grupo al que
va a pertenecer el usuario (antes elegamos none).
En el ejemplo hemos incluido dos usuarios por cada uno de los grupos:
En todos los casos hemos incluido una contrasea idntica al nombre de usuario.
Los miembros de un grupo recogen automticamente todos los privilegios del Shared
Folder del grupo al que pertenecen. No obstante, es posible aadir nuevos directorios y
privilegios (aadidos a los especficos del grupo al que pertenecen) incluyndolos en el
Shared Folder del usuario.
Cuidado!
En el directorio Extras del CD-ROM hay una carpeta llamada ServidorFTP que contiene
toda esta estructura de directorios. Puedes copiarla al directorio raz de tu ordenador y ya
tendrs la configuracin descrita en la imagen de la columna de la izquierda.
Un servidor de correo
Proceso de instalacin
Se trata de una aplicacin que
puede descargarse del sitio http:// Si no has descargado el programa de instalacin desde el apartado Software del curso
www.pmail.com/ que permite puedes hacerlo de este enlace de http://www.pmail.com eligiendo el fichero Mercury mail
instalar un servidor local de correo transport system for win32 and NetWare systems v.40.1a o hacerlo directamente desde aqu.
tal como se indica en el apartado
Software del Curso de este CD. Una vez descargado el programa, el proceso de instalacin es el que describen las
imgenes siguientes:
Finalidad de esta
instalacin
[mail function]
; For Win32 only.
SMTP =
y cambiarlas por:
[mail function]
; For Win32 only.
SMTP = 127.0.0.1
y tambin
; For Win32 only.
;sendmail_from=me@example
Cuidado!
Si has hecho la copia de
seguridad -que te hemos
recomendado al configurar PHP-
del fichero php.ini en c:\Apache
\php4\ deberas sustituirla por
esta nueva versin modificada.
El proceso de instalacin
Arrancar y parar el
servidor
Aadir usuarios
Tal como ves en las imgenes slo Este es el cdigo fuente de un script que nos permitir comprobar si hemos configurado
debes acceder opcin correctamente el servidor de correo. El contenido que aparezca en la pgina nos dir lo que
Configuration y seleccionar ha ocurrido. No te preocupes si an no entiendes el cdigo! Ya hablaremos de l ms
MercuryD POP3 client. Aparecer adelante.
una ventana como la que ves al
margen.
<?
Los pasos a seguir estn if( mail("juan@mispruebas.com", "Una prueba definitiva","Bienvenid@ a
numerados en la imagen. PHP",
"From: Administrador de mispruebas.com <admin@mispruebas.com>
El primero ser establecer el Check Reply-To: juan@mispruebas.com
Every (frecuencia con la que se Cc: perico@mispruebas.com
comprueba la existencia de nuevos
Bcc: andres@mispruebas.com
mensajes en la cuenta externa).
X-Mailer:PHP/" . phpversion())){
Por defecto se autoconfigura en 30
segundos. Ah podrs indicar el print "Mensajes enviados con exito";
periodo de tiempo (en segundos) }else{
que estimes oportuno. print "Se ha producido un error";
}
El segundo paso es pulsar el botn ?>
Add que abrir la ventana que ves
superpuesta en la imagen.
Probar servidor de
Debemos escribir el nombre de
correo
una cuenta externa, el nombre de
su servidor POP3 y la contrasea
de esa cuenta de correo, y
asociarlas con una cuenta local. Leer mensajes de cuentas externas
Despus de pulsar el OK se cierra
la ventana superior y deberemos
pulsar el botn Save para guardar
los cambios
Enviar mensajes a
direcciones externas
An hemos de solventar un
pequeo problema en esta
configuracin. Al enviar mensajes
desde una cuenta local hacia una
cuenta externa se incluira en el
mensaje la direccin local como
direccin de respuesta. Eso,
obviamente, planteara problemas
al destinatario ya que sus
respuestas no encontraran ese
dominio en la red.
El problema se resuelve
modificando la configuracin del
cliente de correo e incluyendo
como direccin de respuesta una
cuenta externa. De esta forma,
combinando esta configuracin con
la de lectura de cuentas externas
podramos gestionar desde nuestra
cuenta local el envo y recepcin
de mensajes externos.
En esas circunstancias es
necesario acceder a la opcin
Mercury SMTP Client que nos
abrir una ventana como que la
ves al margen. Bastar con
rellenar los campos
correspondientes a Credentials for
SMTP Authentication, if required Enviar mensajes a cuentas externas
poniendo en Username y password
los mismos valores que usamos en
la configuracin de esa cuenta en
el cliente de correo.
Desinstalacin del
servidor de correo
La instalacin de Mercury no
escribe nada en el registro de
Windows. Por ello, el proceso de
desinstalacin no existe. Basta con
borrar del directorio de instalacin
y habremos desinstalado el
servidor.
Anterior Indice Siguiente
PHP y HTML
Pginas PHP
La primera pgina en PHP
Las pginas PHP pueden ser Observemos este cdigo fuente. Como vers, se trata de una pgina web muy simple
pginas web normales a las que se que no contiene ningn script PHP.
cambia la extensin, poniendo .
php en vez de .htm .html. Hemos guardado esa pgina con el nombre ejemplo4.html y luego la hemos vuelto a
guardar sin modificar nada en sus contenidos como ejemplo4.php.
En una pgina cuyo nombre tenga
por extensin .php se pueden
<html>
insertar instrucciones escritas en
lenguaje PHP anteponiendo <? a
<head>
la primera instruccin y <title>Aprendiendo PHP</title></head>
escribiendo des- pus de la <body>
ltima ?>. Esta es una pgina supersimple
</body>
A cada uno de estos bloques de </html>
instrucciones le llamaremos un
script.
Ver ejemplo4.html Ver ejemplo4.php
No existe lmite en cuanto al
nmero de scripts distintos que
pueden insertarse dentro de una Si visualizamos ambos ejemplos veremos que los resultados son idnticos.
pgina.
Un poco de sintaxis
Los primeros script PHP
La primera instruccin PHP que Editemos la pgina anterior (ejemplo4.php) y aadmosle nuestra primera etiqueta
conoceremos ser esta: PHP guardndola como ejemplo5.php. Este sera el cdigo fuente:
echo "un texto..";
<html>
La instruccin echo seguida de un <head>
texto entrecomillado har que el <title>Aprendiendo PHP</title></head>
PHP escriba en la pgina web
<body>
resultante lo contenido en esa
Esta es una pgina supersimple
cadena de texto.
<?
Al final de cada instruccin echo "Aparecer esta linea?";
debemos insertar siempre un ?>
punto y coma (;) </body>
</html>
El (;) indicar a PHP que lo que
viene a continuacin es una nueva
instruccin. Ver ejemplo5.php
Para facilitar la depuracin los
scripts no suelen escribirse dos Veamos ahora un ejemplo con las diferentes opciones de uso de las comillas
instrucciones en una misma
lnea. <html>
print "un texto..";
<head>
<title>Aprendiendo PHP</title></head>
La instruccin print tiene una <body>
funcin similar no es exacta- <?
mente la misma a la descrita /* Las instrucciones PHP son las que aparecen en rojo.
para echo. Las etiquetas en azul intenso son el cdigo HTML.
Todo lo que aparece en este color son lneas de comentario
print ("un texto..");
de las que hablaremos ms adelante
Esta es otra posibilidad la ms Cuando rescribas estos primeros scripts
habitual de utilizar print. Aqu bastar que incluyas las instrucciones escritas en rojo */
encerramos entre parntesis la
cadena que pretendemos que /* ponemos <br> al final del texto para que cuando se
aparezca impresa en la pgina web. ejecute cada una de las instrucciones echo
se escriba -adems del texto- un salto de linea HTML.
El hecho de que utilicemos
De este modo, el resultado de cada ECHO
parntesis no nos evita tener que
encerrar la cadena (texto) a aparecer en una lnea diferente */
imprimir entre comillas.
# aqu utilizamos solo unas comillas
Comillas echo "Este texto solo lleva las comillas de la instruccin<br>";
dentro de comillas
# aqu anidaremos comillas de distinto tipo
Existen dos tipos de comillas:
echo "La palabra 'comillas' aparecer entrecomillada<br>";
dobles " (SHIFT+2) y sencillas
' (tecla ? en minsculas).
# esta es otra posibilidad invirtiendo el orden de las comillas
Cuando es preciso anidar comillas echo 'La palabra "comillas" aparecer entrecomillada<br>';
deben utilizarse tipos distintos
para las exteriores y para las # una tercera posibilidad en la que utilizamos un mismo
interiores. # tipo de comillas. Para diferenciar unas de otras anteponemos
# la barra invertida, pero esta opcin no podramos utilizarla
Para que una etiqueta echo
# al revs.
interprete unas comillas como
texto y no como el final de la # No podramos poner \" en las comillas exteriores.
cadena es necesario antepo- echo "La palabra \"comillas\" usando la barra invertida<br>";
nerles un signo de barra invertida ?>
(\). </body>
</html>
En ningn caso ni con echo ni
con print est permitido sustituir
las comillas exteriores (las que Ver ejemplo6.php
encierran la cadena) por \". Esta
sintaxis solo es vlida para indicar
a PHP que debe interpretar las
comillas como un carcter ms. Ejercicio n 2
En la pgina siguiente veremos las Crea un subdirectorio en htdocs y ponle como nombre practicas.
diferentes opciones de las lneas Escribe con tu editor un script similar al ejemplo6.php utilizando print y print()en vez de
de comentarios.
echo. Guarda el documento en la carpeta practicas con el nombre ejercicio2.php y
Al realizar el ejercicio que te comprueba su funcionamiento.
proponemos no es necesario que Recuerda que para visualizarlo debers escribir en tu navegador:
pongas los comentarios del http://localhost/practicas/ejercicio2.php
ejemplo.
Por qu usar
Ensayando lneas de comentario
lneas de comentario? En este ejemplo hemos incluido marcados en rojo algunos ejemplos de insercin de
lneas de comentario.
A primera vista pueden parecer
intiles. Para qu recargar las
pginas con contenidos que no se <HTML>
van a ver ni ejecutar? <HEAD>
<TITLE>Ejemplo 7</TITLE></HEAD>
Las lneas de comentario sirven <BODY>
para poder recordar en un futuro
<?
qu es lo que hemos hecho al
// Este comentario no se ver en la pgina
escribir un script y por qu razn
lo hemos hecho as.
echo "Esto se leer <BR> "; // Esto no se leer
A medida que vayamos avanzando
vers que en muchos casos /* Este es un comentario de
tendremos que aplicar estrategias mltiples lneas y no se acabar
individuales para resolver cada hasta que no cerremos as.... */
problema concreto.
Si un comentario va a ocupar ms
de una lnea podremos escribir /*
Ejercicio n 3
al comienzo de la primera de ellas
y */ al final de la ltima. Las
Escribe un script en el que se utilicen las funciones print, print() y echo aadiendo con los
lneas intermedias no requieren de
ningn tipo de marca. diferentes formatos lneas de comentario que expliquen la sintaxis de cada una de las
funciones. Gurdalo como ejercicio3.php en el directorio practicas y comprueba su
Los comentarios para los que funcionamiento.
usemos la forma /* ... */ no
pueden anidarse. Si, por error, lo
hiciramos, PHP nos dar un Anterior Indice Siguiente
mensaje de error.
Constantes
Qu es una constante?
Un ejemplo con constantes
Si una cadena empieza por uno o # Pondremos la etiqueta de cierre del script y escribiremos
varios caracteres numricos, al # una lnea de cdigo HTMAL
tratar de operarla aritmticamente ?>
PHP considerar nicamente el
valor de los dgitos anteriores a la <br>Ahora veremos los mismos resultados usando la function prueba<br><br>
primera letra o carcter no
numrico.
<?
El punto entre caracteres
numricos es considerado como # Estamos dentro de un nuevo script abierto por el <? anterior
separador de parte decimal.
/* Aunque an no la hemos estudiado, escribiremos una funcin
Tal como puedes ver en el cdigo a la que (tenemos que ponerle siempre un nombre)
fuente del ejemplo que tienes al vamos a llamar prueba()
margen, es posible definir
Lo sealado en rojo es la forma de indicar el comienzo
constantes a las que se asigne
como valor el resultado de una
y el final de la funcion
operacin aritmtica. Lo marcado en azul son las instrucciones
que deben ejecutarse cuando la funcin prueba()
sea invocada */
Ampliando echo
function prueba(){
Mediante una sola instruccin echo "Valor de la constante EurPta: ". EurPta . "<BR>";
echo se pueden presentar (en la print "Valor de la constante PtaEur: ". PtaEur. "<BR>";
ventana del navegador del cliente) echo "Valor de la constante Cadena: ", Cadena , "<BR>";
de forma simultnea varias print ("Valor de la constante Cadena x EurPta: " .
cadenas de caracteres y/o
Cadena*EurPta . "<br>");
constantes y variables. Basta con
print ("Valor de la constante Cadena2 x EurPta: " .
ponerlas una a continuacin de
otra utilizando una coma como Cadena2*EurPta . "<br>");
separador entre cada una de ellas. }
La forma anterior no es la nica # Las funciones solo se ejecutan cuando son invocadas
ni la ms habitual de enlazar
elementos mediante la instruccin /* La funcin anterior no se ejecutar hasta que escribamos
echo. Si en vez de utilizar la una lnea como esta de abajo en la que ponemos
coma usramos un punto (el nicamente el nombre de la funcin: prueba()
concatenador de cadenas)
*/
conseguiramos el mismo resultado.
?>
Cuando enlacemos elementos
distintos cadenas, constantes y/o <?
nmeros hemos de tener muy en prueba();
cuenta lo siguiente: ?>
</body>
Cada una de las sucesivas
</HTML>
cadenas debe ir encerrada entre
sus propias comillas.
ejemplo8.php
Los nombres de constantes
nunca van entre comillas.
Ampliando print
Ejercicio n 4
Las instrucciones print tambin
permiten concatenar cadenas en
Escribe un script (gurdalo como ejercicio4.php) en el que se definan dos constantes, una
una misma instruccin. numrica y otra de cadena y en el que mediante la las opciones print y echo aparezca en la
pgina web resultante un comentario sobre el tipo de cada una de ellas seguido de su valor.
En este caso solo es posible usar Intenta conseguir que los elementos concatenados aparezcan en la presentacin separados
el punto como elemento de unin. por un espacio. Observa el cdigo fuente!
Si pusiramos comas como
hacamos con echo PHP nos dara
un error.
Cuidado!
Presta mucha atencin a la sintaxis. Olvidar los ; o no poner unas comillas suelen ser la
causa de muchos mensajes de error.
Qu es una variable?
Practicando con variables y sus mbitos
Podramos decir que es un espacio
de la memoria RAM del ordenador Podemos comparar la memoria de un ordenador con el saln de un restaurante y la
que se reserva a lo largo del ejecucin de un programa con los servicios que van a darse en la celebracin del final
tiempo de ejecucin de un script de ao. La forma habitual de hacer una reserva de mesa espacio de memoria para
para almacenar un determinado ese evento sera facilitar un nombre nombre de la variable y especificar adems
tipo de datos cuyos valores son cuantos comensales tipo de variable prevemos que van a asistir.
susceptibles de ser modificados
por medio de las instrucciones Cuando acudamos a la cena de San Silvestre podremos sentarnos en esa mesa un
contenidas en el propio programa. nmero determinado de comensales daremos un valor a la variable y a lo largo de
ella podremos levantarnos o incorporar un nuevo invitado modificacin del valor de
Nombres de variables la variable siempre que sea alguien de nuestro mbito quien realice la invitacin.
En PHP todos los nombres de
variable tienen que empezar por el Probablemente no permitiramos que el cocinero decidiera quien debe sentarse o
smbolo $. levantarse, pero si lo permitiramos a cualquiera de nuestros invitados. La diferencia
estara mbito de la variable en que el cocinero no pertenece a nuestro mbito
Las nombres de las variables han mientras que los invitados a nuestra mesa s.
de llevar una letra inme-
diatamente despus del sm- bolo Quiz si celebrramos el evento otro da cualquiera no necesitaramos hacer una
$ $pepe1 es un nombre vlido, reserva previa y bastara con acudir a la hora deseada y hacer la reserva justo en el
pero $1pepe no es un nombre momento de sentarse.
vlido.
El restaurante de PHP no necesita que hagamos ninguna reserva previa. Otros
Para PHP las letras maysculas y
muchos lenguajes de programacin, por el contrario, si la necesitan.
las minsculas son distintas. La
variable $pepe es distinta de
Siguiendo con lo que nos ocupa, aqu tienes un ejemplo del uso de las variables y la
$Pepe.
forma de utilizarlas en los diferentes mbitos.
Tipos de variables
<HTML>
En PHP no es necesario definir el <HEAD>
tipo de variable, por lo tanto,
</HEAD>
una misma variable puede
<BODY>
contener una cadena de caracteres
en un momento del proceso y, <?
posteriormente, un valor # Definimos la variable $pepe como vaca
numrico, susceptible de ser $pepe="";
operado matemticamente.
# Definimos las variables $Pepe y $Pepa (ojo con maysculas y minsculas)
Definicin de variables $Pepe="Me llamo Pepe y soy serio y formal";
$Pepa="Me llamo Pepa y tambin soy seria y formal";
PHP no requiere una definicin
previa de las variables. Se definen
?>
en el momento en que son
necesarias y para ello basta que se
les asigne un valor. <!-- esto es HTML, hemos cerrado el script -->
Constantes predefinidas
Un ejemplo con constantes predefinidas
PHP_OS </BODY>
</HTML>
Recoge informacin sobre el
Sistema Operativo que utiliza el
servidor en el que se est ejemplo10.php
interpretando el fichero.
PHP_VERSION
Ejercicio n 6
Recoge la versin de PHP que est
siendo utilizada por el servidor. Escribe un script (gurdalo como ejercicio6.php) que construya una pequea pgina web
en la que aparezca el texto "Ests utilizando la versin: 4.4.2 de PHP" (incluidas las
Cuidado!
comillas y extrayendo el nmero de versin de la constante predefinida correspondiente).
Por si existieran dudas por Trata de que todas las etiquetas HTML que utilices estn recogidas en variables PHP, de
problemas de visualizacin tanto manera que no exista ninguna lnea en el cdigo fuente de la pgina que est fuera de las
FILE como LINE tienen que llevar etiquetas <? ... ?>
dos guiones bajos delante y
otras dos detrs.
Lo trataremos en el momento en el
que tengamos que hacer uso de
cada una de ellas.
Otras variables
Para poder conservar el ltimo # Escribamos ahora la misma funcin con una modificacin que ser
valor de una variable definida # asignar la condicin de esttica a la variable $b
dentro de una funcin basta con
# Llamemos a esa funcin: conEstaticas
definirla como esttica.
Aunque en los enunciados no se advierta, como norma general, los ejercicios debers
guardarlos siempre en el directorio practicas que has creado al realizar el ejercicio n 2
Tipos de variables
Tipos de variables
En el cuadro siguiente podemos ver los tres tipos de variables que utiliza PHP.
En PHP no es necesaria una
definicin previa del tipo de
Las variables en PHP
variables.
Tipo Ejemplo Valor mximo Valor mnimo Observaciones
Segn los valores que se les vayan Cualquier valor numrico entero
asignando, las variables podrn (dentro de este intervalo) que se
cambiar de tipo de modo Integer $a=1234 2147483647 -2147483647 asigne a una variable ser convertido
automtico y se irn adaptando a a este tipo
los valores que contengan en cada
Cualquier valor numrico decimal, o entero fuera del intervalo anterior,
momento. Double $a=1.23 que se asigne a una variable la convertir a este tipo
Las variables en PHP pueden ser Cualquier valor entrecomillado (sean nmeros o letras) que se asigne a
String $a="123" una variable la convertir a este tipo
de tres tipos:
Al operar con dos enteros, si el $a9="12.3 Literal con nmero" echo settype($a9,'integer') 1
resultado est dentro del rango de echo gettype($a9) integer
los enteros, devuelve un entero.
echo $a9 12
Si al operar con dos enteros el
resultado desborda el rango
entero, convierte su valor, de
forma automtica, al tipo coma Tipos de variable de los operadores y de los resultados
flotante
Al operar un entero con una La tabla siguiente contiene en cada fila los valores asignados a dos variables (A y B)
variable tipo coma flotante el y el resultado de la suma de ambas. A continuacin se recogen los tipos de variable de
resultado es de coma flotante. cada una de ellas y el del resultado. El tipo de este ltimo generado por PHP estar
Al operar con una cadena lo hace
condicionado por el valor del resultado de cada una de las operaciones.
como si se tratara de un entero. Si
hay caracteres numricos al
comienzo, los extrae (hasta que Resultados de operaciones y tipos de variables resultantes
aparezca un punto o un carcter Valores Tipos de variables
no numrico) y los opera como
A B A+B A B A+B
un nmero entero.
12 16 28 integer integer integer
Si una cadena no comienza por
un carcter numrico PHP la 12 2147483647 2147483659 integer integer double
operar tomando su valor -12 -2147483640 -2147483652 integer integer double
numrico como CERO.
12 1.2456 13.2456 integer double double
1.2456 12 13.2456 double integer double
1.2456 123.4567 124.7023 double double double
12 abc 12 integer string integer
1.2456 abc 1.2456 double string double
12 12abc 24 integer string integer
12 12.34567abc 24.34567 integer string double
1.2456 12.34567abc 13.59127 double string double
1.2456 12.3e2abc 1231.2456 double string double
abc 12abc 12 string string integer
abc 12.34567abc 12.34567 string string double
12abc 12.34567abc 24.34567 string string double
PHP dinmico
Que valor tiene register_globals en tu php.ini?
Cuando hablbamos de la configuracin de PHP, hacamos alusin a la directiva
Lo que hemos visto hasta el register_globals y decamos que tena dos opciones de configuracin: ON y OFF. Decamos
momento, solo nos ha servido para tambin que segn el valor que tuviera esa configuracin cambiara el modo de afrontar
escribir una serie de scripts PHP y diversos asuntos.
ver los resultados de su ejecucin,
pero an no hemos visto de qu Habamos optado por ponerla como: register_globals=ON, pero no est de ms el
forma se puede lograr que
comprobarlo.
interacten el cliente y el
servidor.
Busquemos el fichero php.ini que estar en el directorio Windows salvo que el
Veamos cmo hacerlo. directorio en que tienes instalado Windows se llame de otra manera abrmoslo y
comprobemos que es cierto que register_globals=ON. Si no fuera as, modificaramos
esa directiva y guardaramos los cambios.
Envo a travs del
navegador
Cuidado!
La forma ms simple de que un Antes de hacer una modificacin en php.ini en httpd.conf desactiva el servidor Apache.
cliente pueda enviar valores a un Cuando hayas acabado con los cambios vuelve a ponerlo en marcha (de lo contrario te
servidor es incluir esos valores en
aparecer el mensaje: no se puede encontrar el servidor) y ya arrancar atendiendo a la
la propia peticin, insertndolos
directamente en la barra de nueva configuracin. No te olvides nunca de hacerlo as! Te evitars un montn de
direcciones del navegador. sobresaltos.
Forma de envo
Tabla de multiplicar
Deber insertarse en la barra de
direcciones del navegador lo
siguiente: <?
/* Escribamos una instruccin, que imprima en pantalla
pagina.php?n1=v1&n2=v2 el valor de una variable ($a), una "x" que har funciones de aspa
en la presentacin, otra variable ($b), el signo igual
donde
y $a*$b que es el producto de ambas variables
pagina.php ser la direccin de la El simbolo de multiplicar es (*) */
pgina que contiene el script que print ($a." x ".$b." = ".$a*$b);
ha de procesar los valores # Aadamos una bobadilla, para animar... ;-)
transferidos. print ("<br> Ya eres mayorcit@.. Deberas saberte la tabla");
?>
? es un carcter obligatorio que
indica que detrs de l van a ser
insertados nombres de variables y ejemplo13.php
sus valores.
= es el separador de los nombres El resultado es lgico. No hemos asignado valores a las variables $a y $b y por eso no
de las variables y sus valores escribi su valor. Sin embargo, a la hora de multiplicar -recuerda que una variable vaca
respectivos. es interpretada como cero a la hora de hacer operaciones la interpret como cero y con
muy buen criterio nos respondi que cero por cero es cero.
v1, v2,... simbolizan el valor
asignado a cada una de las Escribamos ahora en la barra de direcciones del navegador la siguiente direccin:
variables. http://localhost/cursoPHP/ejemplo13.php?a=21&b=456, (tambin puedes pulsar en este
& es el smbolo que separa los enlace) y podremos comprobar que 21 x 456 = 9576 .
distintos bloques variable = valor.
Hagamos un nuevo experimento. Vayamos a php.ini y cambiemos la configuracin.
Los nombres de las variables Pongamos register_globals= OFF. No te olvides de apagar el servidor antes de hacer
nunca llevan el signo $. estos cambios!
Los valores de las variables sean Una vez hecho el cambio, pulsemos de nuevo en el enlace, y veremos que esta vez no
nmeros o cadenas nunca se ha recibido los valores de a y b y nos ha dado cero como resultado.
escriben entre comillas.
Lo intentaremos con este nuevo script manteniendo register_globals=OFF.
Se pueden incluir tantos nombre =
valor como se desee. La nica
restriccin es la longitud mxima <?
permitida por el mtodo GET (el
utilizado en este caso) que se sita /* Modifiquemos la instruccin anterior
en torno a los 2.000 caracteres. y utilicemos las variables predefinidas
$HTTP_GET_VARS['a'], $HTTP_GET_VARS['b']
Recepcin de datos en vez de $a y $b que utilizabamos en el ejemplo anterior */
en las que n1, n2, ... coinciden # Un comentario para identificar el origen del resultado
exactamente con nombres
asignados a cada una de las
print("<br>El resultado siguiente ha sido generado usando $_GET <br>");
variables en esa transferencia.
Segn el modo en que est Los nombres de variables son distintos si se cambian maysculas y minsculas. Pon
configurado el php.ini podra mucho cuidado en escribirlos correctamente.
caber una tercera posibilidad de Los nombres de las variables predefinidas, tales como $HTTP_GET_VARS, $_GET,
registro de esos valores. etctera van en maysculas.
No olvides poner punto y coma al final de cada lnea de instrucciones.
Si la directiva register_globals en
Presta atencin a la apertura/cierre de comillas y mucha ms atencin an si se trata
el fichero php.ini est
configurada con la opcin ON, los de comillas anidadas. En este caso procura usar (") para las exteriores y (') para las
valores transferidos desde el interiores.
navegador adems de ser
recogidos en las variables
anteriores son asignados a otras
variables del tipo: $n1, $n2, ... Cuidado!
cuyos nombres son el resultado de
anteponer el smbolo $ a los En modo local puedes establecer las configuraciones de php.ini a tu antojo y, adems, ests
nombres de las variables
utilizando una versin 4.3.11 de PHP que permite superglobales. Esta versin junto con
contenidas en la peticin.
la posibilidad de modificar php.ini te permite utilizar cualquiera de las opciones de
La eleccin a la hora de escribir los transferencia de variables.
scripts de uno u otro tipo de Pero, si pretendes publicar tus pginas utilizando un hosting ajeno debes cerciorarte de cual
variable debe hacerse teniendo en es su versin de PHP no todos tienen instaladas versiones superiores a 4.1.0 y conocer la
cuenta que: configuracin de sus php.ini.
Esta ltima sin duda la ms Ten en cuenta que all no vas a poder modificar las configuraciones y de no tener en cuenta
cmoda tiene el problema de que estos aspectos, puedes verte obligad@ a modificar tu cdigo fuente para adecuarlo a la
slo es vlida cuando configuracin de tu hosting.
register_globals=on y, adems, es
la ms insegura de todas.
Un formulario
La superglobal $_GET tiene una
sintaxis ms corta que su
alternativa y, adems, aade como <HTML>
ventaja su condicin de <HEAD>
superglobal, que permite </HEAD>
utilizarla en cualquier mbito sin <BODY>
necesidad de declararla
expresamente como global. Es la
opcin del futuro. Su nico <!-- Un formulario debe empezar siempre con una etiqueta de este tipo <form ...>
inconveniente es que puede no en la que ser obligatorio indicar con esta sintaxis action='nombre.extension'
estar disponible en hostings que nombre.extension debe contener el nombre (o la ruta completa en el caso de que
an mantienen versiones antiguas estuviera en un directorio o hosting distinto del que alberga el documento que
de PHP. contiene el formulario desde el que se realiza la peticin) Es opcional incluir method
que puede tener dos valores method='GET' method='POST', por defecto (cuando
Envo a travs de no se indica) el envio se realizar usando method='GET' Tambin es opcional -a los
formularios efectos de PHP- incluir name. Ese valor es til cuando se incluyen scripts del lado del
cliente del tipo JavaScript //--> <form name='mi_formulario' action='formu1.php'
method='post'> <!-- Pueden incluirse textos dentro del formulario --> Escribe tu
La interaccin clienteservidor que
nombre: <!-- Uno de los tipos de campos posibles es el tipo texto su sintaxis
acabamos de ver, resulta
incmoda en su uso y no
(hablamos de HTML) requiere la etiqueta <input type='text'> que indica el
demasiado esttica. contenido del texto esa etiqueta debe incluir obligatoriamente un name='nombre' el
nombre a usar sern caracteres alfabticos, sin tildes ni ees y sin espacios. Salvo
Hay una segunda opcin la de excepciones que comentaremos no puede usarse el mismo nombre para dos campos
uso ms frecuente que es la distintos el value='' puede no contener nada entre las comillas tal como ocurre aqu o
utilizacin de formularios. contener el texto que por defecto queremos que aparezca en ese campo al cargar el
formulario. el size=xx es opcional. Su utilidad es la de ajustar el tamao de la
Los formularios no son ele- mentos
ventana al nmero de caracteres que se indiquen //--> <input type='text'
propios de PHP actan del lado
del cliente y su estudio es ms name='nombre' value='' size=15><br> Escribe tu clave: <!-- <input
propio del mbito de HTML que de type='password'> solo se diferencia del anterior en que en el momento de
PHP. rellenarlo se sustituyen los carecteres visualizados (no el contenido) por asteriscos //--
> <input type='password' name='clave' value=''><br> Elige tu color de coche
En cualquier caso por si te fuera favorito:<br> <!-- Los <input type='radio'> permite optar entre varios valores
necesario aqu a la derecha tienes posibles. Habr que repetirlos tantas veces como opciones queramos habilitar. Todos
un formulario, en el que se los input correspondientes a la misma opcin deben tener el mismo nombre
comenta la sintaxis de sus
(name) value='loquesea' deber tener un valor distinto en cada uno de ellos. Ese
elementos ms comunes.
valor (loquesea) ser transferido a travs del formulario Si queremos que una opcin
aparezca marcada (por defecto) al cargar el formulario, deberemos incluir en su
Interpretacin de los etiqueta la palabra checked los contenidos de value no se visualizan en el navegador
datos recibidos a travs por lo que conviene incluir una descripcin de los valores despus de cerrar la etiqueta
de formularios de cada input Al enviar el formulario solo se transmite el value correspondiente a la
opcin seleccionada //--> <input type='radio' name='color' value='Rojo'>Rojo</br>
Igual que ocurra en el caso <input type='radio' checked name='color' value='Verde'>Verde</br> <input
anterior, los datos enviados a type='radio' name='color' value='Azul'>Azul</br> Elige los extras:<br> <!-- Cada
travs de un formulario son uno de los <input type='checkbox'> requiere un nombre distinto (name) y un
recogidos en diferentes tipos de valor (value) permite optar entre varios Esos valor (loquesea) serm transferido a
variables predefinidas, pero ahora travs del formulario cuando la casilla de verificacin est marcada Si queremos que
se aade una nueva particularidad. una casilla aparezca marcada (por defecto) al cargar el formulario, deberemos incluir
en su etiqueta la palabra checked los contenidos de value tampoco aqu se visualizan
Existe la posibilidad de dos
en el navegador por lo que conviene incluir una descripcin de los valores despus de
mtodos (method) de envo:
cerrar la etiqueta de cada input Al enviar el formulario solo se transmite los value
'GET' y 'POST'. En el caso anterior
decamos que se utilizaba el
correspondiente a la opcion marcadas //--> <input type='checkbox'
mtodo GET, pero en el caso de name="acondicionado" value="Aire"> Aire acondicionado<br> <input
los formularios son posibles ambos
type='checkbox' checked name="tapiceria" value="Tapicieria"> Tapiceria en
mtodos. Conviene tenerlo en
cuenta. piel<br> <input type='checkbox' name="llantas" value="aluminio"> Llantas de
aluminio<br> Cual es el precio mximo<br> que estaras dispuesto a pagar? <!-- La
Mtodo GET etiqueta <input type='select'> requiere un nombre y requiere tambin una
etiqueta de cierre </select> Entre ambas -apertura y cierre- deben incluirse las
No se diferencia en nada del diferentes opciones entre las de etiquetas <option>valor<option> Al enviar el
descrito para el supuesto anterior. formulario se transmite lo contenido despus de opcin en la opcin seleccionada si
Utiliza las mismas variables
dentro de una etiqueta option escribimos selected ser esa la que aparezca por
predefinidas, las utiliza con
idntica sintaxis y se comporta de
defecto al cargarse el formulario//--> <select name="precio"> <Option>Menos de
igual forma en lo relativo a las 6.000 euros</option> <Option>6.001 - 8.000 euros</option> <Option selected
opciones de register_globals. >8.001 - 10.000 euros</option> <Option>10.001 - 12.000 euros</option>
<Option>12.001 - 14.000 euros</option> <Option>Ms de 14.000 euros</option>
Los nombres de las variables son </select>
en este caso, los incluidos como <!-- Las reas de texto deben tener una etiqueta de apertura <textarea
name en cada una de las name='checkbox'> seguida de una etiqueta de cierre </textarea> Dentro de la
etiquetas del formulario. etiqueta de apertura puede incluirse rows=xx (indicar el nmero de filas) cols=yy
Respecto a los valores de cada (indicar el ancho expresado en nmero de caracteres) y opcionalmente un value='lo
variable, stos seran los recogidos que sea...' que puede contener el texto que -por defecto- pretendemos que aparezca
del formulario. En los casos de en ese espacio en el momento de cargar rl formulario //--> <br> Escribe aqu
campos tipo: text, password y cualquier otro comentario:<br> <textarea rows=5 cols=50 name='texto'></
textarea seran los valores textarea><br> <!-- El <input type='hidden'> permite insertar en un formulario
introducidos por el usuario en cada una valor oculto que no requiere ser cumplimentado por el usuario y que no aparece
uno de esos campos. visible en el documento requiere un name y un value //--> <input type="hidden"
name='oculto' value='Esto ira oculto'><br> <!-- El <input type='submit'> es el
En el caso de los campos tipo radio
encargado de ejecutar la action incluida en la etiqueta de apertura del formulario que
en el que varias opciones pueden
tener el mismo nombre recogera en este caso sera la llamada a la pgina que se indica en la action El texto que
el valor indicado en la casilla incluyamos en value='enviar...' ser el que se visualice en el propio botn de envio //--
marcada; mientras que si se trata > <input type="submit" value="enviar"> <!-- El <input type='reset'> permite
de campos tipo checkbox se borrar todos los contenidos del formulario y reestablecer los valores por defecto de
transferiran nicamente las cada campo //--> <input type="reset" value="borrar"> <!-- La etiqueta </form> es
variables y los valores que la etiqueta de cierre del formulario //--> </FORM> </BODY> </HTML>
corresponden a las casillas
marcadas.
Si se tratara de un campo tipo No incluiremos la opcin Ver ejemplo hasta que hayamos elaborado los documentos
hidden se transferira el valor formuxx.php incluidos en la action de este formulario.
contenido en su etiqueta y, por
ltimo, en el caso del select sera Scripts para recoger los datos del formulario anterior
transferido como valor de la
variable la parte del formulario Insertaremos ahora los diferentes tipos scripts utilizables, especificando las condiciones
contenida entre las etiquetas de utilizacin de cada uno de ellos.
<option></option> de la opcin
seleccionada. Los hemos llamado formu1.php, formu2.php, etctera.
Mtodo POST Debajo del cdigo fuente de cada uno de ellos, hemos incluido dos enlaces. En el
En el caso de que el mtodo de
primero de ellos se utiliza el formulario que vemos aqu arriba modificando nicamente el
envo sea POST hay una diferencia valor de action para adecuarlo al nombre de cada script.
a tener en cuenta en cuanto a las
variables que recogen la En el segundo de los enlaces utilizaremos un formulario en el que, adems de las
informacin. Ahora ser: modificaciones anteriores, se utilice GET como mtodo.
y ocurrir algo similar con las Este primero funcionar tanto cuando el mtodo sea POST como cuando sea GET.
superglobales, que pasaran a ser Requiere que el php.ini contenga la opcin register_globals=ON
del tipo:
<?
$_POST['n1']
echo "El method que ha usado fu: ",$REQUEST_METHOD,"<br>";
en sustitucin del $_GET['n1'] echo $nombre,"<br>";
usado en el caso del mtodo GET echo $clave,"<br>";
echo $color,"<br>";
Si register_globals est en On el echo $acondicionado,"<br>";
comportamiento de las variables echo $tapiceria,"<br>";
directas es idntico con ambos echo $llantas,"<br>";
mtodos.
echo $precio,"<br>";
echo $texto,"<br>";
Identificacin del mtodo echo $oculto,"<br>";
de envo ?>
PHP recoge en una variable el Con action = POST Con action = GET
mtodo utilizado para enviar los
datos desde un formulario. Se
trata de la variable
REQUEST_METHOD. Este otro requiere que el mtodo especificado en el formulario de envo sea POST.
El valor de register_globals no afectara a su funcionalidad.
Puede ser invocada como una
variable directa (en caso de que
<?
register globals est en on) o a
travs de una de las variables de
echo "El method usado fu: ",$HTTP_SERVER_VARS[REQUEST_METHOD],"<br>";
servidor. echo $HTTP_POST_VARS['nombre'],"<br>";
echo $HTTP_POST_VARS['clave'],"<br>";
En el primer caso la variable se echo $HTTP_POST_VARS['color'],"<br>";
llamara: echo $HTTP_POST_VARS['acondicionado'],"<br>";
echo $HTTP_POST_VARS['tapiceria'],"<br>";
$REQUEST_METHOD
echo $HTTP_POST_VARS['llantas'],"<br>";
y en el segundo: echo $HTTP_POST_VARS['precio'],"<br>";
echo $HTTP_POST_VARS['texto'],"<br>";
$HTTP_SERVER_VARS echo $HTTP_POST_VARS['oculto'],"<br>";
[REQUEST_METHOD] ?>
Cuando PHP permita el uso de
variables superglobales se puede Con action = POST Con action = GET
utilizar:
$_SERVER[REQUEST_METHOD]
Para utilizar eficazmente este script es necesario que el mtodo especificado en el
Una advertencia importante. formulario de envo sea GET.
El valor de register_globals no afectara a su funcionalidad.
Observa que en este caso no se
incluyen comillas dentro del
corchete como ocurra con todos <?
los nombres de variable echo "El method usado fu: ",$HTTP_SERVER_VARS[REQUEST_METHOD],"<br>";
anteriores. echo $HTTP_GET_VARS['nombre'],"<br>";
echo $HTTP_GET_VARS['clave'],"<br>";
echo $HTTP_GET_VARS['color'],"<br>";
Diferencias ente los
echo $HTTP_GET_VARS['acondicionado'],"<br>";
mtodos GET y POST
echo $HTTP_GET_VARS['tapiceria'],"<br>";
echo $HTTP_GET_VARS['llantas'],"<br>";
Las diferencias entre uno y otro echo $HTTP_GET_VARS['precio'],"<br>";
mtodo son las siguientes: echo $HTTP_GET_VARS['texto'],"<br>";
Mtodo GET
echo $HTTP_GET_VARS['oculto'],"<br>";
?>
Las particularidades de este
mtodo son las siguientes:
Con action = POST Con action = GET
Al ser enviado el formulario se
carga en el navegador la direccin
especificada como action, se le Este otro requiere que el mtodo especificado en el formulario de envo sea POST y
aade un ? y a continuacin se que la versin de PHP soporte variables superglobales.
incluyen los datos del formulario. El valor de register_globals no afectara a su funcionalidad.
Todos los datos de la peticin van
a ser visibles desde la barra de
direcciones del navegador. <?
echo "El method usado fu: ",$_SERVER[REQUEST_METHOD],"<br>";
nicamente son aceptados los echo $_POST['nombre'],"<br>";
caracteres ASCII. echo $_POST['clave'],"<br>";
Tiene una limitacin en el echo $_POST['color'],"<br>";
tamao mximo de la cadena que echo $_POST['acondicionado'],"<br>";
contiene los datos a transferir. En echo $_POST['tapiceria'],"<br>";
IE esa limitacin es de 2.083 echo $_POST['llantas'],"<br>";
caracteres. echo $_POST['precio'],"<br>";
echo $_POST['texto'],"<br>";
Mtodo POST echo $_POST['oculto'],"<br>";
No tiene las limitaciones indicadas
?>
para el caso de GET en lo relativo
a visibilidad ni en cuanto a
Con action = POST Con action = GET
aceptacin de caracteres no ASCII.
Las diferencias bsicas entre $_REQUEST, a diferencia de $_GET y $_POST, no dispone de equivalentes en
ambos modos de encriptacin son versiones anteriores. Ello quiere decir, no existe una variable (no superglobal) del tipo
las siguientes: $HTTP_REQUEST_VARS con $HTTP_GET_VARS o con $HTTP_POST_VARS.
En el tipo application/x-www-
En este ejemplo hemos incluido dos scripts que solo solo se diferencian en el method
form-urlencoded los nombres de
control y los valores se
especificado en el formulario.
transforman en secuencias de
escape, es decir, convirtiendo cada
Al ejecutarlos podremos comprobar que, independientemente del mtodo usado,
byte en una cadena %HH, donde $_REQUEST recoge los valores transferidos desde el formulario.
HH es la notacin hexadecimal del
valor del byte. <?
/* Al ejecutar por primera vez el script la variable pepe ser nula
Adems, los espacios son
convertidos en signos +, los
ya que no se ha transferido an el formulario. Al pulsar sucesivamente
saltos de lnea se representan en el botn Enviar iremos visualizando los valores que se vayan
como %0D%0A, el nombre y el
transfiriendo */
valor se separan con el signo = y print "He recibido la variable pepe con valor: ".$_REQUEST['pepe'];
los diferentes bloques nombre/
/* al enviar el formulario se recargar este mismo documento
valor, se separan con el carcter &.
ya que hemos puesto action="" */
En cuanto a la encriptacin tipo ?>
multipart/form-data, sigue las <form name="prueba" method="post" action="">
reglas de las transferencias MIME, <input type="text" name="pepe" value=''>
que comentaremos ms adelante <input type="submit" value="enviar">
cuando tratemos el tema del
correo electrnico.
Cuidado!
Con action = POST Con action = GET
Cuando se incluye una
cadena vaca ("") como valor
de action en un formulario
se recargar el mismo Ejercicio n 9
documento como respuesta
Crea dos documentos llamados respectivamente formulario1.php y visor1.php. En el
al envo del formulario.
primero de ellos incluye un formulario que permita recoger datos personales y acadmicos
de tus alumnos, utilizando todos los tipos de campos de formulario que conozcas. Los datos
La seguridad en los envos insertados en ese formulario debern ser visualizados despus de su envo con cualquier
de datos configuracin de register_globals y con cualquier versin PHP a travs del documento
visor1.php. Utiliza los recursos estticos fondos, colores, tipografa, etctera que estimes
El tema de la seguridad es una
oportunos para una correcta presentacin
preocupacin constante entre los
usuarios de Internet.
Ejercicio n 8
Operaciones aritmticas
Operaciones aritmticas
Suma
ejemplo16.php
$a + $b
Operaciones aritmticas
Diferencia
Operacin Sintaxis A B Resultado
$a - $b
Suma $a+$b 12 -7.3 4.7
Producto Diferencia $a-$b 12 -7.3 19.3
$a * $b Producto $a*$b 12 -7.3 -87.6
Cociente Cociente $a/$b 12 -7.3 -1.64383561644
Cociente entero (int)($a/$b) 12 -7.3 -1
$a / $b
Resto de la divisin $a%$b 12 5 2
Cociente entero
Potencias ab pow($a,$b) 12 5 248832
(int)($a / $b)
Potencias ab pow($a,$b) -7.3 -3 -0.00257058174836
Resto de la divisin Raz cuadrada Sqrt($a) 12 3.46410161514
$a % $b Raz cuadrada Sqrt($a) -7.3 -1.#IND
Raz cuadrada Raz ensima pow($a,(1/$b) 12 3; 2.28942848511
Sqrt($a)
Redondeos
Potencia ab tipo Sintaxis A Resultado
Logartmos y
trigonometra
Logaritmos y trigonometra
La sintaxis para el uso de las En en cuadro siguiente se resumen las operaciones aritmticas en PHP y su sintaxis
funciones logartmicas y
trigonomtricas es esta: Operaciones con logaritmos
Operacin Sintaxis A B Resultado
Logaritmo neperiano
Logaritmo neperiano log($a) 12 2.48490664979
log($a)
Logaritmo neperiano log($a) -7.3 -1.#IND
Logaritmo decimal
Logaritmo decimal Log10($a) 12 1.07918124605
Log10($a) Logaritmo decimal Log10($a) -7.3 -1.#IND
ea exponencial ea Exp($a) 12 162754.791419
Para asignar valores numricos a Cuando se asignan valores numricos a una variable PHP cabe la posibilidad de hacerlo
una variable, en PHP, puede en distintas bases. Estos son algunos ejemplos.
utilizarse uno de los siguientes
sistemas de numeracin: Asignacin de valores en distintas bases
Los nmeros enteros pueden Base Sintaxis Valor decimal Aplicable a
escribirse en una cualquiera de Base Decimal $a=17 17 Nmeros enteros
estas bases:
Base Octal $a=017 15 Nmeros enteros
Base decimal
Base Hexadecimal $a=0x17 23 Nmeros enteros
$a=nmero Base Hexadecimal $a=0x1A3B 6715 Nmeros enteros
No se pueden insertar ceros a la
izquierda cuando se escriben Notacin decimal $a=123000; 123000 Coma flotante
nmeros en base decimal. Base Decimal $a=0.174 0.174 Coma flotante
Base octal Notacin cientfica $a=1.23e5; 123000 Coma flotante
Base hexadecimal PHP dispone de funciones que permiten obtener una cadena de caracteres con la
expresin, en una nueva base, de un nmero escrito en otra base cualquiera.
$a=0xnmero hexadecimal
Si se escribe CERO EQUIS (0x)
Asignacin de valores en distintas bases
delante del nmero, PHP lo
interpretar como expresado en Valor de la variable Base Nueva base Sintaxis Expresin
hexadecimal. En este caso, $a=1234 10 8 decoct($a) 2322
admitir como dgitos de 0 a 9 y
de A a F. $a=1234 10 16 dechex($a) 4d2
$a=nmero e exponente
Se puede utilizar un cero a la
izquierda del punto decimal Formato de presentacin de nmeros
Ejemplo: $a=1.2e5 asigna a $a el
valor: 1.2 x 105 En PHP es posible establecer el formato de la presentacin de los valores numricos
utilizando alguna de estas funciones.
Otro ej: $a=1.2e-5 asigna a $a el number_format (nmero)
valor: 1.2 x 10-5 Presenta la parte entera del nmero (sin decimales) y utiliza como separador de miles
una coma (,).
Cambios de base number_format (nmero , nmero de cifras decimales)
Presenta el nmero de cifras decimales que se indiquen y utiliza como separador
decimal un punto (.) y el separador de miles es una coma (,).
PHP permite hacer todo tipo de
number_format (nmero , nm decimales , "sep. decimal" , "sep. miles")
cambios de base. Para evitar ser
Permite establecer el nmero de cifras decimales de la presentacin as como el
reiterativos, observa los ejemplos.
All tienes las diferentes funciones carcter que se establezca como separador de decimales y como separadores de miles.
mediante las que se puede realizar Cuidado!. No te olvides de escribir los caracteres de separacin entre comillas.
ese proceso. Aqu tienes algunos ejemplos.
El origen de la semilla
Nmeros aleatorios
El valor Unix Epoch PHP dispone de dos funciones capaces de generar nmeros aleatorios. Se trata de la
funcin rand() y de la funcin mejorada mt_rand().
El conocido como tiempo UNIX o
tambin Unix Epoch- es un sistema El valor mnimo del intervalo que contiene los nmeros aleatorios que pueden ser
referencia de tiempo cuya unidad generados es CERO en ambos casos y los valores mximos de cada opcin pueden
son los segundos y que tiene su determinarse mediante las funciones getrandmax(), para el primer generador, y
valor cero a las 0:00:00 horas mt_getrandmax(), para el segundo.
(GMT) del da uno de enero de
1970. Veamos cuales son esos valores en cada uno de los casos.
La funcion time()
Valores mximos de los generadores de nmeros aleatorios
La funcin time() devuelve una Generador rand() Generador mt_rand()
cadena con el nmero de
segundos transcurridos desde el Sintaxis Valor mximo Sintaxis Valor mximo
comienzo de la Unix Epoch. echo getrandmax() 32767 echo mt_getrandmax() 2147483647
Que cuantos son? Pues mira,
hasta este mismo instante han Segn las libreras que est usando PHP, puede ocurrir que los valores mximos con
transcurrido: ambos generadores sean iguales. No es ese nuestro caso, como puedes comprobar.
(double)microtime() estaremos introduciendo una semilla (al margen comentamos la forma en que se genera)
que mejora sustancialmente la aleatoriedad del los nmeros obtenidos.
Dado que con microtime()
obtenemos una cadena, es posible Aqu tenemos un ejemplo:
convertirla en nmero de coma
flotante anteponiendo a esa
Generacin de un nmero aleatorio con semilla
funcin (double).
Generador rand()
Una vez cambiado el tipo de Sintaxis N aleatorio
variable el valor devuelto por
microtime se convierte en: srand((double)microtime()*1000000);
335
echo rand()
0.174266 Generador mt_rand()
Si se multiplica el valor anterior Manteniendo la sintaxis anterior -no te olvides de las semillitas famosas- se pueden
por 1.000.000 obtenemos un generar nmeros aleatorios comprendidos dentro del intervalo que preestablezcamos.
nmero de seis cifras y valor
entero que puede cambiar de valor Bastara con aadir los valores de los extremos de ese intervalo como parmetros
cada millonsima de segundo. de la funcin. La sintaxis sera esta:
rand(extremo inferior , extremo superior)
174393 y para la funcin mejorada
mt_rand(extremo inferior , extremo superior)
Fjate que ha cambiado! La
diferencia no es otra cosa que el
tiempo transcurrido entre los Generacin de un nmero aleatorio delimitando intervalos
instantes en que se ejecutaron Generador rand()
ambas instrucciones.
Sintaxis N aleatorio
Este nmero entero es utilizado srand((double)microtime()*1000000);
58
por srand y mt_rand como echo rand(1,300)
semilla generadora de nmeros Generador mt_rand()
aleatorios.
Sintaxis N aleatorio
mt_srand((double)microtime()*1000000);
56
echo mt_rand(1,300)
A las variables tipo cadena se les Aqu tienes un ejemplo en el que se utilizan las dos formas de asignacin de valores a
puede asignar los valores de dos una cadena.
formas:
<HTML>
Escribiendo el contenido entre
<HEAD>
comillas:
<TITLE>Ejemplo 17 - PHP</TITLE>
$var="Texto del contenido"; </HEAD>
<BODY>
y por medio de la sintaxis de <?
documento incrustado que es la $cadena1="Esto es una cadena de texto";
siguiente:
La concatenacin de
Uniendo cadenas
cadenas Aqu tienes un ejemplo de concatenacin de variables tipo string.
Qu es un array?
Tablas (arrays) unidimensionales
Un array es sencillamente una Mediante el uso de arrays podemos utilizar el mismo nombre para varias variables
tabla de valores. diferencindolas entre s mediante ndices distintos
Arrays bidimensionales
Arrays bidimensionales
Como ejemplo de array bidimensional emplearemos una tabla de resultados de una
Los arrays bidimensionales pueden liga de ftbol en la que intervienen cinco equipos que como en toda liga que se precie
entenderse como algo muy similar se juega a doble partido.
a una tabla de doble entrada.
En este primer supuesto utilizaremos arrays escalares, por lo tanto los equipos sern
Cada uno de los elementos se
identificados con nmeros desde cero hasta cuatro.
identifica sigue siendo vlido el
nombre nico que se usaba en los
unidimensionales por un nombre <?
($nombre) seguido de dos ([]) # rellenamos el array desde [0][0] hasta [0][4]
que contienen los ndices (en este # la insercion automatica haria que este primero fuera [0][0]
caso son dos ndices) del array.
En la cuarta de las opciones se Utilizando el script anterior, con ligeros retoques estticos, hemos construido esta
asignan libremente cada uno de tabla:
los ndices (xx e yy) ponindoles
valores numricos.
Todos los resultados de la liguilla
$a["indice1"]["indice2"]=valor
3 1-0 6-3 14-3 1-0
4 1-1 2-3 0-1 1-1
En este caso, los ndices sern
cadenas y se escribirn entre
comillas. Con el misma procedimiento en este caso hemos usado resultados diferentes hemos
construido esta otra tabla
Arrays mixtos
Resultados de la liguilla
PHP permite utilizar tambin Indice Juvencia Mosconia Canicas Condal Piloesa
arrays mixtos. Sera este el caso
de que uno de ellos fuera escalar y Juvencia 3-2 5-3 7-1 0-2
el otro asociativo. Mosconia 0-11 2-1 1-0 1-2
Igual que ocurra con los Canicas 0-0 1-3 1-4 2-0
unidimensionales, tambin aqu
podemos utilizar valores de Condal 1-0 6-3 14-3 1-0
variables como ndices. Piloesa 1-1 2-3 0-1 1-1
Arrays multidimensionales
Arrays multidimensionales
PHP permite el uso de arrays con
dimensin superior a dos. Para Esta es la forma en la que hemos definido el array tridimensional que utilizaremos en
modificar la dimensin del array el ejemplo.
basta con ir aadiendo nuevos
ndices.
<?
$a[x][y][z]=valor;
$b = array(
asignara un valor al elemento de "Juvencia" => array(
ndices x, y y z de un array "Juvencia" => array (
tridimensional y "Resultado" => " ",
"Amarillas" => " ",
$a[x][y][z][w]=valor;
"Rojas" => " ",
hara lo mismo, ahora con un array "Penalty" => " "
de dimensin cuatro. ),
"Mosconia" => array (
Pueden tener cualquier tipo de "Resultado" => "3-2",
ndices: escalares, asociativos y, "Amarillas" => "1",
tambin, mixtos.
"Rojas" => "0",
"Penalty" => "1"
La funcin array(); ),
"Canicas" => array (
Para asignar valores a una matriz "Resultado" => "5-3",
puede usarse la funcin array(), "Amarillas" => "0",
que tiene la siguiente sintaxis: "Rojas" => "1",
"Penalty" => "2"
$a= array ( ),
ndice 0 => valor, "Condal" => array (
..... ,
"Resultado" => "7-1",
ndice n => valor,
);
"Amarillas" => "5",
"Rojas" => "2",
Por ejemplo: "Penalty" => "1"
),
$z=array ( "Piloesa" => array (
0 => 2, "Resultado" => "0-2",
1 => "Pepe",
"Amarillas" => "1",
2 => 34.7,
"Rojas" => "0",
3 => "34Ambrosio",
); "Penalty" => "0"
),
producir igual resultado que: ),
"Mosconia" => array(
$z[0]=2; "Juvencia" => array (
$z[1]="Pepe"; "Resultado" => "0-11 ",
$z[2]=34.7;
"Amarillas" => "4",
$z[3]="34Ambrosio";
"Rojas" => "2",
"Penalty" => "4"
Anidando en array(); ),
"Mosconia" => array (
La funcin array() permite escribir "Resultado" => " ",
arrays de cualquier dimensin "Amarillas" => " ",
utilizando la tcnica de anidado. "Rojas" => " ",
"Penalty" => " "
Si pretendemos escribir los
),
elementos de este array:
"Canicas" => array (
$z[0][0]=34; "Resultado" => "2-1",
$z[0][1]=35; "Amarillas" => "0",
$z[0][2]=36; "Rojas" => "0",
$z[1][0]=134; "Penalty" => "2"
$z[1][1]=135; ),
$z[1][2]=136; "Condal" => array (
"Resultado" => "1-0",
podriamos hacerlo asi:
"Amarillas" => "1",
"Rojas" => "0",
$z=array( "Penalty" => "0"
0 => array (
),
0 => 34,
1 => 35,
"Piloesa" => array (
2 => 36, "Resultado" => "1-2",
), "Amarillas" => "1",
1 => array ( "Rojas" => "0",
0 => 134, "Penalty" => "0"
1 => 135, ),
2 => 136, ),
) "Canicas" => array(
); "Juvencia" => array (
"Resultado" => "0-0",
Como puedes observar, se trata de "Amarillas" => "0",
sustituir los valores asignados a "Rojas" => "1",
los elementos de una primera "Penalty" => "1"
funcin array() por otra nueva ),
funcin array que contiene los "Mosconia" => array (
segundos ndices asi como los "Resultado" => "1-3",
valores asignados a los mismos.
"Amarillas" => "2",
El anidado sucesivo permitira "Rojas" => "0",
generar arrays de cualquier "Penalty" => "1"
dimensin. ),
"Canicas" => array (
Aunque en el ejemplo anterior nos
hemos referido a un array escalar, "Resultado" => " ",
idntico procedimiento sera vlido "Amarillas" => " ",
para arrays asociativos con slo "Rojas" => " ",
cambiar los nmeros por cadenas "Penalty" => " "
escritas entre comillas. ),
"Condal" => array (
Este podra ser un ejemplo de "Resultado" => "1-4",
array asociativo: "Amarillas" => "2",
$z["a"]["A"]=34; "Rojas" => "1",
$z["a"]["B"]=35; "Penalty" => "1"
$z["a"]["C"]=36; ),
$z["b"]["A"]=134; "Piloesa" => array (
$z["b"]["B"]=135; "Resultado" => "2-0",
$z["b"]["C"]=136; "Amarillas" => "1",
"Rojas" => "0",
que podra definirse tambin de
"Penalty" => "0"
esta forma:
),
),
$z=array( "Condal" => array(
"a" => array (
"Juvencia" => array (
"A" => 34,
"Resultado" => "1-0 ",
"B" => 35,
"C" => 36, "Amarillas" => "4",
), "Rojas" => "1",
"b" => array ( "Penalty" => "2"
"A" => 134, ),
"B" => 135, "Mosconia" => array (
"C" => 136, "Resultado" => "6-3",
) "Amarillas" => "1",
); "Rojas" => "2",
"Penalty" => "3"
A medida que la dimensin se hace ),
mayor la sintaxis requiere "Canicas" => array (
muchsima ms atencin y los "Resultado" => "14-3",
errores son poco menos que "Amarillas" => "1",
inevitables. Refresquemos un poco "Rojas" => "0",
la memoria. "Penalty" => "0"
),
No olvides los punto y coma "Condal" => array (
del final de las "Resultado" => " ",
instrucciones. "Amarillas" => " ",
Cuidado con las formas
"Rojas" => " ",
anidadas y tambin con los
"Penalty" => " "
parntesis.
Cierra cada uno de los ),
parntesis que abras y no "Piloesa" => array (
olvides que los parntesis "Resultado" => "1-0",
se anidan, ya sabes... el "Amarillas" => "3",
primero que se abre "Rojas" => "1",
siempre con el ltimo que "Penalty" => "0"
se cierra, el segundo con el ),
penltimo, etctera. ),
No dejes de prestar "Piloesa" => array(
atencin a las comillas.
"Juvencia" => array (
Recuerda que hay que
"Resultado" => "1-1",
cerrarlas siempre y que hay
que diferenciarlas en los "Amarillas" => "0",
casos en que van comillas "Rojas" => "0",
dentro de otras comillas. "Penalty" => "1"
),
"Mosconia" => array (
Una ltima advertencia. No te
desesperes con los errores de "Resultado" => "2-3",
sintaxis! Son inevitables. "Amarillas" => "1",
"Rojas" => "0",
"Penalty" => "0"
Enmendando un olvido ),
"Canicas" => array (
Cuando hemos hablado de las "Resultado" => "0-1",
funciones matemticas hemos "Amarillas" => "0",
olvidado mencionar una de ellas. "Rojas" => "0",
"Penalty" => "0"
Se trata de la funcin valor
absoluto. ),
"Condal" => array (
La sintaxis es la siguiente: "Resultado" => "1-1",
"Amarillas" => "1",
Abs($a); "Rojas" => "2",
Un ejemplo: "Penalty" => "0"
),
<? "Piloesa" => array (
$MiSaldo=" -347.513 "; "Resultado" => " ",
$MisDeseos=Abs($MiSaldo); "Amarillas" => " ",
$MisDeseos .= " "; "Rojas" => " ",
echo $MisDeseos; "Penalty" => " "
?> ),
resultara : )
);
347.513 ?>
Utilizando este array hemos construido la tabla que hemos puesto como ejemplo.
ejemplo21.php
Funciones de salida
Funciones de salida
Aqu tienes un resumen de las diversas opciones de la funcin printf():
Ya conocemos algunas de las
funciones que PHP utiliza para Sintaxis
mostrar informacin salidas en
la ventana del navegador del printf(cadena de formato,variable1,variable2,..)
cliente. Cadena de formato
Recordmoslas:
"%[relleno][alineacin][ancho][precisin][tipo]"
Carcter Valor Sintaxis Resultado
echo 0 0 printf("%020d",32) 00000000000000000032
* '* printf("%'*20d",32) ******************32
La funcin echo, aunque admite
tambin la forma echo(), no espacio1) ' printf("%' 20d",32) 32
requiere de forma obligatoria el - '- printf("%'-20d",32) ------------------32
uso de los parntesis.
Observaciones
Detrs de la instruccin echo En este apartado prestaremos atencin nicamente a los caracteres marcados en
rojo, que son los que corresponden a las diferentes formas de relleno. Los dems
pueden insertarse: variables,
parmetros los iremos tratando uno en los apartados siguientes.
cadenas (stas entre comillas) y
nmeros (stos sin comillas) Cuando se pretende rellenar con ceros a la izquierda basta escribir el 0
separadas por comas. inmediatamente detrs del signo %
Este es un ejemplo de cdigo: Relleno Si se trata de rellenar con un carcter distinto de cero debe escribirse
inmediatamente despus de% una comilla simple ' seguida del carcter de
$a=24; $b="Pepe"; relleno.
$c="<br>";
Si se pretende rellenar con espacios forzados se puede escribir la comilla simple 'e
echo $a,$b,25,
inmediatamente despus teclear la combinacin ALT+0160 (carcter ASCII 160)
"Luis",$c; usando el teclado numrico. Aunque obviamente no se visualiza el espacio si se
conserva tal como puede verse en el ejemplo 1)
que producira esta salida:
Obsrvese que como la tipografa es de ancho variable y que segn el carcter que se
24Pepe25Luis use como relleno se modifica el ancho de la presentacin.
Observa los valores que hay detrs Quiz convenga recordar que 32 es en este caso la variable a la que pretendemos
de echo. Como vers, no es dar formato y que ese valor podra ser sustituido por el nombre de una variable que
necesario insertar todos los valores contenga valores numricos.
en la misma lnea.
Carcter Valor Sintaxis Resultado
print() Ninguno Dcha printf("%020d",32) 00000000000000000032
- Izda printf("%020d",32) 32
La funcin print() slo puede Ninguno Dcha printf("%'*20d",32) ******************32
contener dentro del parntesis una - Izda printf("%'*20d",32) 32******************
sola variable, o el conjunto de Ninguno Dcha printf("%020s",32) 00000000000000000032
varias de ellas enlazadas por un
- Izda printf("%020s",32) 32000000000000000000
punto.
Ninguno Dcha printf("%'*20s",32) ******************32
Aqu tienes algunos ejemplos: - Izda printf("%'*20s",32) 32******************
print(25.3) Observaciones
Alineacin En los casos en que figura Ninguno en la columna Caracter tratamos de indicar que
producira esta salida
no es necesario escribir nada en la cadena de formato. Cuando aparece un signo ()
25.3 estamos indicando que debe insertarse un signo menos.
print("Gonzalo") Fjate que en los cuatro primeros supuestos el identificador de tipo es d, lo cual hace
escribira que considere la variable como numrica, mientras que en los cuatro ltimos ese
Gonzalo valor es s, con lo cual considera la variable como tipo cadena.
$z=3.1416; Cuando tratamos de rellenar una variable numrica con ceros por la derecha PHP
print($z); los omite para no alterar el valor numrico en la presentacin
escribira
Con cualquier otro carcter de relleno (incluidos los caracteres numricos con '
3.1416 delante) s efecta el relleno.
Recuerda tambin que es posible Carcter Valor Sintaxis Resultado
utilizar dentro del parntesis el Entero 14 printf("%'*14d",32) ************32
concatenador de cadenas. Entero 17 printf("%'*-17d",32) 32***************
Decimal 14.5 printf("%'*14.5d",32) ************32
$h=3;
Decimal 17.8 printf("%'*-17.8d",32) 32***************
$f=" hermanos"
Decimal 14.5 printf("%'*14.5f",32) ******32.00000
print("Heladeria ".$h.$f)
Decimal 11.8 printf("%'*-11.8f",32) 32.00000000
que escribira Ancho
Observaciones
El ancho (n de caracteres totales) puede especificarse mediante un nmero entero
Heladeria 3 hermanos para todo tipo de variables
Funciones de cadenas
Formatos en cadenas
Algunas de las funciones que
permiten manejar los formatos de
las cadenas de caracteres son
printf(cadena de formato,variable1,variable2,..)
estas:
Cadena de formato
chr(n)
Dentro de la cadena de formatos deben repetirse tantos formatos como variables se pretenda manejar
Devuelve el carcter cuyo
cdigo ASCII es n. "%[rell1][alin1][anc1][prec1][tipo1][sepa1]%[rell1][alin1][anc1][prec1][tipo1][sepa1]"
ord(cadena)
Hemos de mencionar aqu los separadores ya que no fueron mencionados en la
Devuelve el cdigo ASCII del pgina anterior
primero de los caracteres de la
cadena. Se puede introducir una cadena de separacin al final de una cadena de formato
que puede hacer, entre otras, funcin de separacin entre dos cadenas.
strlen(cadena)
Por ejemplo, printf("%'*15.2f Euros",1475.875) nos devolvera:
Devuelve la longitud (nmero de
caracteres) de la cadena. Los ********1475.88 Euros
espacios son considerados como
un caracter ms. La funcin printf() permite presentar varios valores o variables con distintos
formatos utilizando la sintaxis que se indica ms arriba.
strtolower(cadena)
Este ejemplo :
Cambia todos los caracteres de la
cadena a minsculas. printf("%'*15.2f Euros=%'*18.0f Pesetas",1475.875,1475.875*166.386)
strtoupper(cadena) devuelve como resultado:
Convierte en maysculas todos los
********1475.88 Euros=************245565 Pesetas
caracteres de la cadena.
ucwords(cadena) Existe otra funcin PHP con caractersticas muy similares a la anterior. Se trata de
Convierte a maysculas la primera sprintf().
letra de cada palabra.
La sintaxis es idntica sprintf (cadena de formato, variable1,variable2, ...) y su nica
ucfirst(cadena) diferencia con printf es que, mientras que printf() imprime las variables utilizando el
formato indicado, sprintf() puede guardar en una nueva variable la cadena resultante
Convierte a maysculas la primera de la aplicacin del formato.
letra de la cadena y pone en
minsculas todas las dems.
El contenido del textarea debera visualizarse integramente en minsculas, excepto los diez
primeros caracteres que deberan verse en maysculas.
Funciones de cadenas
Formatos de salida
Como complemento a las descritas
en la pgina anterior, aadimos Estos son algunos ejemplos en los que continuamos con las aplicaciones de las
aqu algunas otras funciones PHP funciones PHP al manejo de cadenas:
que tambin permiten manejar
cadenas de caracteres. Marcas, divisiones y uniones de cadenas
AddSlashes(cadena) Variable cadena Sintaxis Resultado
$a="Esta ' y \ y
Inserta el carcter \ delante los AddSlashes($a) $a="Esta \' y \\ y tambin NUL"
tambin NUL"
siguientes: ", ', \ y NUL (el bit
nulo). $a="Esta \' y \\ y
stripslashes($a) Esta ' y y tambin el nulo
tambin NUL"
stripslashes(cadena) $a="Esta es una
cadena larga que chunk_split Esta es una cadena larga que presuntamen
Quita las marcas aadidas a una presuntamente ser ($a,5,"") te ser troceada
cadena con la funcin AddSlashes troceada"
(). $a="Esta es una
cadena larga que Esta es un a cad ena l arga que p resun tamen te se
chunk_split(cad, n, sep ) presuntamente ser
chunk_split($a,5)
r tr ocead a
troceada"
Devuelve la cadena (cad) despus
de haberle insertado, cada n $a="Esta es una
caracteres, la cadena indicada en cadena larga que chunk_split Esta es una cadena larga que presuntamente ser
el parmetro sep. presuntamente ser ($a,76,"-") troceada-
troceada"
Si no se indica sep PHP pondr un
espacio. $todo="v1=Esto+sera+una+variable&v2=esto+otra&p[]=incluso+un+array"
Si no se establece el parmetro n parse_str($todo);
insertar el separador cada 76 Divide la cadena Esto sera una variable
echo $v1;
caracteres. $todo en sus esto otra
echo $v2;
componentes incluso un array
Esta funcin coloca siempre un echo $p[0];
separador al final de la cadena. $a="Esta cadena sera devuelta en trozos"
parse_str(cadena) $trozo1=explode("
",$a); Esta
Recoger en un
Devuelve las variables con su echo $trozo1[0]; cadena
array cada uno de
valor indicadas dentro de la echo $trozo1[1]; sera
los trozos
cadena (observa la sintaxis del echo $trozo1[2]; devuelta
delimitados por los
echo $trozo1[3]; en
ejemplo). separadores
echo $trozo1[4]; trozos
Dentro de la cadena cada variable
echo $trozo1[5];
se denomina con un nombre que
va seguido de un signo igual. Los $trozo2=explode
espacios se sealan con el signo + ("a",$a); Est
Recoger en un
echo $trozo2[0]; c
y los separadores de variables son array cada uno de
echo $trozo2[1]; den
signos & los trozos
echo $trozo2[2]; ser
delimitados por los
echo $trozo2[3]; devuelt
explode(sep, cad,n) separadores
echo $trozo2[4]; en trozos
echo $trozo2[5];
Devuelve un array cuyos
elementos contienen cada una de $trozo3=explode("
las porciones de la cadena (cad) Recoger en un ",$a,3);
array cada uno de echo $trozo3[0]; Esta
comprendidas entre dos de los cadena
los trozos echo $trozo3[1];
caracteres sealados como (sep) sera devuelta en trozos
delimitados por los echo $trozo3[2];
hasta el mximo de porciones separadores hasta echo $trozo3[3];
sealadas (n). un mximo de 3 echo $trozo3[4];
Los caracteres separadores no son echo $trozo3[5];
includos en las cadenas
$trozo4=explode
resultantes. Si no se indica la
Recoger en un ("a",$a,3);
cantidad de porciones, ser array cada uno de echo $trozo4[0]; Est
fraccionada toda la cadena. los trozos echo $trozo4[1]; c
Si se indica nmero, el ltimo delimitados por los echo $trozo4[2]; dena sera devuelta en trozos
trozo contendr toda la cadena separadores hasta echo $trozo4[3];
restante. un mximo de 3 echo $trozo4[4];
echo $trozo4[5];
implode(sep, array)
implode(" ",$trozo1) Esta cadena sera devuelta en trozos
Devuelve una cadena formada por implode("*",
Est* c*den* ser* devuelt* en trozos
todos los elementos del array $trozo2)
separados mediante los caracteres implode("-",
indicados en sep. Esta-cadena-sera devuelta en trozos
$trozo3)
Aplica el algoritmo crc32 de La funcin count_char($a,0) devuelve un array cuyos ndices son los cdigos ASCII
comprobacin de integridad y de los caracteres y cuyos valores son el nmero de veces que se repite cada uno de ellos.
devuelve el valor del mismo.
La funcin substr_count($a,"cadena") determina el nmero de veces que aparece
Se utiliza muchsimo en los
la cadena dentro de $a. Diferencia entre maysculas y minsculas.
programas de compresin y
descompresin de ficheros. Se
aplica en el momento de El algoritmo md5
comprimir y se incluye el valor
obtenido dentro del fichero
comprimido. Despus de la Este algoritmo presenta como peculiaridades que tenga la dimensin que tenga la
descompresin se vuelve a aplicar cadena a la que se aplique genera siempre una huella digital que no es otra cosa que
el mismo algoritmo y se comparan una cadena formada por 32 caracteres y que no dispone de ningn mecanismo inverso.
ambos valores. La coincidencia
ser la garanta de que el fichero Seguramente habrs vivido esta experiencia. En muchos espacios de Internet grupos
obtenido es idntico al original. de noticias, cuentas de correo web, etctera que requieren un login y una contrasea
cuando utilizas la opcin de recuperar contraseas no te envan tu contrasea anterior,
sino que te generan y envan una nueva.
Esto ocurre porque, por razones evidentes de seguridad, las contraseas se almacenan
usando estas huellas digitales y resulta imposible recuperar los valores originales.
La nica solucin en estos casos es crear una nueva contrasea (suelen hacerlo con
las funciones de nmeros aleatorios), enviarla de forma automtica por correo electrnico
y sustituir el valor anterior del registro de usuarios por el resultado de la codificacin
md5 de la nueva contrasea.
Dos interpretaciones
Un ejemplo
nl2br($A) ?>
Comentario previo
Manejando operadores bit a bit
Incluimos la sintaxis de este tipo
de operadores a ttulo meramente Desarrollamos aqu algunos ejemplos de manejo de los operadores bit a bit.
informativo. Rara vez ser
necesario utilizarlos en nuestras El operador &
aplicaciones PHP.
Nmeros Nmeros como cadenas Cadenas alfanumricas
Su utilidad suele limitarse a la Valores
gestin de perifricos y algunas Variables Variables Valores binarios Variables Valores binarios
binarios
operaciones de clculo de carcter
$a=12 1100 $A="12" 110001110010 $A1="Rs" 10100101110011
muy reiterativo en la que se puede
conseguir un rendimiento muy $b=23 10111 $B="23" 110010110011 $B1="aZ" 11000011011010
superior a los operadores $a&$b=4 100 $A&$B=02 110000110010 $A1&$B1=@R 10000001010010
tradicionales.
En los casos de cadenas hemos diferenciado en rojo el valor binario correspondiente al primer carcter.
En el mbito propio del PHP Esos valores binarios corresponden a la forma binaria del cdigo ASCII de cada uno de los caracteres
pueden tener algn inters a la
hora de elaborar rutinas para
encriptar el cdigo fuente de Puedes observar que el tratamiento es distinto cuando los mismos valores numricos
algunos scripts que por su se asignan como entero y como cadena.
importancia pueden requerir ese
tipo de proteccin. Al asignarlos como cadena opera los valores binarios de los cdigos ASCII de los
caracteres, mientras que cuando se trata de nmeros compara los valores de las
Los que s han de resultarnos de expresiones binarias de los valores de cada uno de ellos
gran inters sern el resto de los
operadores. Los iremos viendo en
pginas sucesivas. El operador |
Nmeros Nmeros como cadenas Cadenas alfanumricas
Operadores bit a bit Variables Valores binarios Variables Valores binarios Variables Valores binarios
$a=12 1100 $A="12" 110001110010 $A1="Rs" 10100101110011
$A & $B $b=23 10111 $B="23" 110010110011 $B1="aZ" 11000011011010
El operador & compara los valores $a|$b=31 11111 $A|$B=33 110011110011 $A1|$B1=s{ 11100111111011
binarios de cada uno de los bits de
las cadenas $A y $B y devuelve 1 Se comporta de forma idntica al anterior en lo relativo a nmeros y cadenas.
en el caso que ambos sean 1, y 0
en cualquier otro caso.
El operador ^
Cuando las variables $A y $B son Nmeros Nmeros como cadenas Cadenas alfanumricas
cadenas compara los valores
binarios de los cdigos ASCII de Variables Valores binarios Variables Valores binarios Variables Valores binarios
sus caracteres y devuelve los $a=12 1100 $A="12" 110001110010 $A1="Rs" 10100101110011
caracteres ASCII correspondientes
$b=23 10111 $B="23" 110010110011 $B1="aZ" 11000011011010
al resultado de esa comparacin.
$a^$b=27 11011 $A^$B= 000011000001 $A1^$B1=3) 01100110101001
$A | $B
Funciona de forma idntica al Los criterios de tratamiento de nmeros y cadenas coinciden con los operadores
anterior y devuelve 1 cuando al anteriores.
menos el valor de uno de los bits
comparados es 1, y devolver 0 El operador <<
cuando ambos sean 0.
Nmeros Nmeros como cadenas Cadenas alfanumricas
$A ^ $B Variables Valores binarios Variables Valores binarios Variables Valores binarios
Devuelve 1 cuando los bits $a=12 1100 $A="12" 110001110010 $A1="Rs" 10100101110011
comparados son distintos, y 0 $b=2 10 $B=2 10 $B1=2 10
cuando son iguales.
$a<<b=48 110000 $A<<$B=48 110000 $A1<<$B1=0
$A << $B
El operador << multiplica el valor de la primera cadena por 2 elevado al valor de la
Realiza la operacin $A * 2$B. segunda.
Hace el clculo aadiendo $B
CEROS (binarios) a la derecha de
Al ser un operador matemtico solo tiene sentido cuando ambas variables son
la cadena binaria $A. nmeros naturales. En las cadenas alfanumricas extrae los nmeros que pudiera
haber al comienzo y, en caso de no haberlos, toma valor cero.
$A >> $B
El operador >>
Divide el valor $A entre 2$B.
Hace la operacin en la cadena Nmeros Nmeros como cadenas Cadenas alfanumricas
binaria quitando $B CEROS (por la Variables Valores binarios Variables Valores binarios Variables Valores binarios
derecha) de la cadena $A.
$a=12 1100 $A="12" 110001110010 $A1="Rs" 10100101110011
~ $A $b=2 10 $B=2 10 $B1=2 10
El operador ~
$a=12 1100
~$a=-13 11111111111111111111111111110011
Antes de empezar
Manejando operadores de comparacin
Si es este tu primer contacto con
el mundo de la progra- macin es Desarrollamos aqu algunos ejemplos de manejo de los operadores de comparacin.
probable que ests pensando que
todo esto est muy bien pero que El operador ==
a t lo que te interesa es hacer
cosas. En una palabra, que quieres A B Operador Sintaxis Resultado
usar PHP como herramienta para $A=123 $B=123 == $A==$B 1
el desarrollo de tus proyectos. $A=123.0 $B=123 == $A==$B 1
Esta pgina y las siguientes van a $A=123 $B="123" == $A==$B 1
ser bsicas para el xito en ese $A=123 $B="123ABC" == $A==$B 1
lgico y razonable afn utilitarista.
$A=123 $B=124 == $A==$B
Pensemos en nuestro da a da. En $A=123 $B=124 == ord($A==$B) 0
cada momento de nuestra vida
$A="abc" $B="ABC" == $A==$B
hacemos algo. Cada cosa que
hacemos suele requerir casi $A="abc" $B="abc" == $A==$B 1
siempre esta secuencia de $A="abc" $B="abcd" == $A==$B
acciones: comparar, evaluar, optar
y hacer. Los valores de la columna sealada como Resultados se obtienen mediante la funcin echo($A==$B);
Podemos ver que, en los casos que es cierta la igualdad, imprime un 1, mientras que cuando es falsa
Supongamos que queremos no imprime nada.
cambiar de coche. Lo ms Se justifica este extremo porque en caso de no coincidencia el valor devuelto es NUL (cdigo ASCII 0)
prudente ser empezar por y ese carcter carece de smbolo grfico.
comparar las caractersticas Hemos marcado en rojo una excepcin.
(potencia, diseo, precio, etc.) de En ese caso, la instruccin es echo ord($A==$B); y como recordars dado que ord, que devuelve
el cdigo ASCII del caracter contenido en el parntesis que le acompaa, podemos comprobar a travs
los diferentes modelos.
del cero de este resultado, que, efectivamente, la no coincidencia devuelve NUL.
Salvo en casos excepcionales, no
tomaramos una decisin de
compra a travs de un solo El operador ===
parmetro sino que haramos una A B Operador Sintaxis Resultado
evaluacin conjunta de todos esos
factores (menos potencia pero $A=123 $B=123 === $A===$B 1
mejor precio y diseo muy similar, $A=123.0 $B=123 === $A===$B
por citar un ejemplo) y sera a
$A=123 $B="123" === $A===$B
travs de esa evaluacin como
optara- mos por una marca o $A=123 $B="123ABC" === $A===$B
modelo. $A=123 $B=124 === $A===$B
El operador !=
Operadores de
A B Operador Sintaxis Resultado
comparacin
$A=123 $B=123 != $A!=$B
Mediante este operador se pueden En los ejemplos sealados en rojo Puedes comprobar el carcter no estricto de este operador.
Devuelve NUL porque considera que no son distintos, lo que equivale a interpretar que los considera
comparar variables de distinto tipo.
iguales pese a que las variables sean de distinto tipo.
Para comparar una cadena con un
nmero se extrae el valor entero
de la cadena (si lleva dgitos al El operador <
comienzo los extrae y en caso A B Operador Sintaxis Resultado
contrario le asigna el valor cero) y
utiliza ese valor para hacer la $A=123 $B=123 < $A<$B
comparacin. $A=123 $B="123" < $A<$B
$A=123.0 $B="123" < $A<$B
Cuando se comparan cadenas
discrimina entre maysculas y $A=123 $B="123ABC" < $A<$B
minsculas ya que utiliza los $A=123 $B=124 < $A<$B 1
cdigos ASCII de cada uno de los
caracteres para hacer la $A=123 $B=124 < ord($A<$B) 49
comparacin. $A="abc" $B="ABC" < $A<$B
$A="abc" $B="abc" < $A<$B
La comparacin se hace de
izquierda a derecha y devuelve 1 $A=" bcd" $B="abcd" < $A<$B 1
(CIERTO) slo en el caso que $A="aacd" $B="abcd" < $A<$B 1
coincidan exactamente los
contenidos de ambas cadenas. $A="abc" $B="abcd" < $A<$B 1
$A="abcd" $B="abc" < $A<$B
$A === $B
$A="A" $B="a" < $A<$B 1
El operador === es similar al $A="a" $B="A" < $A<$B
anterior, pero realiza la compa- $A="aBC" $B="A" < $A<$B
racin en sentido estricto.
$A="123" $B=124 < $A<$B 1
Para que devuelva 1 es necesario $A=123 $B="124" < $A<$B 1
que sean iguales los valores de las
variables y tambin su tipo. Observa los ejemplos sealados en rojo. Cuando las cadenas tienen distinta longitud este operador
considera que los caracteres que faltan en la cadena ms corta son NUL. Esa es la razn por la que en
$A != $B el primer caso devuelve CIERTO (NUL es menor que d) y el segundo FALSO (d no es menor que NUL).
Escribe un script en el que uses cada uno de los operadores de comparacin que hemos
descrito en esta pgina.
Eligiendo las variables adecuadas, debes escribir dos ejemplos para cada uno de los
operadores de modo que uno de ellos devuelva CIERTO y el otro FALSO.
Guarda el documento como ejercicio17.php y comprueba que su funcionamiento es
correcto y que los resultados de las comparaciones coinciden con lo que habas previsto.
Anterior Indice Siguiente
Operadores lgicos
Operadores lgicos
Operadores lgicos
Mediante operadores lgicos es
posible evaluar un conjunto de Aqu tienes las tablas de verdad de los distintos operadores lgicos.
variables lgicas, es decir, aquellas
cuyos valores sean nicamente: El operador AND
VERDADERO o FALSO (1 NUL).
Variables $a=32; $b=0; $c=-7; $d=4.32; $f="23 Ptas"
El resultado de esa evaluacin ser $x=$a>$b;$y=$a>$c;$z=$a>$f;
siempre 1 NUL. Ejemplo de sintaxis
echo ($x AND $y AND $z);
Operadores de incremento
Operadores de preincremento
Los caracteres ++ y -- escritos al
lado del nombre de una variable El operador ++$A
producen incrementos o
decrementos de una unidad en el Variables numricas Variables alfanumricas
valor de la misma. Valor
Sintaxis Resultado Valor inicial Sintaxis Resultado
inicial
De igual forma, los operadores
$a=23 echo ++$a 24 $b="pepe" echo ++$b pepf
+=n y -=n escritos a la derecha
del nombre de una variable $a=23 echo ++$a*2 48 $b="pepe" echo ++$b*2 0
producen incrementos o
decrementos de n unidades en el
valor de la variable. El operador $A
Variables numricas Variables alfanumricas
Como veremos a continuacin, los
operadores ++ y -- se comportan Valor
Sintaxis Resultado Valor inicial Sintaxis Resultado
de distinta forma segn estn inicial
situados a la izquierda o a la $a=23 echo $a 22 $b="pepe" echo --$b pepe
derecha de la variable. $a=23 echo --$a*2 44 $b="pepe" echo $b*2 0
Tipos vlidos
El operador $A +=n
Estas operaciones slo tienen Variables numricas Variables alfanumricas
sentido en variables numricas Valor
Sintaxis Resultado Valor inicial Sintaxis Resultado
enteras o no, pero, si se aplican a inicial
variables de cadena les asignan echo $a+=5; 28 echo $b+=5; 5
previamente valor cero, salvo en $a=23 $b="pepe"
echo $a 28 echo $b 5
una curiosa excepcin que puedes
ver en la primera de las tablas que echo 2*$a+=5; 56 echo 2*$b+=5; 10
$a=23 $b="pepe"
echo 2*$a 56 echo 2*$b 10
tienes aqu a la derecha.
Operadores de El operador $A =n
preincremento Variables numricas Variables alfanumricas
Valor
Sintaxis Resultado Valor inicial Sintaxis Resultado
++$A y --$A inicial
echo $a-=5; 18 echo $b-=5; -5
Este operador incrementa el valor $a=23 $b="pepe"
echo $a 18 echo $b -5
de la variable en una unidad (+1 o
-1) antes de ejecutar el contenido echo 2*$a-=5; 36 echo 2*$b-=5; -10
$a=23 $b="pepe"
echo 2*$a 36 echo 2*$b -10
de la instruccin.
$A+=n y $A-=n
Operadores condicionales
El operador if
If ... else
<?
El operador condicional tiene una $a=3;
interesante ampliacin. En # observa que ponemos la etiqueta de fin de script
conjuncin con else permite # despus de los dos puntos
aadir instrucciones que slo if ($a==5): ?>
seran ejecutadas en caso de no <!-- Aqu estamos poniendo HTML puro
cumplirse la condicin. no estamos dentro del script PHP //-->
Esta nueva opcin se habilita <H1>Esto no es PHP. A es igual 5</H1>
mediante la siguiente sintaxis:
<!-- en la linea siguiente a este comentario
if(condicion){ volveremos a PHP para insertar el else seguido de dos puntos
... instrucciones... y cerramos de nuevo el script con ?>//-->
... a ejecutar cuando <? else: ?>
se cumple la condicin
} else {
<!-- Aqu ms HTML para el (else)
... instrucciones...
caso de que no se cumpla la condicin //-->
... a ejecutar cuando NO
se cumple la condicin <H2>Esto no es PHP. Es el resultado del ELSE</H2>
}
<!--
permitiendo tambin la sintaxis volveremos a PHP para insertar en endif que indica el fin del if //-->
alternativa :, endif, aunque en <? endif; ?>
este caso hay que hacer una
precisin -puedes verla aqu
debajo la llave de cierre que iba
delante de else se elimina y no es ejemplo28.php
sustituida por ningn caracter ni
smbolo especial.
El operador condicional ternario
<?if(condicion): ?>
... instrucciones...
... a ejecutar cuando Ejemplo con a=2 Ejemplo con a=8
se cumple la condicin2
sin cumplirse condicin1
} else { Ejercicio n 19
... instrucciones... Disea un formulario ejercicio19a.php- con un input tipo texto en el que puedas escribir
... a ejecutar cuando NO nmeros. Al pulsar el botn de enviar debe llamar a un script ejercicio19b.php- que debe
se cumple ni la condicin1
decirnos si el nmero enviado fue: positivo, cero o negativo.
ni la condicion2
A la pgina ejercicio19b.php adele un enlace HTML que permita volver a la pgina
} anterior.
Condicionales anidados
...instrucciones
}
}else{ Ejercicio n 21
... instrucciones...
...instrucciones... Ampla el ejercicio anterior a las dos preguntas que se formulaban en el n10. Ahora
} deberamos saber si ha sido correcta o no la respuesta a cada una de las preguntas.
Puedes llamar ejercicio21a.php y ejercicio21b.php a los documentos que crees para este
Observa que todo el bloque if..
else... marcado en azul se cierra ejercicio.
antes de abrir la opcin else
marcada en marrn. Es
obligatorio que as sea. De igual
forma, podramos insertar bloques Restringir accesos
sucesivos hasta llegar a crear una
estructura tan amplia como fuera Las variables predefinidas $_SERVER['HTTP_REFERER'] (en el caso de PHP 4.1.0 o
necesaria. superior) y $HTTP_SERVER_VARS['HTTP_REFERER'] (en todos los casos) recogen la
ruta completa de la pgina desde la que hemos accedido a la actual.
Como ves, todo un mundo de
posibilidades.
<?
Una aplicacin # el condicional if estable como condicin
a la seguridad # que el acceso a este script proceda de la direccion indicada
# en este caso hemos puesto como condicin que ese valor
En pginas anteriores hemos # sea la direccin de esta pgina
hecho algunas alusiones a la if($_SERVER['HTTP_REFERER']=="http://localhost/cursoPHP/php37.php"){
seguridad. # si accedemos desde esta pgina, el enlace que tienes aqui debajo
# veremos que aparece este print, es decir se visualizara todo
Decamos que los envos de
# lo contenido antes del else
informacin por medio de los
formularios no eran seguros print "ejecuto sin problemas el script";
porque, dada la transparencia de }else{
su cdigo, pueden ser # si accedes desde un sitio diferente te aparecer este mensaje
reproducidos y utilizados desde # puedes probar escribiendo en tu navegador
cualquier otro sitio distinto a # http://localhost/cursoPHP/ejemplo35.php
nuestro servidor. # y comprobars que aparece este mensaje
"No puedes ver esta pagina";
Una sencillo condicional puede
exit;
resolver ese problema. Lo puedes
}
ver en el ejemplo que tienes aqu a
la derecha. ?>
La funcin exit()
PHP dispone de una funcin exit()
ejemplo35.php
muy til a los efectos del
comentario anterior. Anterior Indice Siguiente
La funcin switch
La estructura switch
ejemplo37.php
Los bucles
La instruccin while
while(condicin)
<?
...instruccin
$A=0;
Con esta sintaxis estaremos /* utilicemos ahora el bucle para crear un tabla HTML
indicando que la instruccin empecemos escribiendo la etiqueta de apertura de esa tabla
siguiente (slo una instruccin) ha fuera del bucle (ya que esa se repite una sola vez)
de ejecutarse continua y y utilicemos el bucle para escribir las celdas y sus contenidos */
repetidamente hasta que deje de
cumplirse la condicin establecida. print ("<table width=300 border=2>");
while(condicin){
...instruccin while ($A<=5){
..... echo "<tr><td align=center>";
} print $A;
# esta instruccin es importantisima
De forma similar a la utilizada en # si no modificamos el valor de $A el bucle sera infinito
el caso de if, tambin en este $A++;
caso, las llaves hacen la funcin de print("</td></tr>");
contenedores de las instrucciones }
cuya ejecucin debe repetirse
# cerremos la etiqueta table
mientras se cumpla la condicin.
print "</table>";
while(condicin): ?>
...instruccin
.....
endwhile; ejemplo39.php
break } while($A<500);
echo "<BR>He salido del bucle porque A es: ",$A;
La funcin break de forma ?>
similar a lo que ocurra en switch
permite interrumpir la ejecucin de
bucle. ejemplo43.php
El bucle for
La estructura for
Se trata de una nueva forma de Aqu tienes algunos ejemplos de las diferentes variantes del bucle for.
uso bastante habitual que
permite establecer un bucle que se <?
repetir mientras una variable for ($i = 1; $i <= 10; $i++) {
numrica se mantenga dentro de print $i."<br>";
intervalo -establecido en la sintaxis }
del propio bucle indicndose,
?>
tambin en la propia instruccin, el
criterio de modificacin de esa
variable en cada ejecucin del ejemplo45.php
bucle.
La sintaxis es la siguiente:
<?
for ( desde ; hasta ; incre ){ for ($i = 1;;$i++) {
......... if ($i > 10) {
...instrucciones.... break;
......... }
}
print $i."<br>";
El parmetro desde permite }
asignar un valor inicial a una ?>
variable ($var=num) que har
funciones de controladora de
iteraciones. ejemplo46.php
El bucle foreach
El bucle foreach
La instruccin continue
Ejemplos de continue
Obtener informacin
sobre variables
Tamaos de arrays
"Precio"=>"17340 euros",
is_int(variable)
"Color" =>"Rojo",
is_integer(variable) "Llantas" =>"Aluminio");
$c=47; $d=""; $e=array();
Estas tres funciones que son
idnticas devuelven UNO en el echo "<h3>Variables definidas</h3>";
caso de que la variable sea de tipo
entero y NUL en el caso contrario. echo " Esta definida la variable a ? ",isset($a),"<br>";
is_float(variable) echo " Esta definida la variable b ? ",isset($b),"<br>";
echo " Esta definida la variable c ? ",isset($c),"<br>";
is_double(variable) echo " Esta definida la variable d ? ",isset($d),"<br>";
echo " Esta definida la variable e ? ",isset($e),"<br>";
Estas dos funciones tambin echo " Esta definida la variable f ? ",isset($f),"<br>";
idnticas devuelven UNO en el
caso de que la variable sea de tipo echo "<h3>Identificacin de tipos de variables</h3>";
coma flotante y NUL en el caso
contrario.
echo " La variable a es un array ? ",is_array($a),"<br>";
is_string(variable) echo " La variable a es tipo double ? ",is_double($a),"<br>";
echo " La variable a es un entero ? ",is_int($a),"<br>";
Devuelve UNO en el caso de que la echo " La variable a es un entero ? ",is_long($a),"<br>";
variable sea tipo string y NUL en
caso contrario. echo "<h3>Eliminando variables</h3>";
unset(variable)
echo "La dimensin de a es: ",count($a),"<br>";
Destruye la variable indicada. Si unset($a[0]);
despus de aplicar unset sobre echo "Nueva dimensin de a: ",count($a),"<br>";
una variable aplicamos de nuevo la echo "La dimensin de b es: ",count($b),"<br>";
funcin isset, nos devolver NUL unset($b);
indicando que ya no est echo "Nueva dimensin de b: ",count($b),"<br>";
definida. echo " Sigue definida la variable b ? ",isset($b),"<br>";
La funcin unset se puede aplicar ?>
tanto sobre variables como sobre
un array y tambin sobre un
ejemplo59.php
elemento de un array.
Recuento de valores
Recuento de los valores
<?
contenidos en una matriz
$a=array(1,2,3,1,1,2,3,3,4,4,4,0,1);
$b=array("blanco","azul","blanco","blanco","azul","Blanco","Azul");
Algunas de las posibilidades de $c=array(
obtener informacin sobre los "a"=>"rojo",
contenidos de un array son las
"b" =>"verde",
siguientes:
"c" =>"rojo",
$n=array_count_values(ar) "d" =>"rojo",
"e" =>"verde",
Con array_count_values la "f" =>"Rojo",
variable $n ser un array que "g" =>"Verde");
tendr como ndices cada uno de echo "<h3>Cuenta valores del array()</h3>";
los valores distintos que contenga $contador=array_count_values($a);
el array ar, y como valores el
foreach($contador as $valor=>$veces){
resultado de contar el nmero de
veces que se repite cada uno de echo "El valor ",$valor," se repite ",
los valores contenidos en el array $veces," en la matriz a<br>";
inicial. }
echo $contador[0],"<br>";
Distingue entre maysculas y echo $contador[1],"<br>";
minsculas. echo $contador[2],"<br>";
echo $contador[3],"<br>";
Cuando el array inicial (ar)
contiene nmeros enteros (sea ar
echo $contador[4],"<br>";
escalar o asociativo) $n ser un $contador1=array_count_values($b);
array escalar. En caso contrario, foreach($contador1 as $valor=>$veces){
ser asociativo. echo "El valor ",$valor," se repite ",
$veces," en la matriz a<br>";
}
Bsqueda de elementos
echo $contador1["blanco"],"<br>";
en un array echo $contador1["azul"],"<br>";
echo $contador1["Azul"],"<br>";
clav=array_keys(arr) echo $contador1["Blanco"],"<br>";
$contador2=array_count_values($c);
Devuelve un array escalar (clav)
foreach($contador2 as $valor=>$veces){
que contiene como valores los
ndices del array inicial (arr).
echo "El valor ",$valor," se repite ",$veces," en la matriz a<br>";
}
clav=array_keys(arr, valor) echo $contador2["rojo"],"<br>";
echo $contador2["Verde"],"<br>";
Devuelve un array escalar (clav) echo $contador2["verde"],"<br>";
que contiene como valores los echo $contador2["Rojo"],"<br>";
ndices de los elementos del array
echo "$lt;h3>Devuelve las claves de un array$lt;/h3>";
inicial cuyo valor coincide con el
$claves=array_keys($a);
indicado mediante el parmetro
valor. foreach($claves as $v){
echo "El valor ",$v," es una de las claves$lt;br>";
valores=array_values(arr) }
$claves1=array_keys($a,1);
Esta funcin recoge en una nueva foreach($claves1 as $v){
matriz (valores) todos los echo "El valor ",$v," es una de las claves de elementos
valores contenidos en otro array.
de la matriz cuyo valor es <b>1</b><br>";
Es una forma de conversin de un }
array asociativo en otro escalar. echo "<h3>Devuelve los valores de un array</h3>";
$valores=array_values($c);
foreach($valores as $v){
echo ,$v," Este es un de los valores de
de la matriz c<br>";
}
?>
ejemplo60.php
Localizacin de valores en
una matriz
Moviendo el puntero interno
in_array(valor,array)
ejemplo61.php
Ordenaciones de arrays
Ordenaciones de arrays
Los elementos de un array se van
ordenando segn se van
definiendo. Por tanto, su orden no
es el mismo que el de los valores <?
de sus ndices. $a=array(1,2,3,1,1,2,3,3,4,4,4,0,1);
$b=array("blanco","azul","blanco","blanco","azul","Blanco","Azul");
Las funciones PHP que ordenan los $c=array(
elementos de un array permiten "b" =>"verde",
dos opciones. "c" =>"rojo",
"e" =>"verde",
Con una de ellas es posible la
ordenacin de los elementos sin "f" =>"Rojo",
modificar los valores de los "g" =>"Verde",
ndices, mientras que la otra s "a"=>"rojo",
modifica los ndices. "d" =>"rojo",);
ksort(array) }
krsort(array)
echo "<h3>Ordenacin inversa por claves usando krsort</h3>";
foreach ($b as $clave=>$valor){
Ordena la matriz por ndices en echo "Clave: ",$clave," Valor: ",$valor, "<br>";
sentido decreciente de los mismos.
}
Ordenacin por valores
asort($c);
manteniendo ndices
echo "<h3>Ordenacin por valores manteniendo indices </h3>";
asort(array) foreach ($c as $clave=>$valor){
Ordena la matriz segn sus valores
echo "Clave: ",$clave," Valor: ",$valor, "<br>";
en sentido creciente y mantiene
los ndices del array original. }
arsort(array) arsort($c);
Ordena la matriz por valores en
echo "<h3>Ordenacin inversa por valores manteniendo indices arsort</
sentido decreciente y sigue
h3>";
manteniendo los ndices
originales. foreach ($c as $clave=>$valor){
echo "Clave: ",$clave," Valor: ",$valor, "<br>";
Ordenacin mediante }
funcin definida por echo "<h3>Ordenacin por valores mediante
usuario funcin de usuario manteniendo indices</h3>";
PHP permite que el usuario pueda /* esta funcion recoge el valor de la variable $a
defina funciones en las que y aplicar el operador de comparacin ternario
establezca sus criterios de forma que si el valor de la variable es impar
particulares de ordenacin. Las devuelve como valor -2 y si es par devuelve 2
funciones PHP que permiten usar el 2 y el menos 2 unicamente establecen criterios de
esta caracterstica son las comparacion de modo que los valores -2 sern considerados
siguientes: anteriores a los valores +2 */
uasort(array, funcion)
Modificaciones en arrays
Modificacin de arrays
var= range(inf,sup)
array_slice($a,n) $wz2=array_pad($c,-17,"relleno");
La funcin array_slice extrae n
foreach($wz2 as $clave=>$valor){
elementos del array $a.
echo "Clave: ",$clave," Valor: ",$valor,"<br>";
Si el valor de n es positivo }
extraer todos los elementos a
partir del que ocupa la posicin n echo "<h3>Fusiona dos matrices</h3>";
contando desde primero hasta el
ltimo segn el orden de creacin $wz3=array_merge($a,$b);
de los elementos.
$inv=array_reverse($C);
foreach($inv as $clave=>$valor){
echo "Clave: ",$clave," Valor: ",$valor,"<br>";
}
?>
ejemplo63.php
Qu son las
Funciones de usuario
funciones de usuario? Imaginmonos, all por el mes de junio, sentados ante una mesa tratando de hacer la
declaracin de la renta. Para ese menester seguramente nos pertrecharamos adems del
De igual forma que ocurre con el impreso oficial de la declaracin con: calculadora, lpiz, goma de borrar e incluso con las
navegador en el caso del HTML, disposiciones legales relativas al impuesto.
PHP lee e interpreta las
instrucciones contenidas en los Seguramente iramos leyendo y cumplimentando el impreso oficial script PHP
scripts de forma secuencial. partiendo de la primera pgina orden secuencial y continuando de forma ordenada
hasta el final.
Es decir, las instrucciones se van
ejecutando en el mismo orden en
La calculadora, la goma, etctera funciones estaran disponibles para ser utilizadas
el que aparecen en el documento
original, con la excepcin de las invocadas tantas veces como fuera preciso y, adems, no seran elementos exclusivos
funciones. de ese documento, sino que seguiran disponibles para otros usos scripts distintos, tales
como la planificacin financiera de nuestras vacaciones, por citar un ejemplo.
En este caso, los bloques de
instrucciones son puestos a Las funciones de usuario son, como la calculadora o la goma, herramientas
disposicin de PHP, pero no se diseadas para facilitar las tareas y susceptibles de ser usadas en una o varias situaciones
ejecutarn hasta el momento en scripts diferentes.
que sean requeridas de forma
expresa. Ejemplos de funciones de usuario
Dnde Con este primer ejemplo obtendremos una pgina en blanco. El script contiene una
deben insertarse? funcin pero no hay ninguna instruccin que la invoque y por lo tanto no se ejecutara.
Es imprescindible respetar En este otro ejemplo veremos las diversas situaciones que pueden plantearse respecto
estrictamente la sintaxis que al mbito de las variables.
requiere de forma obligatoria los
siguientes elementos:
<?
La palabra function debe estar # definamos dos variables y asignmosles un valor
escrita en minsculas. $a=5; $b=47;
# escribamos una funcion a1 y pidmosle que imprima sus valores
El nombre de la funcin, que
debe seguir criterios similares a los
function a1(){
de los nombres de variables,
echo "Este es el valor de $a en la funcin a1: ",$a,"<br>";
aunque en este caso no se
antepone el smbolo $ ni ningn echo "Este es el valor de $b en la funcin a1: ",$b,"<br>";
otro. }
# hagamos una llamada a la funcion anterior
Los parntesis (), incluso cuando # no nos escribir ningn valor porque esas variables no pertenecen
no contengan nada. # al mbito de la funcin y sern consideradas como vacias
# en el ambito de la funcion
Las llaves de apertura ({) y
a1();
cierre (}) dentro de las cuales se
escribirn las instrucciones # escribamos una nueva funcin, definamos como global $a
correspondientes a ella. # y comprobemos que ahora si la hemos incluido en el ambito
# de la funcion
function a2(){
Ejecucin de la funcin global $a;
echo "Este es el valor de $a en la funcin a2: ",$a,"<br>";
Las funciones PHP no se ejecutan echo "Este es el valor de $b en la funcin a2: ",$b,"<br>";
en tanto no sean invocadas. }
# invoquemos esta nueva funcion y veamos que ahora
Para invocar una funcin la
# si se visualiza el valor de $a pero no el de $b
sintaxis es la siguiente:
a2();
nombre() # creemos una nueva funcion y ahora modifiquemos dentro de ella
Al ser llamada con esta sintaxis # ambas variables
desde cualquier script se function a3(){
ejecutarn las instrucciones global $a;
contenidas en ella. $a +=45;
$b -=348;
mbito de las variables echo "Este es nuevo valor de $a en la funcin a3: ",$a,"<br>";
echo "Este es el valor de $b en la funcin a3: ",$b,"<br>";
Resumamos lo ya comentado }
cuando tratamos el tema de las
# invoquemos la funcion a3
variables.
a3();
Las funciones no leen valores de # comprobemos -desde fuera del mbito de la funcin
variables definidas fuera de su # que ocurri con los valores de las variables
mbito salvo que dentro de la echo "El valor de $a HA CAMBIADO despues de ejecutar a3 es: ",$a,"<br>";
propia funcin se definan de forma echo "El valor de $b NO HA CAMBIADO despues de ejecutar a3 es: ",
expresa como globales. $b,"<br>";
# probemos que ocurre con una variable superglobal
Si una funcin modifica el valor
# veremos que sin ser definida expresamente en a4
de una variable global, el nuevo
valor persiste despus de # si pertenece a su ambito y por lo tanto visualizamos su contenido
abandonar la funcin. function a4(){
print "La superglobales si estn: ".$_SERVER['SERVER_NAME']."<br>";
Si dentro de una funcin se }
utiliza un nombre de variable # invoquemos esta nueva funcion
idntico al de otra externa a ella a4();
(sin definirla global) la nueva ?>
variable se inicia con valor nulo y
los eventuales valores que pudiera
ir conteniendo se pierden en el ejemplo66.php
momento en que se acaba su
ejecucin.
lo que estar ocurriendo es que el En este ejercicio ejercicio26.php utilizaremos una funcin para construir tablas similares
php.ini del servidor tiene a las que hemos construido en el ejercicio n 23. Pero incorporaremos una innovacin
configurada en Off la directiva: respecto a aquel. Ahora la funcin debe permitir construir tablas de cualquier dimensin n
de filas y/o columnas y el nmero de estas habremos de incluirlo en la llamada a esa
allow_call_time_pass_reference
funcin.
y eso suele ocurrir con algunos
hostings y tambin con la
configuracin por defecto de Otras funciones de usuario
algunas versiones de PHP
anteriores a la que estamos
<? function Encabezado() { ?>
utilizando.
<!-- Hemos abierto la funcin y cerrado la etiqueta PHP
todo esto es cdigo HTML //-->
Otra forma de definir <HTML>
funciones de usuario <HEAD>
<TITLE>Titulo de mi pgina</TITLE></HEAD>
Existe otra opcin de definicin de <BODY BGCOLOR="#FF0000">
funciones de usuario que puede <!-- Esta nueva llamada a PHP
resultar de mucho inters. En este insertando la llave de cierre de la funcin
caso la funcin se define en tres indicar a PHP que debe escribir todo lo
bloques: contenido entre la { y esta } //-->
<? } ?>
Definicin de la funcin, llave
de apertura y cierre del script PHP.
<? function Pie() { ?>
Contenido de la funcin <HR>
formado exclusivamente por </BODY>
cdigo HTML, que se escribira </HTML>
cuando fuera invocada la funcin <? } ?>
que lo contiene. <!-- Utilizaremos esas dos funciones para
crear una pgina web. Llamamos a la funcin Encabezado
Cierre de la funcin (llave de
luego escribimos un texto y por ultimo insertamos
cierre) contenido en un script PHP,
es decir, entre las etiquetas de el Pie de pgina con la funcin Pie //-->
apertura <? y cierre ?> de PHP. <? Encabezado(); ?>
Este es texto que aparecer en el cuerpo de la pgina.
Cuando es invocada una funcin Est fuera de los scripts de php y ser considerado
definida de esta forma puedes como un texto HTML. Debajo aparecer la lnea horizontal
verlo en el ejemplo PHP se limita que insertaremos mediante una nueva llamada a la funcin Pie
a escribir en el documento final los
textos contenidos entre la etiqueta <? Pie(); ?>
de apertura y cierre de la funcin.
ejemplo69.php
Funciones de fecha
Parmetros de la funcin date()
PHP es prdigo en cuanto a
posibilidades de manejo de fechas Parmetros de formato de date()
y horas. Para ello, cuenta, entre
otras, con las siguientes funciones: Valor Funcionalidad Sintaxis Resultado
A AM-PM date("A") PM
date (cadena de formato)
a am-pm date("a") pm
Devuelve valores de fecha y hora
actuales utilizando los parmetros d Da del mes en formato de 2 dgitos date("d") 21
que se sealan en la tabla para j da del mes sin ceros a la izquierda date("j") 21
establecer el formato de salida de
los datos. Dentro de la misma F Nombre del mes (texto completo) date("F") June
cadena de formato puede M Nombre del mes (3 letras) date("M") Jun
contener tantos parmetros como
se deseen. m N del mes (de 01 a 12) con dos dgitos date("m") 06
Pero si alojaras esta pgina en un L Ao actual bisiesto (1), no bisiesto (0) date("L") 0
hosting australiano, PHP nos Z Diferencia (seg.) horaria local con GMT date("Z") 7200
devolvera los valores con hora y
fecha de las antpodas. U Segundos Unix Epoch date("U") 1150917311
Los mismos comentarios que con devolvera: Son las 07 : 15 : 11 y hoy es 21-6-2006
el caso anterior. La nica
diferencia es que devuelve hora Este otro ejemplo devolver la fecha y hora GMT coincidente con el tiempo Unix
GMT. 456.573.426.
getdate() getdate()
Devuelve un array asociativo con
parmetros de la fecha actual. Ejemplos de getdate()
Los ndices de este array y sus
valores son los que puedes ver en Funcionalidad Sintaxis Devuelve
el ejemplo. $s=getdate();
Devuelve un array asociativo Array
echo $s;
getdate(nmero)
Este ndice devuelve los segundos de la hora actual echo $s[seconds] 11
Interpreta el nmero como una Este ndice devuelve los minutos de la hora actual echo $s[minutes] 15
fecha Unix Each (segundos
Este ndice devuelve la hora de la hora actual echo $s[hours] 21
transcurridos desde el da 1 de
Enero de 1970) y devuelve un Este ndice devuelve el da del mes actual echo $s[mday] 21
array asociativo con los valores Este ndice devuelve el n del da de la semana echo $s[wday] 3
relativos a esa fecha.
Este ndice devuelve el n del mes echo $s[mon] 6
Los ndices de este array y sus
valores son idnticos a los de Este ndice devuelve el ao echo $s[year] 2006
getdate() y puedes verlos en el Este ndice devuelve n del da en el ao actual echo $s[yday] 171
ejemplo.
Este ndice devuelve el da de la semana echo $s[weekday] Wednesday
microtime() Este ndice devuelve el nombre del mes echo $s[month] June
time()
getdate(nmero)
Esta funcin devuelve la hora
actual en segundos expresada en Ejemplos de getdate(nmero)
tiempo Unix. Funcionalidad Sintaxis Devuelve
Cuando el parmetro da es cero Este ndice devuelve el nombre del mes echo $s[month] January
devuelve el ltimo da del mes
anterior, pero si pasamos cero
como parmetro de mes nos dar
un error. mktime()
Ejemplos de mktime()
H Min Sec Mes Da Ao Horario Tiempo Unix Fecha
23 12 57 6 16 1973 0 109116777 00:12:57 17-Jun-1973
23 12 57 6 16 1973 1 109116777 23:12:57 16-Jun-1973
25 12 57 6 16 1973 1 109123977 01:12:57 17-Jun-1973
23 97 57 6 16 1973 1 109121877 00:37:57 17-Jun-1973
23 12 57 14 16 1973 1 130284777 22:12:57 16-Feb-1974
23 12 57 14 0 1973 1 128902377 22:12:57 31-Jan-1974
En los ejemplos puede verse como para valores fuera de rango (mes mayor de 12,
minutos mayor de 60, etctera) la funcin realiza la correccin correspondiente.
Se trata de un sistema de cuenta As que, para tu conocimiento y efectos pertinentes, hoy da 21 -6-2006 estamos
de das que tiene su origen en el 1 celebrando el da juliano nmero 2453908.
de Enero del ao 4713 a.C. y
que acabar el 31 de Diciembre jdtogregorian(n de das julianos)
de 3267.
Esta funcin devuelve en fecha gregoriana con formato: mes, da y ao el da
Este ciclo es producto de
juliano pasado como parmetro.
multiplicar tres ciclos menores:
uno de 28 aos denominado solar,
Por si quieres ir preparando las celebraciones del 2.500.000 da juliano debes saber
otro de 19 aos, que incorpora las que coincidir con la fecha 8/31/2132
fases lunares y uno de 15 aos
denominado de indiccin.
jdtojulian(n de das julianos)
El da juliano es el nmero
resultante de contar los das Con esta funcin puedes obtener la fecha juliana a partir de un valor de la Cuenta
transcurridos desde la fecha de Das Juliana .
definida por Scaliger como
comienzo del ciclo. Este script de PHP
Calendario juliano <? echo jdtojulian(gregoriantojd (date("n"), date("j"), date("Y"))) ?>
El emperador romano Julio Cesar nos devuelve la fecha actual segn el calendario juliano.
orden en el ao 44 a.C. la
reforma del calendario. Sustituy Para que sepas en que da vives, hoy es 6/8/2006 segn el calendario juliano.
el lunar adoptando, con
modificaciones, uno solar de
origen egipcio que data del 4000
juliantojd(mes,da,ao)
a.C.
Convierte a Cuenta de das Julianos la fecha pasada (mes, da y ao) del
Con la asesora de Sosgenes de
calendario juliano.
Alejandra fij la duracin de cada
ao en 365,25 das, insertando
Por ejemplo <? echo juliantojd(7,25,2001) ?> nos devolver 2452129 que
un da suplemen- tario en
corresponde a la cuenta de das correspondiente a la fecha 25/7/2001 expresada segn
febrero cada cuatro aos, -bis
sextus dies ante calendas el calendario juliano.
Martii- (dos sextos das antes de
las calendas de marzo), haciendo
bisiestos a todos los aos cuyo
jdtojewish(n de das julianos)
nmero de orden sea divisible por
cuatro. Esta funcin nos devuelve la fecha (mes, da y ao) segn el calendario judo a
partir de una fecha expresada en das julianos.
Calendario gregoriano
<? echo jdtojewish (gregoriantojd (date("n"), date("j"), date("Y"))) ?>
A lo largo la Edad Media se sigui
manteniendo en gran parte de
Europa el calendario juliano con la nos dar la fecha actual segn el calendario judo que es: 10/25/5766.
nica adaptacin de fijar la fecha
de referencia de la cuenta de aos
en el nacimiento de Cristo. jewishtojd(mes,da,ao)
Pero dado que la duracin real del
ciclo de translacin de la tierra Nos devuelve el da juliano correspondiente a una determinada fecha del calendario
alrededor del sol es de 365,2422 judo.
das solares medios, el calendario
juliano con aos de 365,25 das Por ejemplo:
empezaba a acumular un error
importante. <? echo jdtogregorian(jewishtojd(7,21,5758)) ?>
El Papa Gregorio XIII realiz la
correccin en el ao 1582. Se nos devolver 3/19/1998 que es la fecha gregoriana correspondiente al da 21 del
descontaron diez das y es por eso sptimo mes del ao 5758 segn el calendario judo.
que en 1582, al cuatro de octubre
le sigui el da quince (viernes).
jdtofrench(n de das julianos)
Para evitar sucesivos desfases se
modificaron las condiciones de los
aos bisiestos que, en lo sucesivo, Esta funcin nos devuelve la fecha segn el calendario republicano francs
habran de cumplir la condicin de correspondiente al da juliano especificado como parmetro.
que su ordinal sea divisible por 4 y
que no acabe en 00 con la <? echo jdtofrench (gregoriantojd (5, 7, 1796)) ?>
excepcin de los mltiplos de 400
que tendran condicin bisiestos.
nos dar la fecha del calendario republicano francs que se corresponde con el 7 de
Calendario judo Mayo de 1796 (gregoriano) que segn parece es: 8/18/4.
La era juda comienza a contar Slo convierte fechas comprendidas entre los aos 1 y 14 (fechas Gregorianas del 22
desde un supuesto ao de la de septiembre de 1792 al 22 de septiembre de 1806) que se corresponden con el perodo
creacin del mundo, que se calcula
de vigencia oficial de este calendario.
sumando las edades de las
distintas generaciones men-
cionadas en la Biblia. frenchtojd(mes,da,ao)
El ao judo se corresponde con el
cristiano sumndole a ste 3.760 Convierte una fecha del calendario republicano francs en su equivalente en das
aos. julianos.
El ao judo es solar como el Por ejemplo:
cristiano, pero sus meses son
lunares, por lo que cada dos o tres <? echo jdtogregorian(frenchtojd(6,7,8)) ?>
aos tiene que aadirse un mes
bisiesto para adecuar al ao solar
el cmputo de los meses lunares. nos devolver 2/26/1800, que es la fecha gregoriana correspondiente al da 7 del
sexto mes del ao 8 segn el calendario republicano francs.
Calendario
republicano francs Igual que la funcin anterior slo convierte fechas comprendidas entres los aos 1 y 14
El Calendario Republicano fue del calendario francs.
adoptado por la Convencin
Francesa partiendo de las
propuestas tcnicas formuladas
jdmonthname(da juliano, calendario)
por el matemtico Lagrange.
Devuelve del nombre del mes correspondiente al da juliano en el calendario
Es un intento de adaptar el sealado.
calendario al sistema decimal y
eliminar referencias religiosas.
Ejemplos de jdmonthname()
El comienzo del ao coincida con Fecha Gregoriano Juliano Republicano
el da 22 de Septiembre, Gregoriano Juliano Judo
gregoriana abreviado abreviado francs
equinoccio de otoo, y se fij su
da uno del ao uno el 22 de 3/1/1803 Jan January Dec December Tevet Nivose
Septiembre de 1792, da de la 3/2/1803 Feb February Jan January Shevat Pluviose
proclamacin de la Repblica. 3/3/1803 Mar March Feb February AdarI Ventose
Consta 12 meses de 30 das, a los 3/4/1803 Apr April Mar March Nisan Germinal
que se aaden cinco das 3/5/1803 May May Apr April Iyyar Floreal
complementarios (seis en los aos
3/6/1803 Jun June May May Sivan Prairial
que son divisibles por 4 y no por
100) que son festivos y no se 3/7/1803 Jul July Jun June Tammuz Messidor
asignan a ningn mes. 3/8/1803 Aug August Jul July Av Thermidor
Los meses se dividen en tres 3/9/1803 Sep September Aug August Elul Fructidor
dcadas de 10 das. 3/10/1803 Oct October Sep September Tishri Vendemiaire
El calendario fue de aplicacin civil 3/11/1803 Nov November Oct October Heshvan Brumaire
en Francia y sus colonias 3/12/1803 Dec December Nov November Kislev Frimaire
americanas y africanas hasta
Parmetro
1806. calendario
0 1 2 3 4 5
Da de Pascua
Los parmetros sealados en la fila inferior son los correspondientes a los tipos de
El Da de Pascua fue fijado en el nombres de mes sealados en los encabezados de la tabla.
Concilio de Nicea (ao 325) como
el domingo siguiente a la primera
luna llena posterior al equinoccio easter_date(ao)
de Primavera.
Este equinoccio se supone que Devuelve -en tiempo Unix- la media noche del da de Pascua del ao establecido
siempre coincide con el 21 de como parmetro.
marzo.
Esta funcin slo es vlida cuando los valores del ao estn comprendidos entre 1970 y
El algoritmo que usa PHP para su 2037 (tiempo UNIX).
clculo se basa en el que
desarroll Dionisio Exiguo en el El script echo date( "j-n-Y", easter_date(2006)) nos seala que la Pascua del ao 2006
ao 532.
ha sido el da 16-4-2006.
Para los aos anteriores a 1753,
(calendario Juliano) usa un ciclo easter_days(ao)
simple de 19 aos para calcular las
fases de la luna.
Devuelve el nmero de das del perodo comprendido entre el 21 de marzo y el da
En los aos posteriores a esa fecha de Pascua. Si no se especifica el ao, se asume el actual.
(Calendario Gregoriano) se aaden
dos factores de correccin que No tiene las limitaciones de la funcin anterior y es aplicable a aos fuera del intervalo de
tratan de hacer ese ciclo ms tiempo UNIX.
preciso.
El script easter_days(2006) nos seala que la Pascua del ao 2006 ha sido 26 das
despus del 21 de Marzo.
Cuidado!
Clases y objetos
El ejemplo ms simple
Aunque PHP no es un lenguaje En este ejemplo podemos ver como utilizar una clase para definir una plantilla que va a
orientado a objetos, s tiene multiplicar siete por ocho y que nos va a devolver el resultado de esa operacin cada vez que
recursos que permiten definir sea invocada.
clases y construir objetos.
La sintaxis es la siguiente:
En este ejemplo puedes observar cmo al invocar dos veces a $objeto el valor que nos devuelve
es el resultado de la ltima llamada y tambin como se pueden crear dos objetos distintos.
class nombre {
....
... definicin de variables.... <?
.... class Multiplica{
.. constructores (opcional)... var $resultado;
.... function curratelo($a,$b){
.. definicin de funciones... $this->resultado=$a*$b;
.... }
} function imprimelo(){
Vayamos por partes.
echo $this->resultado,"<br>";
}
Dentro de una clase podemos }
definir las variables que sern $objeto= new Multiplica;
utilizadas por sus funciones $objeto->curratelo(7,3);
internas y a las que es posible (no $objeto->curratelo(11,4);
es imprescindible hacerlo) asignar $objeto1= new Multiplica;
valores. $objeto1->curratelo(-23,11);
Para definir una variable es $objeto->imprimelo();
obligatorio anteponer var a su $objeto1->imprimelo();
nombre y en el caso de que ?>
tratemos de asignarle un valor,
bastar con poner detrs del
nombre el signo = seguido del Ver ejemplo71.php
valor.
var $pepe="Jose"
<?
es una sintaxis vlida, pero class Multiplica{
var $resultado;
$pepe="Jose" var $indice=0;
no lo es, le falta el var y si lo
function curratelo($a,$b){
escribimos as nos dar un error.
$this->resultado[$this->indice]=$a*$b;
Ms adelante hablaremos de los $this->indice++;
constructores, pero dado su }
carcter opcional veamos antes las
funciones. function imprimelo(){
foreach($this->resultado as $valor){
Las funciones definidas dentro de echo $valor,"<br>";
las clases tienen una sintaxis
}
idntica al resto de las funciones
PHP con una salvedad importante:
}
Reiterando
llamadas a objetos
<?
Si hacemos varias llamadas a una Class Operaciones {
funcin utilizando el mismo objeto var $inicializada=32;
los resultados se van var $num1;
sobrescribiendo sobre los de la var $num2;
llamada anterior. var $suma;
Si queremos conservar varios
var $diferencia;
resultados obtenidos de la var $producto;
aplicacin de la misma funcin var $cociente;
tenemos dos opciones: var $contador=0;
function Operaciones ($val1=45,$val2=55){
Crear varios objetos
$this->contador +=1;
Utilizar arrays $c=$this->contador;
$this->num1[$this->contador]=$val1;
$this->num2[$c]=$val2;
En los ejemplos podemos ver
$this->suma[$c]=$val1+$val2;
ambos supuestos.
$this->diferencia[$c]=$val1-$val2;
$this->producto[$c]=$val1*$val2;
Constructores $this->cociente[$c]=$this->inicializada*$val1/$val2;
}
Cuando se define una funcin cuyo
nombre es idntico al de la clase
que la contiene recibe el nombre function imprime(){
de constructor. print "<table align=center border=1>";
print "<td>Num 1</td><td>num2</td><td>Suma</td>";
Esa funcin -el constructor- se
print "<td>Diferencia</td><td>Producto</td><td>Cociente</td><tr>";
ejecuta de forma automtica en el
momento en que se define un foreach($this->num1 as $clave=>$valor){
nuevo objeto (new) print "<td align=center>".$valor."</td>";
print "<td align=center>".$this->num2[$clave]."</td>";
Segn como est definido, el print "<td align=center>".$this->suma[$clave]."</td>";
constructor puede ejecutarse de print "<td align=center>".$this->diferencia[$clave]."</td>";
distintas formas: print "<td align=center>".$this->producto[$clave]."</td>";
print "<td align=center>".$this->cociente[$clave]."</td><tr>";
Con los valores predefinidos en
las variables de la clase.
}
print "</table>";
Mediante la asignacin de
valores preestablecidos en los }
propios parmetros de la funcin }
constructor. $objeto= new Operaciones;
En el ejemplo puedes ver la
sintaxis de esta forma en la que se
for ($i=1;$i<11;$i++){
for ($j=1;$j<11;$j++){
le asignan los valores 3 y 7 a las
$objeto -> Operaciones($i,$j);
variables $a y $b.
}
En el mismo ejemplo puedes ver }
tambin la utilidad aadida del
constructor. $objeto-> imprime();
PHP tambin tiene la posibilidad de Para que el constructor de la clase padre sea ejecutado desde la clase extendida tiene que ser
crear clases extendidas cuya invocado expresamente.
virtud es poder disponer tanto de
variables y funciones propias como
de todas las variables y funciones <?
de la clase padre. class Multiplica{
function Multiplica(){
Para crear clases extendidas se
print $this->factor1*$this->factor2."<br>";
requiere utilizar la siguiente
sintaxis:
print "Esto est en el constructor de la clase padre<br>";
}
class nuev extends base { }
....
... definicin de variables.... class MeSeOlvido extends Multiplica{
....
.. constructores (opcional)... var $divisor=5;
.... function MeSeOlvido(){
.. definicin de funciones...
print $this->factor1*$this->factor2/$this->divisor."<br>";
....
}
}
}
Como habrs podido deducir nuev
es el nombre de la nueva clase (la $objeto= new MeSeOlvido;
extendida), base es el nombre de
la clase padre y extens es la $objeto->Multiplica();
palabra clave que indica a PHP que ?>
se trata de una clase extendida.
get_class_methods(clas)
Ver ejemplo77.php
Devuelve un array conteniendo los
valores de todos los mtodos Ejemplo de utilizacin de ::
(funciones) definidas en la clase
clas.
<?
get_object_var(obj) class A {
function ejemplo() {
Devuelve todas las variables (y
sus valores) contenidas en el echo "Este es el resultado de la funcin ejemplo<br>";
objeto obj. }
}
La llamada :: # llamo a la funcion sin crear un nuevo objeto
# usando ::
PHP permite llamar a una funcin A::ejemplo();
definida en una clase sin
necesidad de crear un objeto. #ahora creo el objeto $b y llamo a la funcin
La sintaxis es la siguiente:
$b = new A;
clase :: funcion() $b->ejemplo();
?>
donde clase es el nombre de una
clase y funcion() es una funcin
definida dentro de esa clase. ejemplo78.php
Su funcionalidad es la misma que
si escribiramos:
Mtodos con el mismo nombre
$nombre = new clase
Utilizacin de
ficheros externos
Los ficheros a incluir
PHP dispone de funciones que Este primer ejemplo de fichero a incluir contiene nicamente texto y etiquetas HTML
permiten insertar en un docu- pero no contiene ninguna llamada a ninguna funcin PHP, ni tampoco ningn script de
mento una parte o la totalidad de este lenguaje. Le hemos guardado con dos extensiones: ejemplo1.inc.php y ejemplo1.
los contenidos de otro. Esta opcin inc.
resulta muy interesante, tanto
desde el punto de vista operativo Si pulsas sobre las opciones Ver ejemplo podrs comprobar que los resultados de
como en lo relativo a la seguridad. visualizacin son distintos dependiendo de la extensin de cada fichero.
Pueden incluirse ficheros con Este otro fichero que tambin hemos incluido con dos extensiones contiene
cualquier extensin aunque es funciones PHP que pueden ser invocadas desde cualquier otro documento PHP.
muy habitual utilizar archivos con
extensin .inc.php. Dado que las funciones contienen etiquetas HTML al abrir -mediante el navegador- el
documento con extensin .inc sern interpretadas y se visualizarn parte de los
La primera parte (inc) nos contenidos. Cuando lleva extensin .php se visualizar una pgina en blanco ya que esas
permitir identificar este tipo de etiquetas estn contenidas en funciones que no son invocadas desde el propio script.
ficheros mientras que la extensin
php obligara a que (si un usuario
malicioso pretende visualizar el <?
contenido del fichero) fuera function Encabezado() { ?>
interpretado por PHP y, como <HTML>
consecuencia de ello, solo <head>
devolvera el resultado sin permitir <title>
la visualizacin de informaciones Pruebas con la funcin include
privadas (contraseas por </title>
ejemplo) que pudiera contener. </head>
Este tipo de ficheros pueden <BODY>
contener: texto, etiquetas HTML y <center><img src="./images/cabina.jpg"><br>
funciones. <font size=6 face="Times" color="#0000ff">Pruebas PHP</font><br>
<hr width=75%>
Si no contiene funciones se podr <? } ?>
insertar tantas veces como se
invoque y se insertar, adems, <? function Pie() { ?>
todo su contenido tal como puedes
<center><hr width=50%>
ver en el ejemplo.
<font size=2 face="Arial" color="#ff0000">Luchando con PHP</font>
Si el fichero contiene funciones <hr width=50%></center>
solo podr ser invocado una vez </body>
ya que si se hiciera una segunda </html>
llamada se producira un error por <? } ?>
duplicidad en los nombres de las
funciones. <? function Calcula($a,$b) {
return $a*$b;
Como vers en el ejemplo, es
posible incluir cualquier tipo de
} ?>
funciones.
Tanto las de la forma:
.....
... cdigo HTML ... Incluyendo ficheros
......
<? } ?> Aqu tienes el cdigo de un documento en el que se invocan mediante la funcin include
los dos documentos anteriores y se ejecutan sus funciones.
con las que se pueden incluir
porciones de cdigo HTML en
cualquier script, como las del tipo: <!-- empezaramos incluyendo el fichero que contiene
las funciones. No escribira nada hasta que las
function nombre { funciones que contiene no fueran invocadas //-->
<? include("ejemplo2.inc.php") ?>
..... <!-- Insertaremos un script PHP que invoque
... instrucciones PHP ...
la funcin encabezado. Debe llevar las etiquetas
......
de apertura y cierre <? y ?> de PHP //-->
} <? Encabezado() ?>
<!-- Insertaremos cdigo HTML
que permiten invocar funciones segn nuestra conveniencia //-->
repetitivas a partir de cualquier Aqu ira el contenido de la pgina<br>
documento PHP. .... esto es texto HTML................<br>
Definidas las funciones en el ...........................<br><br><br>
fichero a incluir y colocado al <!-- Incluimos el fichero ejemplo1.inc.php y dado que no contiene
comienzo de la pgina un script ninguna funcin, insertar aqu todo su contenidos //-->
que contenga el include y la ruta <? include("ejemplo1.inc.php") ?>
de ese fichero, bastar con invocar <!-- Insertaremos ms codigo HTML -->
cualquiera de las funciones, en ....................<br>
cualquier punto del documento, ...........................<br><br><br>
para que esa llamada sea <!-- Incluimos nuevamente el fichero ejemplo1.inc.php Puede repetirme
sustituida por el resultado de la la inclusin porque no contiene funciones
ejecucin de la funcin.
si las contuviera habra un conflicto de duplicidad
porque una funcion no puede estar definida dos veces
Como es lgico, solo sern
visualizados en el navegador del con el mismo nombre. La instruccin include
cliente los resultados de la como en todos los casos deber ir dentro de un script PHP
ejecucin de las funciones que y por tanto entre <? y ?> //-->
hayan sido invocadas. <? include("ejemplo1.inc.php") ?>
<!-- Ahora ejecutaremos la funcion PHP Calcula() pasando como
parmetros 7 y 9. El return de la funcin nos devolver
La funcin require()
el resultado que imprimiremos aqu //-->
Tiene la misma sintaxis que <? print "Aqu va el resultado de la multiplicacin: ".Calcula(7,9); ?>
include y una funcionalidad <!-- Por ultimo invocaremos la funcin Pie() -->
similar, aunque con algunas
<? Pie() ?>
diferencias.
Los errores de ese tipo puede El resultado de este otro ejemplo es idntico al anterior. Slo hemos sustituido
evitarse usando las funciones: include_once por require_once, que tiene una funcionalidad similar a la anterior.
include_once("fichero")
y <? require_once("ejemplo2.inc.php") ?>
require_once("fichero") <? Encabezado() ?>
Aqu ira el contenido de la pgina<br>
que a diferencia de include y ....................<br>
requiere van a impedir que un ...........................<br><br><br>
mismo fichero pueda incluirse dos <? require_once("ejemplo1.inc.php") ?>
veces. ....................<br>
En los ejemplos vas a poder ....nada de aqui en adelante ...<br><br><br>
comprobar que no aparece el <? require_once("ejemplo2.inc.php") ?>
mensaje de error cuando se utiliza <? require_once("ejemplo1.inc.php") ?>
esta funcin y que el texto que
anteriormente era incluido dos
veces ahora solo aparece una vez.
Ver ejemplo81.php
include("C:\Apache\sg\fichero") En este enlace puedes comprobar los resultados de la aplicacin de estas funciones que,
como vers, son idnticos a los que hemos visto en el tema Funciones de fecha con la
salvedad de que en este caso se admiten fechas anteriores a 1970 y tiempos Unix
negativos.
Utilizacin de ficheros
Funcin fopen()
externos En esta tabla tienes los parmetros modo de la funcin fopen de apertura de ficheros.
Para crear o modificar ficheros se Abre el fichero en modo lectura y escritura y coloca el puntero al comienzo del fichero, reduce
w+ su tamao a cero y si el fichero no existe intenta crearlo
utiliza la instruccin:
Abre el fichero en modo escritura y coloca el puntero al final del fichero y si no existe intenta
$f1=fopen(fichero,modo) a crearlo
$f1 es una variable que recoge el Abre el fichero en modo lectura y escritura y coloca el puntero al final del fichero y si no existe
a+ intenta crearlo
identificador del recurso, un valor
importante (ser utilizado para
referirnos a este fichero en Un fichero de pruebas
instrucciones posteriores), fichero
es el nombre (con extensin) del Hemos creado un fichero llamado domingo.txt para poder utilizarlo en los ejemplos.
fichero a abrir o crear y deber
Su contenido es exactamente el siguiente (incluidos los saltos de lnea):
escribirse entre comillas, y modo,
que es una cadena que debemos
poner entre comillas, el indicador Esto es un ejemplo para comprobar
del modo de apertura elegido. si funcionan o no los saltos de linea
en un documento de texto
En la tabla de la derecha hemos
que ser leido desde php
enumerado las opciones de ese
parmetro.
$var=file(fichero) <?
# Abrimos el fichero en modo lectura
Crea $var un array escalar $f1=fopen("domingo.txt","r");
cuyos elementos tienen como # Al anteponer echo a fpassthru
valores los contenidos de cada una # NOS APARECERA AL FINAL EL TAMAO DEL FICHERO
de las lneas del fichero. echo fpassthru($f1),"<br>";
Una lnea termina all donde se /* Abrimos de nuevo el fichero
haya insertado un salto de lnea RECUERDA QUE FPASSHRU LO CIERRA AUTOMATICAMENTE
en el fichero original. DESPUES DE EJECUTAR LA INSTRUCCIN */
$f1=fopen("domingo.txt","r");
Lectura de ficheros # Este bucle nos escribir cada una de las
con apertura previa #lineas del fichero
while(!feof($f1)){
Para la utilizacin de estas
funciones los ficheros han de ser $z=fgets($f1,4000);
abiertos en un modo que permita echo $z,"<br>";
la lectura. }
# Situamos el puntero
La funcin que permite la lectura #al comienzo del fichero
completa del fichero es: rewind($f1);
# Reescribimos el fichero
fpassthru($f1)
while(!feof($f1)){
Esta funcin presenta algunas $z=fgets($f1,4000);
peculiaridades importantes: echo $z,"<br>";
}
Cierra el fichero de forma # Situamos de nuevo el puntero
automtica despus de la lectura. #al comienzo del fichero
Por esa razn, si se escribe la
rewind($f1);
funcin fclose a continuacin de
# Situamos el puntero
fpassthru, se produce un error.
#sealando el byte nmero 15 del fichero
Si el resultado se recoge en una fseek($f1,15);
variable, o si va precedido de # Releemos el fichero
echo, adems de escribir el #ahora la primera linea estar incompleta
contenido del mismo, aadir el #LE FALTARAN LOS 15 PRIMEROS CARACTERES
nmero de bytes que indican su while(!feof($f1)){
tamao. $z=fgets($f1,4000);
fgets($f1,long) echo $z,"<br>";
}
Extrae del fichero sealado por el # volvemos el puntero al comienzo del fichero
$f1 una cadena que comienza rewind($f1);
en la posicin actual del puntero #leemos la primera linea
y cuya longitud est limitada por $z=fgets($f1,4000);
el menor de estos tres valores: echo $z,"<br>";
El valor (en bytes) indicado en
# Determinamos LA POSICION ACTUAL DEL PUNTERO
long. echo ftell($f1),"<br>";
# Cerramos el fichero
La distancia (tambin en bytes) fclose($f1);
desde la posicin actual del echo "_________________________________________<br>";
puntero hasta el final del fichero. # leemos el fichero y lo presentamos
# en diferentes modalidades
La distancia que hay entre la
$pepe=readfile("domingo.txt");
posicin actual del puntero y el
readfile("domingo.txt");
primer salto de lnea. echo $pepe, "<br>";
fgetc($f1) #leemos el fichero y lo recogemos
#en un array
Extrae el caracter siguiente al $z=file("domingo.txt");
sealado por la posicin actual del #Al presentar la variable solo
puntero. #nos aparecer la palabra array
echo $z,"<br>";
Escribir en un fichero # presentamos el contenido del array
foreach($z as $linea=>$texto) {
echo "Linea: ",$linea," Texto: ",$texto,"<br>";
Una vez abierto un fichero -en
modo que permita escritura- la };
funcin PHP que nos permite # copiamos el fichero con mensaje de resultado
escribir en el es la siguiente: if (!copy("domingo.txt", "otrodomingo.txt")) {
print("Error en el proceso de copia<br>\n");
fwrite($f1,"texto",long) }else{
print "<br>Fichero copiado con exito";
donde: $f1 sigue siendo el
}
identificador de recurso, texto la
cadena de texto a insertar en el
# renombramos un fichero con mensaje de resultado
fichero y long el nmero mximo if (!rename("otrodomingo.txt", "otrolunes.txt")) {
de caracteres que han de print("Error en el proceso de renombrado<br>");
insertarse. }else{
print "<br>Fichero renombrado con exito";
Si la cadena de texto tiene menor }
o igual longitud que el parmetro unlink("otrolunes.txt");
long la escribir en su totalidad, echo "Ultima modificacin a las: ",date("h:i:s A",
en caso contrario slo escribir el
filemtime ("domingo.txt"))," del da ",
nmero de caracteres indicados.
date("j-n-Y", filemtime ("domingo.txt"));
Tambin es posible utilizar: echo "<br>El tamao del fichero es: ", filesize("domingo.txt"),"
bytes<br>";
fputs($f1,"texto",long) echo "<br>El fichero es tipo: ", filetype("domingo.txt")," <br>";
echo "<br>Saldr un 1 si el fichero existe: ",file_exists("domingo.txt");
que en realidad es un alias de la
?>
funcin anterior.
Atencin!
Ver ejemplo84.php
Estas funciones realizan la
insercin de la cadena a partir
de la posicin a la que apunte el
puntero en el momento de ser Los valores del array devuelto por la funcin stat
invocadas.
Indice Significado Sintaxis Resultado
Si el fichero ya existiera y
contuviera datos los nuevos datos 0 Dispositivo <? echo $d[0] ?> 2
se sobrescribiran sobre el 1 I node <? echo $d[1] ?> 0
contenido anterior.
2 Modo de proteccin de I node <? echo $d[2] ?> 33206
Para poder aadir contenidos a un
3 Nmero de enlaces <? echo $d[3] ?> 1
fichero el puntero deber apuntar
el final del fichero preexistente y 4 Id de usuario del propietario <? echo $d[4] ?> 0
estar abierto en un modo que
permita aadir contenidos.
5 Id de grupo del propietario <? echo $d[5] ?> 0
6 tipo de dispositivo si es un inode device * <? echo $d[6] ?> 2
Borrado de ficheros 7 Tamao en bytes <? echo $d[7] ?> 126
8 Fecha del ltimo acceso <? echo $d[8] ?> 1150840800
Para borrar ficheros se utiliza la
siguiente instruccin: 9 Fecha de la ltima modificacin <? echo $d[9] ?> 1119364802
10 Fecha del ltimo cambio <? echo $d[10] ?> 1150914775
unlink(fichero)
11 Tamao del bloque para el sistema I/O * <? echo $d[11] ?> -1
fichero ha de ser una cadena que
contenga el nombre y la extensin 12 Nmero de bloques ocupados * <? echo $d[12] ?> -1
del fichero y, en su caso, tambin Los valores sealados con * devuelven -1 en algunos sistemas operativos, entre ellos Windows
el path.
La funcin: <?
/* comprobamos si existe el fichero contador. Si existe
copy(fich1, fich2) leemos las visitas registradas e incrementamos su valor en una unidad
Copia el fichero fich1 (debe Si no existe, registramos 1 como valor de nmero de visitas*/
indicarse nombre y extensin) en if(file_exists("contador.txt")){
otro fichero cuyo nombre y /* abrimos el fichero en modo lectura y escritura (r+) con lo que
extensin se establecen en la el puntero se colocar al comienzo del fichero */
cadena fich2. $f1=fopen("contador.txt","r+");
# leemos el contenido del fichero
Esta funcin devuelve un valor $visitas=(int)(fgets($f1,10));
booleano indicando si la copia se
# lo aumentamos en una unidad
ha realizado con xito TRUE (1) o
FALSE (nul) si por alguna razn no
$visitas++;
ha podido realizarse la copia. # colocamos el puntero al comienzo del fichero para que
# al guardar en nuevo valor sobreescriba el anterior
rewind($f1);
Renombrar ficheros }else{
/*abrimos el fichero en modo lectura y escritura con (w+)
La funcin: de modo que se cree automaticamente al no existir*/
$f1=fopen("contador.txt","w+");
rename(fich1, fich2) #asignamos uno como valor a nmero de visitas
cambia el nombre del fichero fich1 $visitas=1;
(hay que poner nombre y }
extensin) por el indicado en la /* escribimos el nmero de visitas en el fichero. En cualquiera
cadena fich2. de los casos el puntero estar al comienzo del fichero, por tanto
cuando existan valores sern sobreescritos */
Tambin devuelve TRUE o FALSE.
fwrite($f1,$visitas,10);
Si tratamos de cambiar el nombre print("Esta pgina ha sido visitada ".$visitas." veces");
a un fichero inexistente nos dar
fclose($f1);
error.
?>
Funciones informativas
Ver contador
PHP dispone de funciones que nos
facilitan informacin sobre Guardar y leer datos transferidos mediante un formulario
ficheros. Algunas de ellas son las
siguientes: Aunque el modo ms habitual de guardar informacin suele ser los servidores de bases
file_exists(fichero) de datos (MySQL, por ejemplo) la utilizacin de ficheros ofrece interesantes posibilidades
de almacenamiento de informacin.
Esta funcin devuelve TRUE si el
fichero existe, en caso contrario Este es un ejemplo muy sencillo, en el que mediante un formulario tal como el que
devuelve FALSE. aparece en el recuadro puede transferirse y almacenarse la informacin en un fichero.
filesize(fichero)
<form name="fichero" method="post" action="escribe.php">
Devuelve el tamao del fichero <input type="text" name="nombre">
expresndolo en bytes. En caso de <input type="text" name="apellido">
que el fichero no existiera nos dar <input type="edad" name="edad">
un error. <input type="submit" value="enviar">
</form>
filetype(fichero)
Devuelve una cadena en la que se Los datos transferidos mediante un formulario como el anterior podran ser registrados
indica el tipo del fichero. En caso
y visualizados mediante un script como este:
de que el fichero no existiera nos
dar un error.
<?
filemtime(fichero) /*abrimos el fichero en modo a+ para permitir que
se cree en caso de no existir, que permita los modos lectura
Devuelve en tiempo Unix la
fecha de la ltima modificacin del y escritura y que escriba al final del fichero */
fichero. $f1=fopen("escribiente.txt","a+");
# hacemos un bucle para leer los valores transferidos
stat(fichero) # desde el formulario y recogidos en el array $_POST
foreach($_POST as $v){
Devuelve un array que contiene /* aadimos "\r\n" a cada valor para que se inserte
informacin sobre el fichero.
un salto de lnea y que cada valor sea recogido en
En la tabla de la derecha puedes una lnea distinta en el fichero
ver los contenidos asociados a Limitamos las entradas a 150 caracteres*/
cada uno de sus ndices. fwrite($f1,$v."\r\n",150);
}
Recogeremos en un array, que /* para comprobar que los nuevos datos han sido agregados
llamaremos $d, el resultado de la y visualizar el contenido integro del fichero situamos el
funcin stat aplicada sobre el
puntero interno al comienzo del mismo */
fichero domingo.txt.
rewind($f1);
Para ello vamos a utilizar la /* creamos un bucle que vaya leyendo todas las lneas
siguiente sintaxis: hasta encontrar el final del fichero */
while (!feof($f1)) {
$d=stat("domingo.txt") /* vamos leyendo el contenido de cada lnea del fichero
y aunque establecemos en 250 el nmero de carcteres
El contenido y significado de los
valores asociados a los ndices de
dado que los saltos del lnea aparecern antes
array $d son los que tenemos en sern ellos los puntos de interrupcin de cada lectura*/
la tabla de la derecha. $z = fgets($f1,250);
#presentamos el resultado de las lecturas
echo $z,"<br>";
Otras funciones }
# cerramos el fichero
Existen otras muchas funciones fclose($f1);
relacionadas con el manejo de ?>
ficheros y directorios, as como con
los permisos de acceso, etctera.
Para obtener los valores de fecha y hora, debers utilizar las funciones adodb a las que se
alude en la pgina en la que se trata la opcin Include.
Comprobacin de la
Requisitos de configuracin
configuracin Cuando publicamos en un hosting no tenemos acceso al fichero de configuracin php.
ini pero s podemos conocer su configuracin mediante el script info.php.
Antes de empezar con este tema
debemos comprobar cul es la Recordemos que ese fue nuestro primer script lo hemos creado y utilizado para
configuracin de nuestro php.ini. comprobar nuestra instalacin y lo hemos guardado con ese nombre en el root de
nuestro servidor C:\Apache\htdocs as que podremos acceder a l escribiendo como
Si por alguna circunstancia los direccin http://localhost/info.php.
valores no coincidieran con los que
tenemos aqu a la derecha,
tendramos que abrir php.ini y
La abundante lista que nos muestra info.php contiene las siguientes lneas (las
modificar aquellas directivas. podemos localizar fcilmente porque estn ordenadas alfabticamente), que en nuestro
caso configuracin por defecto tendrn los valores que vemos en la imagen.
Si te apetece, y como simple
experimento, podemos cambiar el
lmite del tamao mximo de
transferencia poniendo:
upload_max_filesize=500K
Mediante la funcin:
ftp_quit($x)
Gestin de directorios en
el servidor FTP
ftp_cdup($x) Tal como puedes ver en la imagen, la cadena devuelta por la funcin ftp_rawlist tiene dos
resultados distintos. La primera de las cadenas comienza por lo cual indica que se trata de
Nos situa en el directorio raz del
un archivo y documento. En el segundo de los casos ese primer carcter es d e indica que
servidor FTP.
se trata de un directorio.
ftp_pwd($x) Los nueve caracteres siguientes especifican los permisos de acceso a los ficheros y/o
directorios. Se subdividen en tres bloques de igual tamao que corresponden a los tres
Nos devuelve una cadena con el niveles de usuarios habituales en sistemas Unix/Linux (propietario, grupo y resto de
nombre del directorio actual. usuarios). Para nuestros propsitos bastar con que consideremos los privilegios del primer
bloque, es decir los del propietario.
ftp_chdir($x, nuevodir)
El primero carcter de cada bloque slo puede ser r . Si se trata de un fichero y est
Cambia el acceso actual al marcado con r indica que se permite el acceso a l en modo lectura y si se trata de un
directorio especificado por la directorio indica que est permitida la visualizacin de su contenido.
cadena nuevodir, en caso de que El segundo de los caracteres (puede ser w ) indica, si se trata de un fichero, que est
exista. permitida la modificacin del fichero. Cuando se trata de un directorio significa que se
pueden aadir o suprimir ficheros.
ftp_pwd($x)
El tercero de los caracteres indicara (x ) que el fichero -si se trata de un ejecutable-
Indica el nombre del directorio al tiene permisos para ser ejecutado. Cuando se trata de un directorio, indica que pueden
que estamos accediendo en este conocerse los atributos de los ficheros que contiene y que est permitido el acceso a l y a
momento. sus subdirectorios.
El signo significa la negacin del atributo en todas las opciones.
ftp_mkdir($x, nomdir) El siguiente carcter, el nmero 1, est asociado con sistemas Linux/Unix e indicara el
nmero de vnculos duros contra el archivo, que es otra cosa que una forma de asignar
Crea un subdirectorio en el
directorio actual cuyo nombre es nombres distintos a un mismo fichero.
el nombre indicado en la cadena Los dos grupos siguientes -parece que no demasiado relevantes para nuestros
nomdir. propsitos- ser los nombres del usuario y grupo al que pertenece.
A continuacin aparece el tamao del archivo (cero si se trata de un directorio), la fecha
ftp_rmdir($x, nomdir) y hora de su creacin y el nombre del archivo o directorio.
Borra el directorio especificado en
la cadena nomdir. Una miscelnea de las funciones FTP
Para que un directorio pueda ser
borrado se requiere que est <?
vaco y que est incluido dentro # Conexin con el el servidor ftp
del directorio actual. if(!$x=@ftp_connect ("localhost",21)){
echo "No se activo lo conexin FTP";
exit();
Informacin sobre los
}
contenidos de los
# Identificacin de usuario
directorios if(!@ftp_login($x,"admin","admin")){
del servidor FTP echo "Error en login o password";
exit();
ftp_nlist($x, nomdir) }
/* comprobamos el nombre del directorio actual del servidor FTP
Devuelve una array escalar con los que ser el root correspondiente al usuario registrado */
nombres de los ficheros y
echo "El directorio actual es: ",ftp_pwd($x),"<br>";
subdirectorios contenidos en el
directorio que se indica en nomdir. /* intentamos cambiar a un subdirectorio indicando la ruta absoluta
partiendo del directorio root del usuario actual.
Si se trata del directorio actual, el En caso de error (ruta incorrecta o falta de permisos de accesos
parmetro nomdir puede nos dara un mensaje de error. Si el cambio tiene xito nos indicara
especificarse como una cadena el nombre del nuevo directorio */
vacia (""). if(!@ftp_chdir($x,"/Apache/htdocs")){
print "No tienes permisos de acceso a este directorio<br>";
Si la informacin se refiere a un
subdirectorio del actual bastar
print "o la ruta es incorrecta.Comprueba los datos!<br>";
poner su nombre como valor del }else{
parmetro nomdir. echo "Hemos cambiado al directorio: ",ftp_pwd($x),"<br>";
}
En cualquier otro caso nomdir # comprobamos el nombre del sistema operativo del servidor de FTP
contendr la ruta completa. echo "El S.O: del servidor FTP es: ",ftp_systype ($x),"<br>";
/* obtenemos una matriz conteniendo la lista de ficheros y directorios
ftp_rawlist($x, nomdir)
del subdirectorio "cursoPHP/images" del del directorio actual*/
Igual que la funcin anterior, $lista=ftp_nlist($x,"cursoPHP/images");
ftp_rawlist tambin devuelve un # escribimos la lista de ficheros contenidos en ese directorio
array escalar, pero en este caso echo "Lista de ficheros contenidos en el subdirectorio cursoPHP/
con informacin ampliada. images<br>";
foreach ($lista as $valor){
Este array detalla, adems del echo $valor,"<br>";
nombre del fichero, el tamao, el
}
tipo, la fecha de la ltima
modificacin y los permisos de # obtenemos una lista completa de los contenidos de ese subdirectorio
lectura y/o escritura. $lista=ftp_rawlist($x,"cursoPHP/images");
# ordenamos el array que contiene la lista anterior
sort($lista);
Transferencia de ficheros echo "Contenidos del subdirectorio cursoPHP/images<br>";
/* extrae los elementos del array eliminando los espacios repetidos
Las transferencias de ficheros
mediante la funcion preg_replace en la que \s+ indica uno o ms espacios
pueden realizarse en ambos que sern sustituidos por uno solo (' ') */
sentidos.
foreach($lista as $v){
Desde el servidor FTP $v=preg_replace('/\s+/', ' ', $v);
hasta el servidor HTTP # imprimimos la cadena completa
print "<br><BR><BR>".$v."<br>";
Mediante la funcin: # convertimos la cadena en un array
# utilizando los espacios como separadores
ftp_get($x,nloc,nrem,modo)
$extrae=explode(" ",$v);
se transfiere un fichero desde un # leemos los elementos del array y comentamos sus valores
servidor FTP hasta un directorio foreach($extrae as $indice=>$cont){
del servidor HTTP en el que se est switch($indice){
ejecutando PHP. case 0:
print "El elemento de indice".$indice." es: ".$cont."<br>";
La cadena nloc contiene el nombre if (substr($cont,0,1)=="d"){
con el que el fichero ser copiado
print "Es un directorio<br>";
en el directorio actual del servidor
}elseif(substr($cont,0,1)=="-"){
web y la cadena nrem contiene el
nombre (incluyendo el path) del print "Es un fichero<br>";
fichero que debe ser trasferido. }
if (substr($cont,1,1)=="r"){
El parmetro modo puede print "Tiene permisos de LECTURA<br>";
contener uno de estos valores: }elseif(substr($cont,1,1)=="-"){
FTP_ASCII o FTP_BINARY print "No tiene permisos de LECTURA<br>";
}
Desde el servidor HTTP
hasta el servidor FTP if (substr($cont,2,1)=="w"){
print "Tiene permisos de ESCRITURA<br>";
Para realizar transferencias en }elseif(substr($cont,2,1)=="-"){
sentido contrario al anterior se print "No tiene permisos de ESCRITURA<br>";
utiliza la siguiente sintaxis: }
break;
ftp_put($x,nrem,nloc,modo)
case 4:
Se comporta de forma idntica a la print "El tamao de este fichero es: ".$cont." bytes<br>";
funcin anterior. La cadena nrem break;
sigue siendo el nombre y el path case 8:
del servidor FTP (donde vamos a print "El nombre del fichero o directorio es: ".$cont."<br>";
copiar el fichero) y nloc contiene break;
el nombre del fichero en el }
servidor web (origen de la }
transferencia). }
/* creamos un subdirectorio (del directorio actual)
Modificacin de ficheros con nombre experimento anteponiendo @# para evitar mensajes de error
en el servidor FTP en caso de que ya existiera */
@ftp_mkdir($x,"experimento");
ftp_rename($x,nant,nnuevo)
/* copiamos el fichero enol.jpg desde el directorio que se indica
en el tercer parmetro (dentro servidor Apache)
Cambia el nombre del fichero nant al directorio del servidor FTP que se indica
por el indicado en la cadena en el segundo parmetro. Le ponemos por nombre lago_enol.jpg */
nnuevo. ftp_put($x, "/Apache/htdocs/experimento/lago_enol.jpg",
"../cursoPHP/enol.jpg",FTP_BINARY);
ftp_delete($x,fichero)
# obtenemos el tamao del fichero transferido
Elimina -en el servidor FTP- el echo "El tamao de fichero tranferidos es: ",
fichero indicado en la cadena ftp_size($x,"/Apache/htdocs/experimento/lago_enol.jpg")," bytes<br>";
fichero. /* escribimos la fecha de la ltima modificacin del fichero transferido
que coincidir con la fecha y hora en la que se realiz la transferencia.
Convertimos a formato de fecha convencional el tiempo UNIX que devuelve
Informacin sobre
la funcin ftp_mdtm */
ficheros del en el servidor
print "La fecha de modificacion del fichero es:";
FTP print date("d-m-Y H:i:s",
ftp_mdtm($x,"/Apache/htdocs/experimento/lago_enol.jpg"));
ftp_size($x,nomfile) # cambiamos el nombre del fichero lago_enol.jpg por lago_covadonga.jpg
# en el servidor FTP
Devuelve el tamao (en bytes) del
@ftp_rename($x,"/Apache/htdocs/experimento/lago_enol.jpg",
fichero que se indica en la cadena
nomfile.
"/Apache/htdocs/experimento/lago_covadonga.jpg");
/* creamos un enlace de descarga directa del fichero haciendo una llamada
ftp_mdtm($x,nomfile) mediante el protocolo ftp:// utilizando la sintaxis:
ftp://usuario:contrasea@nombre del servidor
Esta funcin devuelve la fecha de seguidos de la ruta (en el servidor FTP) y el nombre del fichero */
la ltima modificacin del fichero print "<BR><A href='ftp://admin:admin@localhost";
indicado en la cadena nomfile. Esta
print "/Apache/htdocs/experimento/lago_covadonga.jpg'> Descargar</a>";
fecha se indica en tiempo Unix.
/* transferimos al directorio del servidor Apache
indicado en el segundo parmetro (con el nombre que se indica
Ejercicio n 31 en el mismo) un fichero procedente del servidor FTP
cuyo nombre y ruta se indican en el tercer parmetro*/
Crea un formulario y un script ftp_get($x,"../cursoPHP/liborio.jpg",
mediante los cuales puedas "/Apache/htdocs/experimento/lago_covadonga.jpg",FTP_ASCII);
subir al directorio /* comprimimos un fichero alojado en el servidor Apache
Documentacion del servidor para transferirlo comprimido al servidor FTP */
FTP un fichero cualquiera. #empezamos leyendo el fichero y guardndolo en una cadena
$f1=fopen("../cursoPHP/cabina.jpg","r");
Utiliza el nombre de usuario while (!feof($f1)) {
y contrasea adecuados $cadena .= fgets($f1,1024);
para poder acceder al }
directorio indicado y evita fclose($f1);
que quede copia del fichero # comprimimos la cadena obtenida del fichero anterior
en el servidor Apache. $c1=gzencode($cadena,3,FORCE_GZIP);
# guardamos la cadena comprimida en un fichero
Intenta mejorar el script para $f=fopen("cabina.jpg.gz","w");
limitar el tamao del archivo fwrite($f,$c1);
y restringir la transferencia a fclose($f);
formatos *.jpg *.gif. /* al servidor el fichero comprimido. No es necesario indicar
la ruta actual ya que ha sido creado en el mismo directorio
en el que se est ejecutando el script */
ftp_put($x, "/Apache/htdocs/experimento/cabina.jpg.gz",
"cabina.jpg.gz",FTP_BINARY);
#eliminamos el fichero comprimido del servidor Apache
unlink("cabina.jpg.gz");
# cerramos la conexin con el servidor ftp
ftp_quit($x);
# establecemos un enlace de descarga para el fichero comprimido
print "<BR><A href='ftp://admin:admin@localhost";
print "/Apache/htdocs/experimento/cabina.jpg.gz'>Descarga comprimido</a>";
?>
ejemplo93.php
Funciones de compresin
Herramientas de compresin
zlib
Existen varias herramientas para compresin de ficheros. Las ms populares son las
funciones de la biblioteca bzip2 de Julian Seward que generan ficheros comprimidos que se
Algunas de esas funciones son
estas: reconocen por su extensin (bz2) y la funcin de zlib de Jean-loup Gailly y Mark Adler para
leer y grabar archivos comprimidos con extensin gz.
$f=gzopen(fich,mod, path)
En esta pgina veremos el uso de la segunda de las opciones. Empezaremos omprobando
Abre el fichero identificado por el en info.php que la opcin est activada. Deberemos ver algo como esto:
parmetro fich y lo hace en modo
especificado en el parmetro modo
r o w segn se trate de modo
lectura o escritura.
El parmetro path es opcional y En la versin de PHP que estamos utilizando esta opcin se activa por defecto y no es
puede contener un valor lgico necesario modificar ningn parmetro en php.ini.
(cero uno). Cuando el valor de
este parmetro es 1 permite Slo en el caso de utilizar versiones anteriores a PHP 4.2.3 sera necesario modificar el
incluir en el parmetro fich la ruta fichero php.ini descomentando la lnea que dice: extension=php_zlib.dll.
del directorio o subdirectorio
que alberga el fichero que
tratamos de abrir Ejemplo de compresin y lectura de un fichero
Si se incluye una ruta sin
En este ejemplo trataremos de utilizar las funciones de compresin comentadas al
especificar el valor 1 en el
parmetro path aparecer un error. margen. Si observas las formas de apertura de los ficheros vers que son similares a las
utilizadas para la gestin de ficheros. Los modos de apertura para escritura son: "w0" a
gzclose($f) "w9" siendo los valores de cero a nueve los indicadores de los niveles de compresin. Para
lectura debe usarse el modo "r" sin indicar ningn nivel de compresin.
Cierra el fichero asociado al
identificador de recurso $f. Esta
funcin devuelve TRUE en caso de <?
xito o FALSE si se produjera un # asignamos un nombre al fichero con extensin "gz"
error. $fichero ='prueba.gz';
# abrimos el fichero en modo escritura (w)
gzeof($f) # con el nivel mximo de compresin (9)
$f=gzopen($fichero,"w9",0);
Esta funcin devuelve 1 (TRUE) en
el caso de que el puntero apunte al $cadena="Este es el primer bloque de texto que hemos
final del fichero abierto e introducido en el fichero comprimido. ";
identificado mediante $f. $cadena .="Aadimos este segundo bloque";
Tambin devuelve TRUE en caso echo "<i>Esta es la cadena inicial:</i> ".$cadena."<br>";
de error. # escribimos (comprimida) la cadena en el fichero
Si el fichero estuviera abierto y el
puntero apunta a una posicin
distinta del final del fichero gzwrite($f,$cadena); # cerramos el fichero gzclose($f); #abrimos el fichero en modo
devolver FALSE. lectura $f=gzopen($fichero,"r"); echo "<i>Estos son los tres primeros caracteres de la
cadena:</i> "; # escribimos los tres primeros caracteres, el puntero (por defecto) #
gzseek($f,desplaza) apunta al comienzo de la cadena echo gzread($f, 3)."<br>"; # desplazamos el puntero
hasta el carcter n 8 gzseek($f,8); echo "<i>Estos son los seis caracteres siguientes al
Desplaza -dentro del fichero octavo:</i> "; # escribimos seis caracteres a partir del octavo echo gzread($f,
identificado por $f- el puntero -a
6)."<br>"; echo "<i>Ahora el puntero est en:</i> "; # buscamos la posicin actual de
partir de su posicin actual- la
cantidad de bytes indicados en el
puntero echo gztell($f)."<br>"; # movemos el puntero hasta el comienzo del fichero
parmetro desplaza gzrewind($f); echo "<i>Estos son los diez primeros caracteres de la cadena:</i> "; #
escribimos los diez primeros caracteres del fichero echo gzread($f, 10)."<br>"; #
gztell($f) volvemos el puntero al comienzo del fichero gzrewind($f); echo "<i>Escribimos el fichero
completo:</i> "; # con gzpasthru escribimos el fichero completo # el puntero est al
Devuelve la posicin actual del principio porque alli lo ha situado gzrewind # no necesitamos utilizar "echo" ni "print" ya
puntero.
que gzpassthru # escribe directamente el contenido del fichero gzpassthru($f); #
gzrewind($f) tenemos que volver a abrir el fichero ya que gzpassthru # se encarg de cerrarlo despus
de leerlo $f=gzopen($fichero,"r"); echo "<br><i>Aqu estar todo el fichero:</i> ";
Coloca el puntero al comienzo del gzpassthru ($f); # la funcin readgzfile abre el fichero, imprime su contenido y lo cierra
fichero echo "<br><i>Aqui se imprime la cadena completa usando readgzfile</i>: <br>";
readgzfile($fichero); /* con gzfile tambin se abre el fichero, pero ahora el contenido no
gzread($f, longitud)
se presenta directamente. Es recogido en un array. Para visualizarlo debemos imprimir el
Devuelve una cadena -despus de primer elemento del array. */ $z=gzfile($fichero); echo "<br><i>Este es el primer
descomprimida- de longitud igual a elemento (0) del array generado por gzfile</i>: ".$z[0]; # gzfile cierra el fichero. # No
la indicada en el parmetro podemos poner gzclose porque nos dara error ?>
longitud. La lectura comienza en
la posicin actual del puntero y comprime1.php
acaba cuando la longitud de la
cadena leida y descomprimida sea
igual al valor del parmetro Utilizando un directorio distinto
longitud o cuando se haya
alcanzado el final del fichero.
El ejemplo anterior est desarrollado para el supuesto que el script y el fichero comprimido
gzpassthru ($f) estn en el mismo directorio.
Esta funcin escribe en la salida Si quieres utilizar estas funciones utilizando ficheros alojados en un directorio distinto, solo
(no necesita la funcin echo) el tendrs que recordar que algunas funciones deben incluir el parmetro complementario 1.
contenido del fichero desde la Estos son las modificaciones que deberas efectuar:
posicin actual del puntero hasta
el final del fichero. Como es lgico,
si estuviera precedida de La variable que recoge el nombre del fichero debe incluir el path, por ejemplo:
gzrewind escribira el fichero $fichero ='/subdirectorio/prueba.gz'
completo.
La funcin gzopen debe incluir el tercer parmetro (path) con valor 1, por ejemplo:
$f=gzopen($fichero,"r",1);
Cuidado!
Tambin las funciones gzfile y readgzfile -que abren automticamente el fichero-
La funcin gzpassthru cierra debern incluir ese valor 1 como parmetro aadido. Por ejemplo: readgzfile
automticamente el fichero ($fichero,1) $z=gzfile($fichero,1)
despus de escribir su
contenido. Si pones gzclose
despus de esta funcin te Eleccin del grado ptimo de compresin
dar error y si quieres seguir
utilizando el fichero tendrs
Puede parecer -a primera vista- que la condicin ptima de compresin sera elegir el
que volver a abrirlo con la
nivel 9 y eso es cierto si tomamos nicamente en consideracin el tamao final del fichero
funcin gzopen.
comprimido. Sin embargo no existe una relacin lineal entre reduccin de tamao/nivel de
compresin. Sin que pueda considerarse ninguna referencia exacta -la compresin alcanzable
gzwrite($f, cadena, long) depende del contenido del fichero y en consecuencia no puede establecerse una relacin
funcional puede comprobarse experimentalmente que -aparentemente- a partir del grado 2 la
Esta funcin escribe en el fichero reduccin de tamao del fichero es mnima y que cuando se aumenta el grado de compresin
comprimido que se identifica por a niveles mximos (tratndose de ficheros de un cierto tamao) el tiempo de ejecucin
$f la cadena contenida en el
aumenta sustancialmente como consecuencia de la reiteracin de la ejecucin de los
parmetro cadena.
algoritmos de compresin.
Opcionalmente puede llevar el
tercer parmetro (longitud) en
cuyo caso solo escribir los
Compresin de cadenas
primeros longitud bytes de la
cadena. Si el parmetro longitud En este ejemplo utilizamos las tres funciones de compresin de cadenas as como las
existe y es mayor que la longitud opciones de descompresin y lectura de cada una de ellas.
de la cadena, insertar la cadena
completa.
<?
gzputs($f, cadena, long) # creamos una cadena de ejemplo
$cadena="Esta es la cadena a comprimir. Intentaremos que sea larga
Esta funcin es idntica a gzwrite. porque parece que si la hacemos muy corta en vez de reducirse
readgzfile($fichero,path) su tamao parece que aumenta. Y como sigue siendo enormemente
grande la cadena comprimida intentaremos hacerla aun mayor
Esta funcin abre de forma a ver que pasa ";
automtica el fichero indicado # comprimimos con la funcin gzcompress
como parmetro fichero, adems $c=gzcompress($cadena,9);
lo lee y lo escribe de forma echo "<br>".$c;
automtica sin necesidad de usar # descomprimimos con la funcin gzcompress
echo ni ninguna otra funcin de $dc=gzuncompress($c);
salida.
echo "<br>".$dc."<br>";
Si el fichero no est en el mismo # ahora utilizamos la funcin gzencode
directorio que el script -adems de $c1=gzencode($cadena,9,FORCE_GZIP);
incluir la ruta en la cadena fichero- echo "<br>".$c1."<br>";
es necesario aadir el segundo /* el resultado lo guardamos en un fichero con extensin gz
parmetro -path- con valor 1. pero abierto en modo "normal", es decir escribiendo
dentro del fichero la cadena "tal cual" fue devuelta
Comprimiendo cadenas por gzencode*/
$f=fopen("pepe.gz","w");
fwrite($f,$c1);
Las funciones anteriores permiten
fclose($f);
la creacin, lectura y modificacin
de ficheros comprimidos # abrimos el fichero anterior utilizando las funciones
# de lectura de fichero comprimidos
Sin embargo, existen otras $f=gzopen("pepe.gz","r");
funciones PHP que permiten readgzfile("pepe.gz");
comprimir cadenas. Aqu tienes gzclose($f);
algunas de ellas. # borramos el fichero una vez leido
unlink("pepe.gz");
gzcompress(cadena, nivel)
# otra opcin de compresin de cadenas utilizando la funcin
Esta funcin devuelve una cadena # gzdeflate
comprimida a partir de una $c2= gzdeflate($cadena,9);
original especificada en el parmet echo "<br><BR>".$c2;
ro cadena. El nivel de # con la funcin gzinflate podemos descomprimir la cadena
compresin (valores entre 0 y 9) # comprimida generada por gzdeflate
se especifica en el parmetro nivel. $dc2=gzinflate($c2);
echo "<br>".$dc2;
Las cadenas resultantes de esta
funcin pueden descomprimirse ?>
aplicando la funcin
gzuncompress que te comento
comprime2.php
ms abajo.
gzdeflate(cadena, nivel)
Economizando espacio en el servidor
Se comporta de forma idntica a la
funcin anterior. La nica salvedad
parece ser que utiliza un algoritmo Las opciones de compresin pueden permitirnos un cierto ahorro de espacio de servidor.
de compresin distinto. Las pginas HTML podran almacenarse comprimidas y ser llamadas a travs de un script de
descompresin que permita visualizarlas. En este ejemplo se efecta la compresin de una
Las cadenas resultantes de esta pgina web (una de las pginas de estos materiales guardada en formato HTML) cuyo
funcin tambin pueden tamao original es de 29.015 bytes. El fichero comprimido resultante ocupa 9.886 bytes.
descomprimirse aplicando la Como vers, el fichero se reduce a poco ms del 30% del original.
funcin gzdeflate.
Correo electrnico
Requisitos del sistema
PHP dispone de una funcin que La utilizacin de las funciones de correo electrnico requiere disponer de un servidor de
permite el envo de todo tipo de correo electrnico instalado y activo y la modificacin de la configuracin inicial del fichero
mensajes de correo electrnico php.ini.
desde una pgina web.
Si no tienes instalado este servidor puedes hacerlo ahora. En la pgina Servidor de
Son escasos los hosting que correo tienes detallados ambos procesos (instalacin y modificacin de php.ini).
tienen activada esta funcin.
No es por capricho ni por afn esttico. Si insertramos algn carcter delante de esas
Mensaje con
lneas se plantearan problemas en la estructura del mensaje y si no incluyramos un
cabeceras MIME salto de lnea para cada uno de los conceptos tambin tendramos ese mismo problema.
Una forma ms completa es la La sintaxis MIME es muy estricta en este sentido. Tengamos mucho cuidado en esto!
siguiente:
Hay otra posibilidad sintctica como alternativa a los saltos de lnea ya conocida.
mail(dest,asunto,mens,cabez) Podramos escribir todo en una sola lnea sustituyendo los saltos de lnea que ves aqu por
\n, de forma que el script tuviera un aspecto similar al siguiente:
Como puedes ver, en este caso
aadimos un nuevo parmetro a la
mail("juan@localhost","Asunto","Contenido","\nReply-To: ...\nCc:.....\nBcc: ...")
funcin (cabez) que debe estar
entre comillas y que puede
donde, como ves, los \n sustituyen a los saltos de lnea.
contener, separando con comas, lo
siguiente:
<?
From: Nombre <e-mail> mail("juan@mispruebas.com","Varios destinatarios","Cuerpo del mensaje",
El texto que escribas en el
"From: CursoPHP <juan@mispruebas.com>
parmetro Nombre (cuidado, no Reply-To: andres@mispruebas.com
lleva comillas!) ser el nombre del Cc: perico@mispruebas.com,andres@mispruebas.com
remitente, que aparecer en el Bcc:andres@mispruebas.com,perico@mispruebas.com
campo De: cuando el destinatario X-Mailer: PHP/" . phpversion());
reciba el mensaje. ?>
La direccin que escribamos donde Como puedes observar, hemos puesto las direcciones de los destinatarios de las copias
dice correo (fjate que no va -visibles y ocultas- en sendos arrays y hemos aadido una funcin que: lee los array, los
entre comillas) ser la direccin a une en una cadena separndolos con comas y, por ltimo, quita la ltima coma aadida
la que se enviar la respuesta si el utilizando la funcin substr.
destinatario una vez recibido tu
correo desea responder mediante
<?
la opcin Responder de su
programa de correo electrnico. #variables destinatario, asunto, texto, etc.
$destino="andres@mispruebas.com";
Cc: correo1,correo2,... $envia="Andrs Curso PHP";
$remite="andres@mispruebas.com";
De igual forma que en el caso $asunto="Mensaje experimental";
anterior en una nueva lnea y sin $texto="Esto es una prueba. No es spam";
cerrar comillas podemos incluir
en correo1, correo2, etctera,
las direcciones de correo de las #array de destinatarios de copias visibles
personas a las que deseamos
enviar copia del mensaje.
$c[0]="perico@mispruebas.com";
No te olvides de separar con $c[1]="juan@mispruebas.com";
comas cada una de las direcciones
que, como puedes ver en los #crear la cadena con las direcciones
ejemplos, no van entre comillas. # y aadir las comas de separacin
Bcc: correo1,correo2,... foreach($c as $pegar) {
Esta opcin es idntica en cuanto a $cco .=$pegar;
su funcionamiento a la anterior, $cco.=",";
con la nica diferencia que esas };
direcciones no sern visibles por
los destinatarios de los mensajes. #quitamos la coma del final de la cadena
X-Mailer:PHP/".phpversion() $l=strlen($cco);
Es una frivolidad que se puede
incluir en el encabezado del $cco=substr($cco,0,$l-1);
mensaje y que indica que versin
de PHP con que ha sido creado. #array de destinatarios de copias OCULTAS
ejemplo96.php
En la pgina anterior hemos Aqu tienes un ejemplo con los diferentes elementos del encabezado de un mensaje.
hablado acerca de la manera de Como ves, he incluido todos los elementos dentro de la funcin mail.
enviar un e-mail y veamos la
forma de insertar el cuarto <?
parmetro de la funcin mail para mail("juan@mispruebas.com", "Cabeceras", "Prueba de cabeceras",
incluir algunos elementos de los
"Date: 24 de Junio de 2001
encabezados MIME.
MIME-Version: 1.0
El formato de los mensajes est From: Estudiante Perico<perico@mispruebas.com>
especificado en una serie de Cc:perico@mispruebas.com
normas conocidas como el MIME Bcc:andres@mispruebas.com
(Multipurpose Internet Mail Reply-To: perico@mispruebas.com
Extensions) en las que se X-Mailer: PHP/".phpversion());
establecen los contenidos y la ?>
sintaxis de las diferentes partes de
un mensaje.
ejemplo98.php
Recordemos que la funcin
mail(dest, asunt, men, cab) Una forma un poco ms depurada del script anterior podra ser esta que incluimos aqu
debajo.
tiene cuatro parmetros y que las
especificaciones del MIME aluden a Sus particularidades son las siguientes:
los dos ltimos, es decir a men (el
cuerpo del mensaje) y cab que es
el encabezado del mismo. Recogemos los datos en variables e insertamos en la funcin mail esas variables
La variable $cabecera tiene algunas singularidades:
Respecto a dest (destinatario) y La vamos construyendo aadiendo subcadenas: date, from, etc. etc.
asunt no se requieren ms En cada subcadena dejamos pegado el contenido a las comillas iniciales
comentarios que reiterar la Al final de cada subcadena (cada una contiene un elemento del encabezado)
necesidad de incluir esos valores insertamos \n para el carcter especial que indica a PHP un salto de lnea
(e-mail del destinatario y asunto) imprescindible
bien directamente, como
parmetro en la funcin, o a travs
de una variable tal como hemos
comentado en la pgina anterior.
<?
# datos del mensaje
Cabeceras de los mensajes $destinatario="juan@mispruebas.com";
$titulo="Cabeceras en variables";
Los diferentes elementos de la $mensaje="Nueva prueba de cabeceras";
cabecera de un mensaje deben $responder="andres@mispruebas.com";
insertarse siempre separados por $remite="andres@mispruebas.com";
saltos de lnea bien pulsando $remitente="Otra vez Andrs";
Enter o incluyendo la secuencia \n # cabeceras
dentro de la misma de lnea.
$cabecera ="Date: ".date("l j F Y, G:i")."\n";
No pueden incluirse espacios, ni al $cabecera .="MIME-Version: 1.0\n";
comiezo de las nuevas lneas ni $cabecera .="From: ".$remitente."<".$remite.">\n";
despus de \n, y las comillas que $cabecera .="Return-path: ". $remite."\n";
han de contener todo el $cabecera .="X-Mailer: PHP/". phpversion()."\n";
encabezado se abren delante del
primero de ellos y no se cierran if( mail($destinatario, $titulo, $mensaje,$cabecera)){
hasta despus de haber escrito el echo "mensaje enviado";
ltimo. }
Pueden contener lo siguiente: ?>
Date: xxxxx
ejemplo99.php
Date: debe escribirse con esta
sintaxis exactamente.
El parmetro xxxxx es una cadena Algunas funciones PHP que incorporamos en estos ejemplos
que contendr la fecha de envo
del mensaje y que puede
obtenerse a travs de una de las Podrs ver en estos ejemplos algunas funciones raras que vamos a comentar
funciones de fecha de PHP tal seguidamente:
como puedes ver en el ejemplo.
uniqid(pre,bol)
MIME-Version: 1.0
Genera un identificador nico basado en la hora actual del sistema expresada en
Este elemento de la cabecera
microsegundos y con una longitud de 13 caracteres.
especificar la versin MIME que
ha de utilizar el cliente de correo
El parmetro pre permite establecer una cadena o nmero (puede ser una cadena vaca)
para poder interpretar
adecuadamente el contenido de los que se antepone al identificador generado por la funcin.
mensajes.
Opcionalmente permite el segundo parmetro bol que debe ser un valor booleano (TRUE
From: remitente<e-mail> FALSE) o tambin 0 1.
Este elemento de la cabecera Cuando este parmetro es TRUE aade al final de la cadena generada anteriormente otra
permite indicar el nombre del subcadena numrica -generada aleatoriamente- de nueve dgitos, que refuerza la unicidad
remitente (remitente) y su del identificador.
direccin e-mail siguiendo la
sintaxis que se especifica. El eregi_replace(busca, reemplaza, cadena)
nombre, como un elemento
independiente y la direccin e-mail Busca en la cadena especificada en el parmetro cadena (que puede ser una cadena o
dentro de < >. una variable que contenga una cadena) las subcadenas especificadas en busca (pueden ser
Cuidado! expresiones regulares) y sustituye esas subcadenas por el contenido del parmetro
reemplaza.
No debemos poner comillas ni en
el nombre del remitente, ni en la Esta funcin devuelve la cadena modificada.
direccin e-mail, ni en la fecha,
etctera. strip_tags(cadena, excepciones)
Respecto a Cc: y Bcc: ; Reply-To: Suprime todas las etiquetas HTML contenidas en cadena salvo las que se indiquen en
y X-Mailer: son vlidos los
excepciones.
comentarios que hemos hecho en
la pgina anterior.
Por ejemplo: strip_tags($cadena, '<i><u><b>') eliminara todas las etiquetas HTML,
Si no se especifica lo contrario, los salvo las indicadas aqu y sus correspondientes cierres.
mensajes se envan como texto
sin formato, pero existen Si no se especifican excepciones elimina todas las etiquetas.
opciones que permiten especificar
el formato que ha de tener un base64_encode(cadena)
mensaje.
Devuelve una cadena codificada en base64. Esta codificacin se hace para permitir que
La especificacin de un formato las informaciones binarias puedan ser correctamente manipuladas por sistemas que no
obliga a incluir otro elemento en generan correctamente los 8 bits, tal como ocurre frecuentemente en los cuerpos de los
cabecera del mensaje: mensajes de correo electrnico.
Content-Type: base64_decode(cadena)
Este elemento debe ir seguido de
Realiza el proceso inverso a la anterior. Decodifica una cadena previamente codificada
la especificacin en la que se
indique el tipo de contenido. Tiene en base64.
la sintaxis: tipo/subtipo
chunk_split(cadena, longitud, separador)
El MIME establece un gran
variedad de opciones para este Devuelve una cadena obtenida al insertar en la cadena especificada -a intervalos del
propsito. Hablaremos de dos de nmero de caracteres especificados en el parmetro numrico longitud- el contenido de
ellas: una subcadena indicada en el parmetro separador.
text/plain Por defecto -cuando no se especifican los parmetros- longitud es igual a 76 caracteres
y el separador es la cadena \r\n (retorno y salto de lnea).
El text/plain es la opcin por
defecto y seala que el contenido Esta funcin se utiliza para convertir al formato especificado en la RFC 2045
del mensaje es de tipo texto
(especificacin para MIME) las cadenas obtenidas por base64_encode.
(text) y del subtipo sin formato
(plain)
Es el formato habitual de los ficheros adjuntos de los e-mail.
text/html
$UN_SALTO="\r\n";
Los tipos anteriores permiten
enviar mensajes simples (sin
$DOS_SALTOS="\r\n\r\n";
ficheros adjuntos) en uno u otro
formato, pero el MIME nos da # creamos el remitente, etc. y tambin la que parte que
opciones para insertar dentro de # contiene el cdigo HTML del mensaje
un mismo mensaje elementos de
diferentes tipos y subtipos. $destinatario="juan@mispruebas.com";
$titulo="Mensaje alternativo Texto Plano - HTML ";
Las opciones de mayor inters son $mensaje="<html><head></head><body bgcolor='#ff0000'>";
las siguientes:
$mensaje .="<font face='Arial' size=6>Prueba HTML</font>";
multipart/alternative $mensaje .="</body></html>";
$responder="andres@mispruebas.com";
Es la forma de especificar que el $remite="andres@mispruebas.com";
mensaje tiene varias partes $remitente="Andrs Prez y Prez";
(multipart) de las que el
destinatario ha de ver una sola # creamos el separador de bloques del mensaje
(alternative). # anteponiento "_separador" aunque podramos haber puesto "tiburcio"
Se podra utilizar en casos en los # generamos un identificador unico utilizando un numero aleatorio
que sea necesario prever la # como "semilla" y luego lo codificamos con la funcin md5
posibilidad de que un mensaje con
formato HTML pueda ser $separador ="_separador".md5 (uniqid (rand()));
visualizado como texto plano
cuando el cliente de correo no # creamos la variable cabecera con los elementos
soporte HTML. # ya utilizados en los ejemplos anteriores y ponemos al final
# de cada elemento UN SALTO DE LINEA
Podemos hacer un mensaje a
medida que se presentar de una
forma u otra segn el cliente $cabecera = "Date: ".date("l j F Y, G:i").$UN_SALTO;
utilizado para leerlo. $cabecera .="MIME-Version: 1.0\n";
$cabecera .="From: ".$remitente."<".$remite.">".$UN_SALTO;
multipart/mixed $cabecera .= "Return-path: ". $remite.$UN_SALTO;
$cabecera .="Cc:perico@mispruebas.com".$UN_SALTO;
Cuando en el Content-Type se
$cabecera .="Reply-To: ".$remite.$UN_SALTO;
establece el tipo multiparte y el
$cabecera .="X-Mailer: PHP/". phpversion().$UN_SALTO;
subtipo mezclado (mixed) ser
cuando tengamos la posibilidad de
adjuntar ficheros al mensaje. # AQU DEFINIMOS EL CONTENIDO MULTIPART, fjate que lo acabamos con ";"
Los apartados sealados con ** # unimos ambas cadenas para crear el cuerpo del mensaje
slo se incluiran en el caso de que
junto con el mensaje se adjunten $mensaje=$texto_plano.$texto_html;
ficheros.
Para imgenes:
segn el tipo de imagen ejemplo100.php
image/jpeg
image/gif
Para vdeo:
video/mpeg
<?
Para ejecutables, comprimidos y # definimos estas variables igual que en el ejemplo anterior
otros ficheros adjuntos:
application/octet-stream $UN_SALTO="\r\n";
En cualquier caso, si quieres $DOS_SALTOS="\r\n\r\n";
utilizar algn otro tipo de archivo
puedes consultar en la web las #incluimos en varias, asunto, un texto en HTML
especificaciones del MIME. # remitente, etc. etc.
Esta codificacin suele usarse /* Parte primera del envio -Mensaje en formato HTML
cuando la mayora de los ================================================
caracteres del mensaje puede
escribirse con formato US ASCII de Separador inicial
7 bits. ------------------------------- */
Prev que los caracteres con $texto ="--$separador".$UN_SALTO;
cdigos ASCII superiores 127 se
expresen mediante un mecanismo /* Encabezado parcial
especial. ------------------ */
/* especificamos que este primer elemento
Evita, entre otras cosas, que las ser texto y que ir codificado en formato 7 bits */
letras con tilde y algunos otros
caracteres especiales se visualicen
$texto .="Content-Type: text/html; charset=\"ISO-8859-1\"".$UN_SALTO;
incorrectamente. Es la forma de
$texto .="Content-Transfer-Encoding: 7bit".$DOS_SALTOS;
codificacin ms recomendable
para textos.
/* Contenido de esta parte del mensaje
La codificacin en base64 -----------------------------------*/
convierte cadenas binarias en # ya teniamos escrito el texto del mensaje ms arriba
cadenas de texto, con lo cual # simplemente lo aadimos a la cadena de texto
pueden ser enviadas de forma ms
segura. Es la forma de codificacin $texto .= $mensaje;
habitual de las imgenes y los
ficheros exe, zip, etctera.
#la variable $texto recoge esta parte del documento
Content-Disposition # la uniremos al final con las siguientes
Inline permite que los contenidos /* Parte segunda de mensaje -Fichero adjunto n 1
se visualicen junto con el cuerpo ==================================================== */
del mensaje mientras que con
attachment slo apareceran /* Encabezado parcial
como ficheros adjuntos. ------------------ */
# especificamos el tipo de contenido image/jpeg
Por lo que hemos podido
comprobar Outlook Express no # ya que ese ser el documento que vamos a enviar
suele respetar esa condicin y # ponemos el nombre del fichero (debemos tenerlo en el servidor
presenta siempre las imgenes en # con ese mismo nombre)
el mensaje. Sin embargo, s # establecemos in line como disposicin para que pueda ser visualizado
funciona en los correos web. # directamente en el cuerpo del mensajes
# en filename le asignamos el nombre con el que queremos que sea
Este elemento del encabezado # recibido por el destinatario
lleva -separada por punto y coma-
# por ultimo especificamos la codificacion como base64
una segunda parte.
Ejercicio n 32
Disea un script de forma que al cargarse la pgina que lo contiene se enve de forma
automtica un mensaje de correo, indicando la fecha y hora de acceso, al usuario
juan@mispruebas.com
Imgenes dinmicas
Requisitos del sistema
PHP permite la creacin dinmica El manejo de imgenes dinmicas requiere que est instalada la librera de PHP
de imgenes. Quiere esto decir llamada php_gd2.dll.
que una imagen puede ser
presentada en la pgina web sin En la versin de PHP que estamos manejando se instala por defecto, pero requiere que
necesidad de ser almacenada la configuracin de fichero php.ini tenga activada esta extensin.
previamente en el servidor y,
adems, con un contenido que Para activarla debers editar el fichero php.ini, buscar la lnea que dice: ;
puede ser modificado en cada extensions=php_gd2.dll y quitar el punto y coma que lleva delante.
instante.
A esto se le llama en el argot descomentar esa lnea. Las lneas de comentario en el
Esta posibilidad que ofrece PHP fichero php.ini empiezan por ese signo de puntacin.
puede resultar muy til a la hora
de presentar grficos estadsticos
ya que permitira utilizar valores
actuales obtenidos, por ejemplo, Comprobacin
de una base de datos.
Formatos GIF Una vez que hayamos modificado php.ini recuerda que debemos hacerlo con el
servidor Apache apagado activaremos de nuevo Apache y ejecutando info.php
Aunque son abundantes los
encontraremos algo similar a lo que ves en esta imagen:
materiales que aluden a este
formato grfico -incluso en las
pginas oficiales PHP- los formatos
GIF slo funcionan en modo
lectura.
Formatos PNG
Formatos de imgenes
Formatos soportados
Creacin de imgenes
dinmicas
Una primera imagen
<img src="imgxx.php">
Ver img1.php
donde imgxx.php ser el nombre
del script que genera la imagen.
Cuidado!
Primera etiqueta No dejes NUNCA lneas en blanco entre la etiqueta <? de comienzo del script y la lnea
que contiene Header
Una vez conocidos los formatos Si escribiramos el script anterior sustituyendo image/jpeg por image/png e Imagejpeg
que soporta nuestra versin, ya ($im) por Imagepng($im) no visualizaramos nada.
podemos generar imgenes El formato jpg a falta de especificaciones considera la imagen con negro como color de
utilizando cualquiera de esos
fondo, pero png requiere que ese color sea especificado.
formatos.
Con esta funcin se crea una imagerectangle ($im, 10, 10, 190, 190, $blanco);
imagen del tamao indicado en los
parmetros anc y al (en pixels) Imagejpeg($im);
que ser recogida en la variable
nom.
Imagedestroy($im);
Esta funcin es idntica para
cualquier formato de imagen. ?>
Imagedestroy($nom) <?
Header("Content-type: image/jpeg");
Creando colores
$im = imagecreate(200,200);
imagepolygon(
$nom, $vert, n vert , $col)
<?
Header("Content-type: image/png");
Elipses, circunferencias y
arcos $esquinas=array(20,100,100,180,180,100,100,20);
$b="./images/cruz.jpg"
Ver img12.php
en el caso de imgenes PNG o por: imagearc ($im, 100, 100, 160, 160, 0, 360, $fondo);
imagearc ($im, 100, 100, 160, 100, 0, 360, $rojo);
$nom= imagecreatefromjpeg
($b) Imagepng($im);
si se tratara de imgenes en
formato JPG. Imagedestroy($im);
Imagepng($nombre) Si observas el cdigo fuente vers que es exactamente el mismo que se utiliza para
insertar una imagen normal, con la nica diferencia de que aqu el nombre de la
o
imagen ser el mismo que el del fichero PHP que la genera.
Imagejpeg($nombre)
Imagepng(
$nombre, "mi_imagen.png")
Imagejpeg(
$nombre, "mi_imagen.jpg")
Trazando segmentos
Dibujando segmentos
Aunque presentaremos nicamente el cdigo fuente de una de las imgenes, para
La funcin PHP que permite dibujar hacer la comprobacin de las funciones y las diferencias de visualizacin insertaremos
segmentos rectilneos es la dos ejemplos, uno en formato PGN y otro en JPG.
siguiente:
Recuerda que las nicas diferencias entre ambos radican en utilizar: Header("Content-
imageline(
type: image/png") o Header("Content-type: image/jpeg") y en las funciones Imagepng
$nom,x0, y0,x1,y1,$col)
Imagejpeg.
donde: $nom es el nombre de la
variable definida mediante <?
imagecreate, x0 e y0 son las Header("Content-type: image/png");
coordenadas de uno de los $im = imagecreate(200,200);
extremos; x1 e y1 son las $fondo=ImageColorAllocate ($im,0,0,255);
coordenadas del otro extremo y $linea=ImageColorAllocate ($im,255,255,255);
$col es la variable de color con el
que ser dibujada la lnea. imageline($im,0,0,200,200,$linea);
ImageColorAllocate.
Fondos transparentes
Esta opcin de PHP nos obliga a
definir dos colores distintos
para conseguir la visibilidad de las <?
lneas. Header("Content-type: image/png");
$im = imagecreate(200,200);
$fondo=ImageColorAllocate ($im,0,0,255);
Crear transparencias $linea=ImageColorAllocate ($im,255,0,0);
imagecolortransparent ($im ,$fondo);
Si deseamos que un color imageline($im,0,0,200,200,$linea);
determinado se comporte como si Imagepng($im);
fuera transparente debemos Imagedestroy($im);
utilizar la funcin: ?>
imagecolortransparent ($nom ,
$col).
Ver img_a3.php Ver img_a4.php
donde: $nom es el nombre de la Formato PNG Formato JPG
variable definida mediante
imagecreate, y $color es el color Aqu tienes una pgina -con un color de fondo- en la que puedes visualizar las
que pretendemos hacer diferencias entre los dos formatos.
transparente.
Utilizando fuentes
Dibujando segmentos
TrueType Aunque presentaremos nicamente el cdigo fuente de una de las imgenes, para
hacer la comprobacin de las funciones y las diferencias de visualizacin insertaremos
Si has ledo los comentarios de la dos ejemplos. Uno en formato PGN y otro en JPG.
pgina anterior recordars que
para usar estas funciones es Recuerda que las nicas diferencias entre ambos radican en utilizar: Header("Content-
preciso que estn instaladas las type: image/png") o Header("Content-type: image/jpeg") y en las funciones Imagepng
libreras FreeType y que, adems, Imagejpeg.
conozcamos el path de directorio
que contiene las fuentes TrueType.
Texto TrueType horizontal
Instalacin de fuentes
<?
Header("Content-type: image/png");
Hemos creado un subdirectorio $im = imagecreate(400,300);
llamado fuentes y lo hemos $fondo=imagecolorallocate ($im, 255, 255, 210);
incluido en directorio donde estn
$rojo=imagecolorallocate ($im, 255, 0, 0);
alojadas estas pginas.
Superior derecho
Imagepng($im);
Sus coordenadas son:
$rec[4],$rec[5]
imagedestroy($im);
Diagramas de sectores
Diagramas de sectores
El ltimo parmetro es un
<?
constante PHP que puede tomar
$im = imagecreate (400, 400);
uno de los siguientes valores:
$fondo = imagecolorallocate($im, 226, 226, 226);
IMG_ARC_PIE $color1=imagecolorallocate($im,255,0,0);
IMG_ARC_NOFILL imagefilledarc ($im, 200, 200, 350, 300, 20, 240, $color1,
IMG_ARC_EDGED IMG_ARC_NOFILL|IMG_ARC_EDGED);
IMG_ARC_CHORD header('Content-type: image/gif');
imagegif($im);
Con la primera de las constantes
imagedestroy($im);
dibuja el sector de elipse
delimitado por los radios indicados ?>
relleno con el color especificado.
El segundo (IM_ARC_NOFILL) Ver ejemplo .jpg Ver ejemplo .png Ver ejemplo .gif
nicamente dibuja la porcin de
arco, pero no incluye los radios en
el dibujo. <?
$im = imagecreate (400, 400);
La opcion IMG_ARC_EDGED se $fondo = imagecolorallocate($im, 226, 226, 226);
comporta de forma idntica a $color1=imagecolorallocate($im,255,0,0);
IMG_ARC_PIE cuando se utiliza de
imagefilledarc ($im, 200, 200, 350, 300, 50, 200, $color1,
forma aislada aunque tiene una
opcin muy interesante que
IMG_ARC_CHORD);
veremos un poco ms abajo. header('Content-type: image/gif');
imagegif($im);
Con IMG_ARC_CHORD el resultado imagedestroy($im);
es un tringulo -relleno con el ?>
color indicado-formado por los dos
radios y la cuerda correspondiente
al arco que delimitan. Ver ejemplo .jpg Ver ejemplo .png Ver ejemplo .gif
Efecto tridimensional Ver ejemplo .jpg Ver ejemplo .png Ver ejemplo .gif
Lectura de
imgenes externas
Lectura de imgenes externas
La visualizacin de imgenes no Uno de los problemas que puede presentarse es la forma de indicar dnde estn la imagen a
presenta ningn problema lo visualizar. En Windows es necesario utilizar la "\" mientras que para Linux hay que usar "/".
hacemos habitualmente mediante
etiquetas HTML cuando se Al utilizar "\" en Windows puede plantearse el problema de que vaya precedida por algn
encuentran en el espacio del caracter que pueda tener una significacin especial como por ejemplo \n. Una solucin para
servidor, bien sea propio o ajeno. evitar esos eventuales problemas es escribir "\\" como separador de niveles de directorio. De
esta forma el primer "\" indica que lo que le precede ha de interpretarse sin ninguna
El problema puede surgir cuando significacin especial.
tratemos de almacenar esas
imgenes fuera del root del
servidor (una forma de impedir la <?
accesibilidad desde otras webs) y # indicar la ruta de la imagen
eso puede conseguirse mediante $original="C:\\Apache\\htdocs\\cursoPHP\\images\\caballos.jpg";
las funciones que veremos en este
captulo. # extraer el tipo de imagen segn su la extension del fichero
for($i=strlen($original)-1;$i>0;$i--){
El primer paso ser establecer la
if (substr($original,$i,1)=="."){
ruta y el nombre de la imagen. Al
margen tienes comentados $tipo=substr($original,$i+1);
algunos detalles al respecto. break;
}
El paso siguiente ser extraer el }
formato de la imagen. Lo hice # las diferentes opciones dependiendo del formato de la imagen
leyendo la parte de la cadena switch($tipo){
comprendida entre el ltimo punto case "jpg":
(.) y el final de la cadena que Header("Content-type:image/jpeg");
contiene el nombre de la imagen.
$nueva=imagecreatefromjpeg($original);
Mediante el switch elijo las imagejpeg($nueva);
instrucciones para cada tipo de break;
imagen que son similares pero con
matices segn del formato. case "png":
Header("Content-type:image/png");
La visualizacin de la imagen $nueva=imagecreatefrompng($original);
contiene tres instrucciones:
imagepng($nueva);
Header, imagecreatefrom e
break;
imageXXX.
$f=imagecreatefromjpeg($i) Ver ejemplo .jpg Ver ejemplo .png Ver ejemplo .gif
$f=imagecreatefrompng($i)
Cuidado!
$f=imagecreatefromgif($i)
Observa que en las imgenes en formato png se visualizan con deficiencias en los bordes de las
siendo $i la variable que recoge el reas transparentes.
nombre y el path de la imagen
original y $f la variable que Con el mtodo que vemos a continuacin ese problema se reduce considerablemente.
contiene el resultado de la
ejecucin de esta funcin.
imagecopyresampled() que
debe incluir dentro del
<?
parntesis un montn de
parmetros que son (por este
# obtener la imagen
orden): $original="C:\\Apache\\htdocs\\cursoPHP\\images\\aviones4.jpg";
for($i=strlen($original)-1;$i>0;$i--){
$d que es el identificador de la if (substr($original,$i,1)=="."){
imagen destino, es decir el papel $tipo=substr($original,$i+1);
fotogrfico que hemos creado en el break;
paso anterior. }
$f que es el identificador de la
}
imagen original (negativo) # tamao del original
obtenido en el punto 2. $tamano=getimagesize($original);
$orig_Ancho = $tamano[0];
Xd e Yd son las coordenadas de un $orig_Alto =$tamano[1];
punto situado en la esquina # estableceremos un margen en blanco alrededor de la imagen de 5 pixels
superior izquierda del papel a # igual por los cuatro lados
partir del que queremos que se $margen=10;
impresione la fotografa. Si # establecemos rocortes para reencuadrar la imagen
queremos una foto a sangre $recorte_izq=50;
pondremos 0,0 y, si quieres dejar
$recorte_sup=80;
mrgenes en blanco, habr que
$recorte_der=40;
poner los anchos de esos
mrgenes (izquierdo y superior) $recorte_inf=60;
respectivamente. # calculamos las dimensiones para utilizar como parmetros
# en la funcion imagecopyresampled
Xf e Yf nos servirn para # ancho y alto original recortado
reencuadrar la foto original $Ancho_recortado=$orig_Ancho-$recorte_izq-$recorte_der;
recortando por la izquierda y por $Alto_recortado=$orig_Alto-$recorte_sup-$recorte_inf;
arriba, respectivamente, los # factores de ampliacin en este caso iguales
anchos que se indiquen aqu en # sin distorsin de imagen
pixels. $ampliacion_X=1;
Dx e Dy indican el ancho y el alto $ampliacion_Y=1;
# dimensiones del soporte
(por este orden) que va a tener la
mancha de imagen en el positivo. $papel_Ancho=$Ancho_recortado*$ampliacion_X+ 2*$margen;
Ten en cuenta que no puedes $papel_Alto=$Alto_recortado*$ampliacion_Y+2*$margen;
salirte del papel as que esos # dimensiones de la mancha de imagen al positivar
valores sumados con los mrgenes # hay que quitar los mrgenes
(izquierdo y superior) no podrn $resultado_Ancho=$papel_Ancho -2*$margen;
ser mayores que las dimensiones $resultado_Alto=$papel_Alto -2*$margen;
que has elegido para el papel switch($tipo){
fotogrfico en el punto 2. case "jpg":
$importada=imagecreatefromjpeg($original);
Fx e Fy indican el ancho y el alto
break;
de la porcin del original que
case "png":
tratamos de reproducir. Sumados
con Xf e Yf no pueden exceder el
$importada=imagecreatefrompng($original);
break;
tamao del negativo.
case "gif":
Con estos parmetros la funcin ya $importada=imagecreatefromgif($original);
se encarga de redimensionar la break;
imagen (incluso distorsionarla si }
no hay proporcionalidad entre los
Header("Content-type:image/jpeg");
anchos y altos del original y del
soporte.
$im_base=imagecreatetruecolor($papel_Ancho,$papel_Alto);
$fondo=imagecolorAllocate($im_base,255,255,200);
imagefill($im_base,0,0,$fondo);
imagecopyresampled($im_base,$importada,$margen,$margen,
$recorte_izq,$recorte_sup,
$resultado_Ancho,$resultado_Alto,
$Ancho_recortado,$Alto_recortado);
imagejpeg($im_base);
ImageDestroy();
?>
Colores transparentes
Superposicin de reas transparentes
Rotacin de imgenes La variable $color deber estar definida previamente mediante la funcin
imagecolorAllocate u alguna otra que permita identificar un color determinado.
Mediante la funcion:
imagerotate($im,ang,$fondo) es
posible presentar imgenes Rotacin de imgenes
rotadas.
El parmetro $im es el
identificador de la imagen a rotar,
ang es el ngulo de rotacin <?
(expresado en grados y tomado # obtener la imagen
en sentido trigonomtrico) y $original="c:\\apache\\htdocs\\cursoPHP\\images\\aviones3.jpg";
$fondo es un color de fondo for($i=strlen($original)-1;$i>0;$i--){
asociado a la imagen a rotar que if (substr($original,$i,1)=="."){
puede ser definido mediante la $tipo=substr($original,$i+1);
funcin imagecolorallocate u otra break;
funcin que permita asociar
}
colores a imgenes.
}
switch($tipo){
Transparencia en la case "jpg":
rotacin de imgenes $importada=imagecreatefromjpeg($original);
break;
Hemos intentado explorar la case "png":
posibilidad de lograr imgenes $importada=imagecreatefrompng($original);
rotadas con fondo transparente. Y break;
la cosa resulta, cuando menos case "gif":
complicada. Cuando se trata de $importada=imagecreatefromgif($original);
insertarlas sobre un fondo plano la break;
situacin puede emularse }
fcilmente sin ms que asignar Header("Content-type:image/jpeg");
como color de fondo de la rotacin
$fondo=imagecolorallocatealpha($importada,255,255,0,40);
uno idntico al del fondo plano
sobre el que ha de situarse la
$im_base=imagerotate($importada,30,$fondo);
imagen. imagejpeg($im_base);
ImageDestroy();
Otra de las alternativas probadas ?>
fu tratar de usar
imagecolortransparent en el color
de fondo de rotacin de la imagen. Ver ejemplo
Es evidente que ese grado de
transparencia solo lo lograramos
con un formato png jpg. Pero... Diferencias entre imagecreate e imagecreatetruecolor
no funciona.
La alternativa siguiente fu tratar Este es el cdigo fuente de un script que lee una imagen externa y la copia ntegra sobre
de crear una imagen con fondo otra imagen creada mediante PHP. Si visualizas el ejemplo podrs observar las diferencias
transparente e insertar en ella la entre usar la funcin imagecreate o utilizar imagecreatetruecolor.
imagen rotada asignndole
transparencia a la capa que
<?
contiene la imagen rotada. Ah nos $original="c:\\apache\\htdocs\cursoPHP\\images\\aviones3.jpg";
encontramos con algunas
dificultades.
for($i=strlen($original)-1;$i>0;$i--){
La primera de ellas es que fondo if (substr($original,$i,1)=="."){
transparente slo lo permiten las $tipo=substr($original,$i+1);
imgenes que son creadas break;
mediante la funcin imagecreate. }
Si se crean mediante la funcin }
imagecreatetruecolor esa opcin switch($tipo){
no funciona. case "jpg":
Otra diferencia entre ambas $importada=imagecreatefromjpeg($original);
funciones tiene tambin relacin break;
con los colores de fondo. Mientras case "png":
que en el caso de imagecreate se $importada=imagecreatefrompng($original);
asigna como color de fondo el que break;
se haya definido inmediatamente case "gif":
despus de crear la imagen, $importada=imagecreatefromgif($original);
cuando se trata de break;
imagecreatetruecolor se }
asignar siempre un fondo negro y $dimensiones=getimagesize($original);
para cambiar ese color ser
$Ancho_original=$dimensiones[0];
necesario recurrir a la funcin
imagefill. $Alto_original=$dimensiones[1];
Header("Content-type:image/png");
Pero la felicidad completa parece $im_base=imagecreate($Ancho_original+20,$Alto_original+20);
que no existe. Al intentar explorar $fondo=imagecolorallocate($im_base,255,0,0);
la primera de estas opciones imagecolortransparent($im_base,$fondo);
hemos podido observar que el imagecopy($im_base,$importada,10,10,0,0,$Ancho_original,$Alto_original);
precio a pagar por la dichosa imagepng($im_base);
transparencia es obtener una ImageDestroy();
imagen final de no demasiado
?>
buena calidad.
handle
ejemplo106.php
Devuelve la ruta del directorio Antes de efectuar la lectura de un directorio es necesario abrirlo con la funcin
especificado. opendir, y una vez finalizada, es aconsejable cerrarlo utilizando la funcin closedir.
read()
<?
Realiza una lectura secuencial de
los nombres y extensiones de los #abrimos el identificador de directorio
ficheros contenidos en el directorio
especificado. $f = opendir("./images");
rewind()
#leemos el primer fichero que ser "." (recuerda la estructura
Posiciona el puntero en la posicin # de los directorios de MS-DOS)
inicial.
$fichero=readdir($f);
close()
echo $fichero,"<br>";
Cierra el identificador de directorio.
ejemplo107.php
Proteccin de directorios
Configuracin del servidor Apache
Una vez que tengamos modificada Para poder proteger de directorios mediante un fichero llamado .htaccess es
la configuracin del servidor necesario realizar algunas modificaciones en la configuracin de Apache.
Apache estaremos en condiciones
de poder proteger directorios Abriremos nuestro fichero httpd.conf y buscaremos este prrafo (lneas 312 a 315):
restringir o limitar el acceso a
ellos y tambin podremos <Directory />
redirigir peticiones a pginas Options FollowSymLinks
predeterminadas en casos AllowOverride None
concretos.
</Directory>
Este control ha de realizarse
mediante ficheros que tienen por donde dice None pondremos All. Luego buscaremos este otro prrafo (lneas 341 a 350)
nombre .htaccess (el primer
y haremos el mismo cambio (marcado en rojo) de None por All.
caracter es el punto) y que no
pueden llevar ningn tipo de
extensin. # "AuthConfig", and "Limit"
#
Loa ficheros .htaccess pueden ser AllowOverride None
incluidos en cualquier directorio o
subdirectorio del espacio del
#
servidor.
# Controls who can get stuff from this server.
#
El fichero .htaccess Order allow,deny
Allow from all
Las misiones ms importantes que </Directory>
puede realizar este fichero son:
redireccionar y restringir accesos.
guardaremos los cambios en httpd.conf y reiniciaremos nuestro servidor Apache.
Veamos cada una de ellas por
separado.
Comprobacin de la configuracin
Errores y
redireccionamiento Empezaremos escribiendo en la barra de direcciones de nuestro navegador (tambin
Los mensajes de error ms
puedes hacerlo desde este enlace) esta direccin:
frecuentes al intentar acceder a http://localhost/cursoPHP/noexisto.html y nos aparecer un mensaje de error diciendo
pginas web y sus causas son que no existe ninguna pgina con ese nombre. Algo lgico, porque realmente no existe.
los siguientes:
Ejercicio n 35
Error 401
El subdirectorio est protegido por
nmero IP o por password y el
Abre tu editor no utilices el block de notas porque te dar muchsimos problemas en este
intento de acceder a l no ha caso y escribe la siguiente lnea:
tenido xito. ErrorDocument 404 http://localhost/cursoPHP/index.php
Error 403 y guarda el documento en el directorio cursoPHP con el nombre (aunque te parezca
El acceso al documento solicitado extrao, no lleva nada delante del punto) .htaccess
est prohibido. Pulsa de nuevo en el enlace que tienes aqu arriba o escribe la direccin en el navegador
Error 404
y observars que ahora no dice pgina no encontrada sino que se abre la pgina principal
El documento solicitado no ha sido
hallado.
del Curso.
Error 500 Edita de nuevo el fichero .htaccess y adele las siguientes lneas:
Error del servidor. Usualmente ErrorDocument 401 http://localhost/cursoPHP/index.php
este error se da cuando se ha ErrorDocument 403 http://localhost/cursoPHP/index.php
intentado ejecutar de forma guardndolo despus de haber hecho los cambios.
incorrecta un CGI, o bien debido a
problemas en el servidor.
Herencias
Son muchas las posibilidades que En nuestra configuracin y para crear un fichero con la palabra clave pepe
ofrece .htaccess a la hora de escribiramos:
restringir el acceso a un directorio c:\apache\bin\htpasswd -c c:/Apache/seguridad/misclaves.txt pepe
determinado.
y aparecera una ventana de MS-DOS en la que deberemos escribir la password para
Entre otras opciones, se puede ese usuario.
denegar el acceso a todos los
usuarios; denegar el acceso con
excepciones, autorizar a todos
(equivale a no restringir), autorizar
con excepciones o requerir clave y
contrasea.
Restriccin de acceso a
usuarios no autorizados
AuthUserFile "path"
AuthType Basic
AuthName "Texto"
AuthTextUserFile fichero
required valid-user
AuthTextCrypt On/Off
Las cookies
Una cookie muy simple
Aqu tienes un ejemplo, el ms simple, del uso de esta funcin.
De igual modo que ocurra con la
funcin mail, no todos los hosting Si ejecutas el ejemplo por primera vez observars que solo aparecer el texto Esto es
tienen habilitada la opcin de la galletita: sin ningn valor. Sin embargo, si actualizas el navegador o ejecutas ms
envo de cookies. tarde el ejemplo siguiente aparecer Mi regalito como valor de la variable.
Como sabes, las cookies son La explicacin es la siguiente: las instrucciones PHP se ejecutan en el servidor antes de
pequeos ficheros que se escriben
enviar la pgina al cliente. Eso significa que, al ejecutar por primera vez, se inserta la
en el ordenador del cliente.
orden de escritura y se comprueba el valor de la variable, que aun no ha sido creada y
Si utilizas Internet Explorer podrs por ello aparece en blanco. Ser en la actualizacin ya se habra producido un envo al
ver que se almacenan como navegador y ya se habra escrito la cookie cuando si se leer el valor anterior.
ficheros de texto en un directorio
llamado Archivos temporales de Siempre que tratemos de visualizar el valor de una cookie estaremos viendo el valor
Internet y que su nombre es de asignado en la peticin anterior
este tipo:
xxx@nombre[z].txt <?
# setcookie escribe el contenido de la cookie
donde xxx suele ser el nombre # en el ordenador del cliente
que figura en el registro de setcookie("cookie1","Mi regalito",time()+3600);
Windows como nombre del equipo # escribe el valor leido en la cookie
(el que se pone al instalar echo "Esta es la galletita:",$_COOKIE['cookie1'];
Windows); nombre suele ser el
?>
nombre del directorio de servidor
desde el que se envi la cookie y
el nmero z suele ser el ordinal del
nmeros de accesos a la pgina ejemplo108.php
que enva la cookie.
Si hemos ejecutado el ejemplo anterior este script ya podr leer el contenido de la
Netscape trata las cookies de cookie escrita a travs de aquel.
distinta forma ya que las almacena
en un nico fichero llamado
<?
cookies.txt que est en el
subdirectorio del usuario que se echo "Esta es la galletita:",$_COOKIE['cookie1'];
crea en la instalacin del programa ?>
y que est dentro de otro llamado
users.
ejemplo109.php
Cmo enviar cookies?
Una cookie con valores asignados mediante una variable
La instruccin para el envo de
cookies debe insertarse al principio
de la pgina y antes de cualquier <?
etiqueta HTML o lnea en blanco. $z="Mi regalito";
Esto es muy importante, no lo setcookie("cookie2",$z,time()+3600);
olvides echo "Esta es la galletita:",$_COOKIE['cookie2'];
?>
La sintaxis es la siguiente:
nom es una cadena que contiene Este segundo ejemplo ya visualizara el valor de esta cookie siempre que hubiramos
el nombre de la variable que ejecutado previamente el script anterior.
recoge el valor de la cookie.
Al registrarnos en ese hotel Antes de reiniciar el servidor Apache despus de efectuar los cambios anteriores
estaremos iniciando una sesin tendremos que crear un directorio con nombre temp dentro de htdocs y a partir de
(nuestro perodo de estancia) y al ese momento ya estaremos en condiciones de reiniciar Apache con PHP habilitado para el
recibir la tarjeta identificativa se uso de sesiones.
nos estar facilitando un
identificador de sesin, que
tiene validez temporal, ya que Iniciando y propagando sesiones
expirar en la fecha de salida
indicada en ella.
Aqu tenemos un ejemplo de como iniciar una sesin y tambin podremos comprobar
Imaginemos ahora que vamos al como se propaga al llamar a la misma pgina si est activada la opcin aceptar
restaurante. cookies.
Pueden ocurrir dos cosas: que Si ejecutamos reiteradamente el script pulsando en volver a llamar esta pgina
decidamos efectuar el pago podremos ver que no se modifica el valor del identificador de sesin.
directamente, o que pidamos que
el importe de la factura se incluya Si bloqueamos las cookies (en este enlace est descrito el procedimiento para
en nuestra cuenta. En el segundo hacerlo) podremos comprobar que ahora la sesin no se propaga y que cada vez que
de los casos, se reiniciar la
sesin y se registrar una nueva
volvemos a llamar a la pgina nos aparece un nuevo valor en el identificador de
variable de sesin el importe sesin, es decir, se crea una nueva sesin.
del servicio al firmar la nota de
cargo del mismo. <?
session_start();
El responsable del restaurante
#pedimos que escriba el identificador nico y el nombre de la sesin
guardar esa nota de cargo una
variable de sesin de forma echo session_id(),"<br>";
temporal ya que una vez abonado echo session_name(),"<br>";
su importe, en el momento que ?>
abandonemos el hotel, expirar la <A Href="ejemplo116.php">Volver a llamar estallamar esta pgina</A>
sesin y dejar de tener validez.
session_cache_limiter
('nocache,private'). Ejemplo 121.php
<A href="pagxx.php?
<? echo session_name(). "=" <?
.session_id()?> session_set_cookie_params (10,"/","localhost", 0);
session_name('mi_sesion');
Con esta sintaxis, despus de
session_start();
escribir el ? (recordemos que es la
forma de indicar que aadimos echo session_id(),"<br>";
variables y valores para que sean echo session_name(),"<br>";
transferidos junto con la peticin $a=session_get_cookie_params();
de la pgina) estaremos pidiendo a foreach($a as $c=>$v){
PHP que escriba como nombre de echo $c,"--->",$v,"<br>";
variable el nombre de la sesin y }
como valor de esa variable, ?>
despus de insertar el signo igual, <A Href="ejemplo126.php?<?=$SID ?>">Volver a llamar esta pgina</A>
el identificador de sesin.
Variables de sesin
Con cualquier opcin de register_globals
La verdadera utilidad de trabajar
con sesiones estriba en la Aqu tenemos un ejemplo en el que utilizamos las funciones PHP especficas para el
posibilidad de propagar junto con tratamiento de sesiones.
ellas los valores de las variables de
sesin. En el caso de que la versin de PHP no admitiera superglobales habra que sustituir
$_SESSION por $HTTP_SESSION_VARS y tener presente el carcter no global de esta
Se trata de ir aadiendo y ltima variable.
propagando variables con sus
valores, y de la posibilidad de
utilizarlas de la misma forma que <?
se utilizaran las variables externas # iniciamos la sesin
enviadas a travs de un formulario. session_start();
# visualizamos el identificador de sesin
Igual que ocurra en caso de los echo "Este es el identificador de sesion: ",session_id(),"<br>";
formularios, tambin las variables # registramos una variable de sesin asignandole un nombre
de sesin pueden ser tratadas de
$_SESSION['variable1'];
forma distinta segn como estn
configurado PHP (php.ini) y cual #asignamos un valor a esa variable de sesin
sea la versin de PHP que $_SESSION['variable1']="Filiberto Gmez";
utilicemos. # registramos una nueva variable de sesin
#asignandole directamente un valor
$_SESSION['variable2']="Otro filiberto, este Prez";
Register globals #comprobamos la existencia de la variables de sesin
echo "Mi_variable1 esta registrada: ",
Las variables de sesin tienen, isset($_SESSION['variable1']),"<br>";
como ocurra en otros casos, una #leemos el contenido de esa variable
sintaxis comn (que no depende print "Su valor es: ".$_SESSION['variable1']."<br>";
de la configuracin de la directiva
#comprobamos la existencia de la otra variable y la visualizamos
register globals) y una especfica
echo "Mi variable2 esta registrada :",
aadida a la anterior para el caso
en que register globals est isset($_SESSION['variable2']),"<br>";
activado. print $_SESSION['variable2']."<br>";
#destruimos la variable1
A diferencia de los casos que unset($_SESSION['variable1']);
hemos visto anteriormente, echo "La variable1 ha sido destruida:",
cuando se trata de sesiones no isset($_SESSION['variable1']),"<br>";
existe la similitud sintctica que print $_SESSION['variable1']."<br>";
exista en aquellos casos.
#destruimos todas las variables restantes
Esa es la razn por la que no unset($_SESSION);
vamos a incluirla. Su utilidad #comprobamos que han sido destruidas
prctica es nula y podra crearnos
cierta confusin. echo "La variable1 ya estaba vacia:",
isset($_SESSION['variable1']),"<br>";
El hecho de que PHP mantenga print $_SESSION['variable1']."<br>";
activas las funciones de esa opcin
obedece nicamente a razones de
echo "Tambin ha sido destruida la variable2: ",
tipo prctico. La decisin de
eliminarlas de las nuevas versiones
$_SESSION['variable2'],"<br>";
podra ocasionar serios perjuicios a print $_SESSION['variable2']."<br>";
programadores que tienen
desarrolladas sus aplicaciones con ?>
la antigua sintaxis y que se veran
obligados a modificar el cdigo
fuente de todos sus scripts Ejemplo 128.php
anteriores.
Propagacin de sesiones
Manejo de variables
Los tres scripts siguientes son un ejemplo del uso de sesiones para la propagacin de
Las funciones ms importantes
para el manejo de variables de
sesiones.
sesin son las siguientes:
Funcionan bajo cualquier forma de register_globals y tambin en el caso en que las
$_SESSION['var'] cookies estuvieran desactivadas en el navegador del cliente
foreach($_SESSION as $indice=>$valor){
Propagacin de las
print("Variable: ".$indice." Valor: ".$valor."<br>");
variables }
# modificamos los valores de las variables de sesion
Las variables $_SESSION['var'] # de igual forma que si fueran variables de cualquier otro tipo
creadas en cualquier pgina, se
propagan a todas las dems $_SESSION['valor1']+=87;
pginas a las que se propague la $_SESSION['valor2'] .=" bonito nombre";
sesin, sin que para ello sea
# destruimos la tercera variable
necesaria ninguna actuacin
especfica. unset($_SESSION['variable3']);
Algunas posibilidades
Usando las libreras PDFLib
Antes de utilizar esta opcin es preciso hacer una pequea modificacin en php.ini.
Existen diferentes posibilidades de
creacin de ficheros PDF mediante Hemos de descomentar la lnea que dice:
el uso de funciones de PHP. La
distribucin de PHP incluye ;extension=php_pdf.dll
funciones para la creacin de
ficheros usando las bibliotecas y como descomentar no es otra cosa que quitar el punto y coma que va delante de una
PDFlib de Thomas Merz que estn lnea, habremos de dejarla as:
disponibles en http://www.pdflib.
com/. extension=php_pdf.dll
La distribuciones de PHP para Una vez guardados los cambios habr que como siempre en estos casos volver a iniciar
Windows incluyen estas libreras el servidor Apache.
restringiendo su uso a actividades
no comerciales. Cuando se trata de Para comprobar si est activa la modificacin del php.ini que comentamos a la
Linux/Unix la compilacin y izquierda- bastara con visualizar el famossimo info.php y comprobar que aparece lo
utilizacin de esta biblioteca
siguiente:
requiere su compra. Por esa razn
son muchos los hostings que no
incluyen entre sus servicios la
posibilidad de uso de esta librera.
Creacin Para el desarrollo de los contenidos de este curso no utilizaremos la librera PDFLib. Por
de ficheros PDF esa razn no es necesario que efectuemos los cambios de configuracin descritos en el
prrafo anterior.
La creacin de ficheros PDF La clase FPDF -que ser la que utilizaremos- no requiere ninguna modificacin en la
requiere que el script incluya la configuracin de php.ini.
clase fpdf.php. Para ello bastar
con que contenga la siguiente
instruccin: La clase FPDF
include("fpdf.php")
Al realizar la descarga del fichero fpdf153.zip desde http://www.fpdf.org podremos
Si el fichero fpdf.php estuviera en observar que el zip incluye tres directorios: doc, font y tutorial y una serie de ficheros
un directorio distinto del actual
entre los que podremos encontrar fpdf.php que es el que realmente contiene la clase.
habra de escribirse la ruta
completa del mismo en la
Hemos incluido, en el directorio cursoPHP de estos materiales, el fichero fpdf.php de
instruccin anterior.
esa distribucin y tambin el directorio font que hemos renombrado como fontsPDF al
Adems de esto, para poder usar efecto de facilitar la identificacin.
la tipografa propia de la clase ser
necesario asignar a una El resto de los ficheros, son meramente informativos, no los hemos incluido ya que no
constante, con nombre van a resultarnos necesarios para el uso de esta clase. Si tratramos de utilizar esta clase
FPDF_FONTPATH (el nombre ha en un servidor remoto deberamos transferir al mismo, con estos o diferentes nombres,
de mantenerse ya que es que usa los mismos ficheros y directorios que hemos incluido junto con estos materiales.
en la clase fpdf), la ruta absoluta
hasta el directorio que contiene las
fuentes y que en nuestro caso ser Los tipos de letra
el direcotorio fontsPDF tal como
comentamos a la derecha.
Por defecto el directorio font que se incluye en la distribucin de http://www.fpdf.org -
La asignacin de valores a la que nosotros hemos renombrado como fontsPDF- incluye las tipografas: Courier,
constante la haremos mediante la Helvetica y Times, (permitiendo utilizar el nombre Arial como sinnimo de Helvetica) y las
sintaxis: fuentes de smbolos: Symbol y Zapfdingbats.
define('FPDF_FONTPATH','ruta') Sin embargo, es posible usar cualquier otra tipografa. En pginas siguientes veremos
la forma en que pueden generarse e incluirse nuevos tipos de letra mediante la utilidad
El constructor FPDF makefont incluida en el propio directorio fontsPDF.
Recuerda que una pulgada Cuando se aade una pgina sin especificar la orientacin en AddPage() la nueva
equivale a 25,4 milmetros y que pgina tendr la orientacin indicada en la llamada al constructor del nuevo objeto
un punto equivale a 1/72 ($objeto= new FPDF('orientacion','unidades','tamao')).
pulgadas (0,35277 mm.).
Ejemplo133.php
El mtodo Output()
El parmetro destino puede tomar SetKeywords("palabras clave") Permite incluir una cadena con una lista de
uno de los siguientes valores: palabras clave separadas por espacios.
I
permite visualizar el fichero Los datos incluidos en el documento mediante los mtodos anteriores no son
directamente en el navegador si el presentados diractamente en el documento. Slo son visualizables cuando se exploran los
plugin si est disponible. La opcin metadatos del documento.
Guardar como... asignara, por
defecto, el nombre especificado en
el parmetro nomb.
<?
D # incluimos la clase fpdf que est en este mismo directorio
enva el fichero al navegador y include("fpdf.php");
muestra ventana de opcin que # y definimos la constante FPDF_FONTPATH como la ruta absoluta
permite elegir entre Abrir o # hasta el directorio que contiene las fuentes tipogrficas
Descargar. Si se elige esta ltima define('FPDF_FONTPATH','c:/Apache/htdocs/cursoPHP/fontsPDF/');
guardar el fichero con el nombre
/* vamos a configurar el documento como apaisado (P), utilizando
especificado en el parmetro nomb.
los milmetros como unidad de medida y unas dimensiones "no estandar"
F de 140 x 200 milimetros */
guarda el fichero en el directorio # creamos un array con las dimensiones (ancho y alto);
actual del servidor con el nombre $dimensiones=array (140,200);
asignado en la opcin nomb. # creamos un nuevo objeto (MiPDF) utilizando la clase FPDF
# incluyendo en este caso los valores a utilizar por el constructor
$MiPDF=new FPDF('P','mm',$dimensiones);
El mtodo SetDisplayMode
# el mtodo SetAuthor nos permite incluir el nombre del autor
() $MiPDF->SetAuthor('Pepe Prez');
# el mtodo SetCreator nos permite incluir el nombre de la
Este mtodo -slo afecta a la # aplicacion que genera el pdf
forma en la se visualiza el $MiPDF->SetCreator('clase FPDF');
documento en la pantalla del # el mtodo SetTitle nos permite incluir un ttulo
cliente- permite configurar dos
$MiPDF->SetTitle('Pruebas del pdf');
parmetros: tamao y forma de
# el mtodo SetKeywords nos permite incluir palabras claves
visualizacin.
# separadas por espacios y dentro de una misma cadena
El primero puede usar una de $MiPDF->SetKeywords('palabra1 palabra2');
estas opciones: fullpage (el zoom # el mtodo SetDisplayMode nos permite incluir palabras claves
del visor se adapta de modo que # separadas por espacios y dentro de una misma cadena
encaje la pgina completa en la $MiPDF->SetDisplayMode('fullpage','two');
pantalla); fullwidth (ajusta el zoom # creamos una pgina en blanco. Incluimos, para esta primera pgina
de forma que se visualize el # un cambio de orientacin respecto a la inicial
documento ajustando el ancho al
$MiPDF->Addpage('L');
de la pantalla); real (ajusta el
# creamos una segunda pgina en blanco
zoom de visor al 100%) default
que usa el modo por defecto del # en la que, al no incluir el parmetro de orientacin
visor. # utilizar el valor utilizado por el constructor.
$MiPDF->Addpage();
Mediante el segundo parmetro se # visualizamos el documento
puede establecer la forma de $MiPDF->Output('donpepito.pdf','I');
visualizacin. La opcin single ?>
muestras las pginas separadas de
una en una; continuous va
mostrndolas una detrs de otra Los ejemplos siguientes son similares. La nica modificacin que contienen respecto al
de forma continua; two muestras cdigo fuente anterior es la correspondiente al segundo parmetro (destino) del mtodo
dos columnas (con dos pginas) Output.
simultaneamente, y default que,
como en el caso anterior, usa el Destino="I" Destino="D" Destino="F"
modo por defecto del visor.
Fijacin de mrgenes
Insercin de textos
La forma ms simple de insercin de textos poco utilizada por el nmero de incovenientes que
Algunas funciones de insercin de conlleva es la que utiliza la funcin:
textos permiten colocar los
mismos dentro de lo podra $obj->Text(x,y,texto)
llamarse caja de texto que no es
otra cosa que la superficie de la donde x e y son los valores numricos que representan las coordenadas del punto de la pgina en el
pgina delimitada por los que pretende realizarse la insercin y texto es una cadena (o una variable conteniendo una cadena)
mrgenes de la misma. con el texto que se pretende insertar.
Por defecto, estos mrgenes miden
Esta funcin no considera ni los eventuales saltos de lnea que pudiera haber en la cadena (inserta
un centmetro, por la izquierda,
la parte superior y la derecha del todo el texto en una sola lnea) ni tampoco los mrgenes del documento. Por ello puede ocurrir, tal
documento. El tratamiento del como puedes comprobar en el ejemplo, que, por desbordar los mrgenes del documento, no
margen inferior requiere una aparezcan los textos completos.
funcin especfica que veremos en
otro de los epgrafes de esta Una funcin mucho ms til es la siguiente:
pgina.
$obj->Write(interlinea,texto)
$obj->SetMargins(iz,su,de)
en la que interlinea es el interlineado (expresado en la misma unidad utilizada por el constructor) y
Los parmetros iz, su y de son los texto la cadena o variable que ocntiene el texto a insertar.
valores numricos que permiten
establecer, -en la unidad de Se comporta de la siguiente forma:
medida que se indique en el
constructor- los mrgenes
izquierdo, superior y derecho, por Comienza a escribir el texto en la posicin actual de punto de insercin.
este orden, del documento.
La posicin actual del punto de insercin. puede ser una de la siguientes:
Si se omite el tercer parmetro La esquina superior izquierda del rea de impresin de la pgina (en el caso en que se
(margen derecho) se le asignar el ha producido un salto de pgina y no se hubieran insertado elementos anteriormente.
valor que se haya indicado para el La posicin resultante del final de la insercin del el elemento anterior.
izquierdo. La posicin establecida como posicin actual mediante las funciones SetX, SetY
SetXY
Margen inferior y salto de
pgina La insercin de textos mediante la funcin Text() no modifica la localizacin del punto de
insercin ya que utiliza sus propias coordenadas de posicionamiento.
La funcin: Una vez que la lnea alcanza el margen derecho -establecido de forma explcita o por defecto-
de la caja de texto produce un salto de lnea automtico.
$obj->SetAutoPageBreak(a,b)
permite activar o desactivar el Incluye los saltos de lnea que encuentra en el propio texto (caso, por ejemplo, de inclusin de
salto de pgina automtico y ficheros de texto) y tambin aquellos incluidos en la propia cadena medienta la secuencia de
establecer el margen inferior escape \n.
(mnimo) de las pginas. El
parmetro a puede tomar dos Si la opcin AutoPageBreak (comentada al margen) est activada produce un salto de pgina
valores: 1 0 (cierto falso), que automtico al alcanzar el margen inferior de la pgina.
se corresponden con la condicin
activo/inactivo. Alinea los textos a la izquierda sin permitir modificar la configuracin de esta opcin
Ms adelante, dedicamos un
apartado a la creacin y utilizacin # Insertamos una nueva pgina. En adelante
de nuevas fuentes tipogrficas. # los contenidos aprecern en esa nueva pgina
$MiPDF->Addpage();
# cambiamos el color y tipo de letra
Posicin actual
$MiPDF->SetTextColor(0,0,200);
$MiPDF->SetFont('Times','I',12);
La clase FPDF dispone de funciones # insertamos texto mediante Write y observaremos
que determinan el valor actual de # que ahora respeta los nuevos margenes
las coordenadas del punto de
$MiPDF->Write(4,$texto);
insercin (lugar donde se va a
# posicionamos el punto de insercin en las coordenadas
posicionar el texto, imagen o
elemento grfico que se incluya) y # (2,2) y escribimos de nuevo el texto.
otras que permiten modificar esos
puntos de insercin. $MiPDF->SetXY(2,2);
# al visualizar el documento podremos observar que solo
Son las siguientes: # respeta estas coordenadas la primera lnea, ya que las siguientes
# se ajustan a los mrgenes establecidos para la pgina
$obj->GetX()
$MiPDF->Write(4,$texto);
y
$obj->GetY()
# redimensionamos nuevamente los mrgenes
$MiPDF->SetMargins(20,5,15);
que devuelven los valores la
posiciones actuales, horizontal (X)
y vertical (Y). El resultado estar # cambiamos a una nueva pgina
expresado en las unidades $MiPDF->Addpage();
establecidas por el constructor # cambiamos el estilo de fuente a "normal"
considerando como origen de $MiPDF->SetFont('Times','',12);
coordenadas la esquina superior
# leemos el fichero de texto y lo recogemos en una variables
izquierda del documento y valores
positivos -horizontal y vertical- los
$f1=fopen('regenta.txt','r');
colocados a la derecha (X) y $regenta1=fread($f1,filesize('regenta.txt'));
debajo (Y) del origen. fclose($f1);
# insertamos el fichero mediante write
Para definir una nuevo punto de # podremos observar como se realiza el salto de pgina
insercin se pueden usar # de forma automtica respetando los mrgenes inferiores
cualquiera de estas funciones: $MiPDF->Write(4,$regenta1);
$obj->SetX(valor X)
$obj->SetY(valor Y)
$obj->SetXY(valor X, valor Y) # inseramos una nueva pgina
$MiPDF->Addpage();
que permiten establecer el punto # desactivamos el salto de pgina automatico
de insercin mediante sus # con lo cual no ser respetado el margen inferior
coordenadas: horizontal, vertical o # y el texto rebasar ahora los lmites del papal
ambas. $MiPDF->SetAutoPageBreak(0);
Cuando el valor X (en el caso #ponemos el texto en negro y cursiva para poder
SetX) es negativo se considera con #diferenciar los resultados al visualizar el documento
referencia al margen derecho de la $MiPDF->SetTextColor(0);
pgina. De igual modo, cuando se # reescribimos el texto anterior
asigna un valor negativo en SetY $MiPDF->Write(4,$regenta1);
se considera respecto a la parte # visualizamos el documento
inferior de la pgina. $MiPDF->Output();
?>
Saltos de lnea
Textos recuadrados
Enlaces internos
En el ejemplo que tienes a continuacin hemos insertado algunas de las opciones de las
La funcion Cell ofrece un montn funciones comentadas al margen. En los prrafos siguientes incluimos algunos comentarios
de posibilidades a la hora de sobre la manera de utilizar las funciones de inclusin enlaces internos en el documento. Esta
insertar celdas conteniendo textos. opcin requiere tres pasos:
Su sintaxis es la siguiente:
<?
Valor Opcin
#incluimos el fichero con la clase y definimos la variable FPDF_FONTPATH
A la derecha de la celda
0 actual
# con el mismo criterio comentado en el ejemplo anterior
include("fpdf.php");
En el margen izquierdo de la define('FPDF_FONTPATH','c:/Apache/htdocs/cursoPHP/fontsPDF/');
1 lnea siguiente /* establecemos las dimensiones del documento
Debajo de la celda actual creamos un nuevo objeto y aadimos una pgina*/
2 alineado a su borde izquierdo $dimensiones=array (210,297);
$MiPDF=new FPDF('P','mm',$dimensiones);
# ajustamos al 100% la visualizacin
Por medio del parmetro p se $MiPDF->SetDisplayMode('real');
puede establecer la alineacin del
texto (contenido en la celda) #insertamos una pgina en blanco
respecto a sus bordes. Permite $MiPDF->Addpage();
usar L, C y R como indicadores de # estableceremos los colores para bordes, fondos y textos
alineaciones del texto a la
# color de borde
izquierda, centro derecha.
$MiPDF->SetDrawColor(255,0,0);
El parmetro r es un valor # color del relleno (gris)
booleano (1 0) que especifica si $MiPDF->SetFillColor(200);
la celda ha de rellenarse con un # color del texto
color de fondo (1) o ha de ser $MiPDF->SetTextColor(0,0,255);
transparente (0). # establecemos espesores de lineas y tipo y tamao de letra
# espesor de linea 1 milimetro
El parmetro e -es opcional-
$MiPDF->SetLineWidth(1);
permite establecer la celda como
un hiperenlace.
# fuente y tamao: Arial, negrita de 12 puntos
Si se especifica una URL se $MiPDF->SetFont("Arial","B",12);
establecer un enlace a la misma # establecemos el texto para la primera celda
y, adems, es posible establecer $celda1="Esto ir en la celda 1";
enlaces internos de la forma que # determinamos el tamao de esta cadena y lo recogemos
puedes ver comentada en el # en la variable ancho
ejemplo. $ancho=$MiPDF->GetStringWidth($celda1);
/* definimos la celda estableciendo:
Tamao de ancho--- igual al de la cadena que va a contener + 6 mm.
una cadena de texto alto --- 6 milimetros
texto--- el contenido de la variable $celda1
borde--- 1 (para que ponga los cuatro bordes
La funcin:
celda siguiente--- 0 (para que la incluya a continuacin de la actual)
$obj->GetStringWidth('cad') alineacin --- C para que centre el texto en la celda horizontalmente
relleno --- 1 para que aplique el fondo a la celda
devuelve un nmero decimal que enlace--- pondremos un enlace al buscador google */
indica la longitud de la cadena
indicada en cad con la fuente y # como aun no hemos insertaod ningn elemento en la pgina
tamao de letra actuales. Es una # la celda aparecer en la parte superior de la pgina y apoyada
funcin muy til para dimensionar # sobre su borde izquierdo
las celdas de modo que los textos
que contienen no sobrepasen sus $MiPDF->Cell($ancho+6,6,$celda1,1,0,C,1,"http://www.google.com");
bordes.
/* pero modificando insertamos una nueva celda con el mismo contenido
Espesor de lneas modificando:
bordes--- ahora los pondremos solo por la parte superior T e inferior B
Puede especificarse el grosor de posicion de la siguiente celda: 2 (inmediatamente debajo)
las lneas -en los elementos relleno --0 */
grficos que las utilizan # la nueva insercin se realizar a la derecha de la anterior
(rectngulos, celdas, etctera)- # ya que as lo especificamos al definir all la celda siguiente
mediante la funcin: $MiPDF->Cell($ancho+6,6,$celda1,TB,2,C,0,"http://www.google.com");
$obj->SetLineWidth('grosor')
# cambiamos el color del borde y el del relleno
dnde grosor es un valor # color de borde
numrico que especifica el espesor $MiPDF->SetDrawColor(255,255,0);
de las lneas en las unidades # color del relleno (gris)
asignadas en el constructor. Por $MiPDF->SetFillColor(0,255,255);
defecto -si no se asigna espesor
mediante esta funcin- el ancho de /* una nueva insercin de una celda similar modificando
lnea sera de 0,2 milmetros. identica a la primera celda salvo el parmetro de posicin
de la celda siguiente que cambiamos a 1 para que la celda
Nmeros de pgina siguiente aparezca en el margen izquierdo del documento.
La actual, aparecer inmediatamente debajo de la anterior
La funcin:
ya que se as se especific en su Cell correspondiente */
$obj->PageNo() $MiPDF->Cell($ancho+6,6,$celda1,1,1,C,1,"http://www.google.com");
devuelve el nmero de la pgina # la misma funcin anterior que ahora debera aparecer en el margen izquierdo
actual. # modificando la especificacin para que inserte la potencial celda siguiente
# inmediatamente a la derecha
Color de las lneas
$MiPDF->Cell($ancho+6,6,$celda1,1,0,C,1,"http://www.google.com");
Tambin es posible establecer el
color de las lneas mediante la # insertamos un salto de lnea de 10 mm.
funcin: $MiPDF->Ln(10);
# una nueva celda que por efecto del salto de linea
$obj->SetDrawColor('R,G,B') # perdera la referencia de situarse a la derecha de la anterior
# se desplazara 10 unidades hacia abajo y se insertara en el margen
dnde R,G,B son valores
izquierdo
nmericos comprendidos entre 0 y
255 que asignan los valores de las $MiPDF->Cell($ancho+6,6,$celda1,1,0,C,1,"http://www.google.com");
componentes de los colores
primarios rojo, verde y azul # modificaremos ahora el punto de insercin mediante SetXY a las coordenadas
respectivamente. Si se incluye un # -100, -120 mm. valores negativos
nico parmetro ser interpretado # con lo cual las referencias sern al margen derecho y al inferior
como escala de grises. El valor 0
sera el negro y 255 representara $MiPDF->SetXY(-100,-120);
el blanco.
# vamos a crear un enlace interno mediante la funcin AddLink()
Color de relleno # y vamos a recoger el resultado en la variable $salta
$salta=$MiPDF->AddLink();
Algunos elementos grficos (celdas
# estableceremos la referencia del enlace
de texto, rectngulos) permiten $MiPDF->SetLink($salta,0,2);
que se les aplique un color de # crearemos ahora una zona (transparente) de enlace
fondo. Para establecer tal color # ser el rectangulo definido como parmetros en la la funcin Link
basta con ejecutar la funcin: # es decir un rectango de 297mm. de ancho, 30 de alto
# que tendr su esquina superior izquierda en el punto (0,40)
$obj->SetFillColor('R,G,B') # este enlace nos llevar al lugar del documento
# que se especifique mediante SetLink($salta);
El criterio de asignacin de colores
es idntico al del prrafo anterior. # que indi
$MiPDF->Link(0,40,297,30,$salta);
Una vez asignado un color de #comprobemos que all se inserta el texto mediante el cell correspondiente
relleno (lo mismo ocurre con los $MiPDF->Cell($ancho+6,6,$celda1,1,0,C,1,$salta);
colores y espesores de lnea) se
mantiene a lo largo del documento # insertemos un salto de pgina y comprobemos la funcin n de pagina
en tanto no sea modificado por la $MiPDF->Addpage();
ejecucin del mtodo con unos #aadimos a la cadena de texto el valor del nmero de pagina actual
parmetros distintos.
$MiPDF->Cell(50,6,"pagina n".$MiPDF->PageNo(),1,0,C,1);
# activamos el valor por defecto del sealados de nmero total de pginas
Nmero de pginas del # al no incluir nada como parmetro de la funcion AliasNbPages();
documento # deberemos recurri al sealador por defecto {nb}
$MiPDF->AliasNbPages();
La clase FPDF incluye la posibilidad # insertamos una nueva celda y aadimos a la cadena de texto
de determinar el nmero total de # anterior "de {nb}". Como puedes ver
pginas del documento. Para ello # el sealador {nb} forma parte de la cadena como un texto ms
es preciso ejecutar (despus de $MiPDF->Cell(50,6,"pagina n ".$MiPDF->PageNo()." de {nb}",1,0,C,1);
crear el objeto) la funcin:
$MiPDF->Output();
$obj ->AliasNbPages('idn')
?>
donde idn es una palabra
cualquiera. Si se omite se
Ejemplo138.php
considerar su valor por defecto
que es: {nb}.
Lineas y rectangulos
Modificacin de la clase FPDF
El fichero fpdf.php que contiene la clase FPDF tiene una carencia relativa a la gestin de
La clase FPDF incluye mtodos imgenes en formato GIF. En la propia principal http://www.fpdf.org/ se hace una mencin
para el dibujo de segmentos a esa carencia y la forma de subsanarla.
rectilineos y de rectngulos.
gif.php
Insercin de imgenes
Ejemplo140.php
Celdas con
Encabezados, pies de pgina y saltos automticos
saltos de lnea
<?
# include y define idnticos a los anteriores
La funcin Cell, estudiada en la
pgina anterior, no interpreta los include("fpdf.php");
saltos de lnea y, en el caso de que define('FPDF_FONTPATH','c:/Apache/htdocs/cursoPHP/fontsPDF/');
la cadena de texto sea ms larga # creamos una clase extendida de la clase FPDF
que el ancho de la celda, escribir class GranPDF extends FPDF {
fuera de sus mrgenes. # incluimos la funcion Header (debe ser definida con este nombre)
# que se ejecuta cada vez que se aade una pgina, sea en forma
La clase FPDF dispone de la # manual o en forma automtica.
funcin: # Nos permite insertar los encabezados de todas las pginas del
$obj->MuliCell(a,h,text,b,aln,r) # documento
function Header(){
donde a es el ancho de la celda (si #insertamos un salto de lnea de 2 mm. a partir
se indica cero ocupar hasta el #del margen superior
margen derecho de la pgina), h $this->Ln(2);
es el alto de cada una de las # establecmos color y estilo de letra del encabezado
celdas aunque, en la prctica, se $this->SetTextColor(0,0,0);
comporta de forma idntica al
$this->SetFont("Times","I", 11);
interlineado de un procesador de
textos), text es la cadena de texto
# establecemos una celda cuyo ancho es cero
(o variable que lo contiene) a # de esta forma se extender hasta el margen derecho
insertar. # ocupando toda la caja de texto de la pgina.
# le ponemos unicamente brode inferior, texto centrado
b es un parmetro que puede # sin relleno y le adjudicamos como parmetro de posicin
valer: 0 (sin bordes); 1 (con # de la celda siguiente 1 de forma que comience en el margen
bordes), y tambin: L (borde por # izquierdo de una lnea nueva
el lateral izquierdo de la celda); T $this->Cell(0,8,"La Regenta",'B',1,'C',0);
(borde por la parte superior), R
# colocamos un salto de lnes de 3 milimetros para separar el
(lnea de borde en el margen
# encabezado de los textos de la pgina
derecho), B (lnea de borde en la
parte inferior) agrupaciones de $this->Ln(3);
estos ltimos valores, en cualquier }
orden, tales como: LR TB, # incluimos la funcion Footer (debe ser definida con este nombre)
etctera. # para insertar pies de pgina cada vez que cree una pgina nueva
function Footer(){
El parmetro aln indica la $this->Ln(2);
alineacin horizontal que han de $this->SetTextColor(0,0,0);
tener los textos y permite los
$this->SetFont("Arial","I", 9);
valores: L (izquierda); C (centro);
# en este caso incluimos el nmero de pgina con un borde superior
R (derecha) J (justificado).
# de la celda, texto centrado y tambien activando la celda
Por ltimo, el parmetro r siguiente
(relleno) especifica si a las celdas # de modo que se produzca un saldo de lnea
se les aplicar (valor 1) un color $this->Cell(0,5,"Pgina ".$this->PageNo(),'T',1,'C',0);
de fondo o si se va a tratar (valor }
0) de un fondo transparente. }
# acabada la insercin de la clase extendida continuamos con el cdigo
El comportamiento de esta funcin
tiene las siguientes
# establecemos las dimensiones del documento
particularidades: $dimensiones=array (140,200);
# creamos un nuevo objeto pero cuidado! utilizaremos
Inserta los saltos de lnea # la clase extendida GranPDF
contenidos en el fichero origen y $MiPDF=new GranPDF('P','mm',$dimensiones);
los incluidos en la cadena de texto # ajustamos al 100% la visualizacin
mediante la secuencia de escape $MiPDF->SetDisplayMode('fullpage');
\n. # aadimos la primera pgina del documento. La ejecucin de esta funcin
Inserta saltos de lnea # disparar la ejecucin de las funciones Header() y Footer() de la
automticos en el momento en # clase extendida y, por tanto, incluir en el documento los encabezados
que el texto alcanza el borde # y pies de pgina all establecidos
derecho de la celda. $MiPDF->Addpage();
# cambiamos el estilo de fuente a "normal"
Si AutoPageBreak est activado $MiPDF->SetFont('Times','',12);
inserta saltos de pgina # leemos un fichero de texto y lo recogemos en una variables
automticos en el momento en
$f1=fopen('regenta.txt','r');
que el texto alcanza el margen
$regenta1=fread($f1,filesize('regenta.txt'));
inferior de la pgina.
fclose($f1);
# insertamos el fichero mediante Multicell
Encabezados # el ancho 0 establece que la celda ocupar desde el margen
y pies de pgina # izquierdo hasta el derecho. La interlinea ser de 4mm.
# el texto que se incluir (con salto de lnea automtico
La clase FPDF contiene dos # e insercin automtica de nuevas pginas) ser el recogido
mtodos (funciones) llamados: # del fichero de texto. La celda no tendr bordes
Header() y Footer(). # el texto estar justificado y no tendr relleno de fondo.
$MiPDF->Multicell(0,4,$regenta1,0,'J',0);
Si editamos el fichero fpdf.php # establecemos la visualizacin del documento
podemos ver que ambas estn
$MiPDF->Output();?>
vacas (no contienen ninguna
instruccin) presentando una
sintaxis como esta: Ejemplo141.php
function Header(){
// comentario
} El ejemplo siguiente es una adaptacin del ejemplo139 al uso de encabezados y pies de
y pgina.
function Footer(){ Ver cdigo fuente ejemplo142.php
// comentario
}
Ambas son invocadas de forma
automtica cada vez que se
<?
ejecuta la funcin AddPage() y,
# incluimos la clase fpdf.php y la constante FPDF_FONTPATH
eso permite crear otras funciones
include("fpdf.php");
a medida, con igual nombre, e
define('FPDF_FONTPATH','c:/Apache/htdocs/cursoPHP/fontsPDF/');
incluirlas en una clase extendida.
# creamos la clase GranPDF extendida de fpdf.php
Recuerda que los mtodos de la class GranPDF extends FPDF {
clase extendida prevalecen sobre # definimos dos nuevas variables internas
los que pudieran existir en la clase # el identificador de la columna actual
padre con su mismo nombre. Por # y el valor de la ordenada de inicio de las columnas
esta razn, las nuevas funciones var $columna_actual=0;
de la clase extendida nos var $ordenada_inicio=21;
permitiran incluir encabezados y
# la funcin Header se comporta de forma idntica al ejemplo anterior
pies de pgina en cada una de las
function Header(){
nuevas pginas aadidas mediante
AddPage(). $this->SetTextColor(0,0,0);
$this->SetFont("Times","I", 11);
El procedimiento sera este: $this->Cell(0,8,"La Regenta",'B',1,'C',0);
$this->Ln(3);
Creamos una clase extendida de }
la clase original FPDF. # Footer es similar al caso anterior con la nica diferencia que
Incluimos en esta nueva clase function Footer(){
funciones con nombres Header() $this->SetY(-20);
y Footer() (no podemos modificar $this->Ln(2);
el nombre ya que han de coincidir $this->SetTextColor(0,0,0);
con los nombres de las funciones $this->SetFont("Arial","I", 9);
vacias de la clase padre) en las $this->Cell(0,5,"Pgina ".$this->PageNo(),'T',1,'C',0);
que indicamos los contenidos que }
han de insertarse (y su posicin) function AcceptPageBreak(){
mediante cada una de ellas. Al # al alcanzar el margen inferior se activa esta funcin
crear el nuevo objeto mediante:
# que comprueba si el punto de insercin est en la columna
$obj= new nombre_clase() # primera (0) en la segunda
if($this->$columna_actual==0){
utilizaremos el nombre el de la # cambia el valor del nmero de columna a 1 (pasa a la segunda)
clase extendida que hemos $this->$columna_actual=1;
creado para incluir estas funciones. # cambia el punto de insercin a la coordenada de inicio
# que es la parte superior de la pgina
De esta forma, cada vez que se
ejecuta AddPage() (aadir una $this->SetY($this->ordenada_inicio);
nueva pgina) se ejecutarn # cambia el margen izquierdo de modo que el texto
tambin Header() y Footer() que, # aparezca en la columna derecha (a partir de los 72.5 mm).
al no ser ya funciones vacas, # ms abajo est comentada la razon de estos valores
realizarn una inclusin de $this->SetLeftMargin(72.5);
contenidos en cada una de las # cambia el punto de insercion al nuevo margen izquierdo
pginas del documento. $this->SetX(72.5);
# establecemos que la funcin devuelva false
Gestin de la insercin # con ello no se produce un salto de pgina
automtica de pginas # y el punto de insercin se translada a las
# coordenadas indicadas en las instrucciones anteriores
return false;
La clase FPDF contiene esta
}else{
funcin:
# si la columna es la segunda (no es la cero)
function AcceptPageBreak(){ # cambia a la primera, asigna el valor cero
// comentario $this->$columna_actual=0;
return $this->AutoPageBreak; # cambia el punto de insercin a la coordenada de inicio
} # que es la parte superior de la pgina
$this->SetY($this->ordenada_inicio);
que igual que ocurra con Header()
# cambia el margen izquierdo de modo que el texto
y Footer() es invocada en el
# aparezca en la columna izquierda (a partir de los 10 mm).
momento en que encuentra un
salto de pgina y dependiendo del $this->SetLeftMargin(10);
valor que devuelva (true false) # cambia el punto de insercion al nuevo margen izquierdo
se ejecuta no la funcion AddPage $this->SetX(10);
(). # establecemos que la funcin devuelva true
# con ello genera un salto de pgina
Tal como est diseada esta clase # y la insercion de texto continua en la pagina siguiente
devolver el valor que tenga return true;
asignado AutoPageBreak() (true }
false) pero, igual que ocurra con
}
Header() y Footer() permite incluir
otra funcin con el mismo nombre }
en una clase extendida. La /* establecemos el tamao de la pgina
condicin de la nueva funcin es que tendr 140 mm. de ancho.
que, al igual que ocurre con esta, Si establecemos un margen por la izquierda de 10 mm.
habr de devolver un valor un margen por la derecha de otros 10 mm.
booleano (cierto falso). y un espacio entre columnas de 5 mm. nos restan
140-25=115 mm. que repartidos entre dos columnas
Esta posibilidad aade nuevas e les daran un ancho de 115/2=57,5 mm.
interesantes funcionalidades al uso
Las primera columna comenzar en 10 y acabar en
de la clase FPDF. Una de las
posibilidades podra ser la de crear
10 +57,5=67.5 mm. La segunda deber empezar en
documentos con varias columnas 72.5 (aadiendo 5 mm. de espacio entre columnas */
(estilo periodstico). La forma de $dimensiones=array (140,200);
proceder (una de las posibles) la # creamos el nuevo objeto partiendo de la clase ampliada
tienes descrita en el ejemplo que $MiPDF=new GranPDF('P','mm',$dimensiones);
hemos incluido a la derecha. # ajustamos al 100% la visualizacin
$MiPDF->SetDisplayMode('fullpage');
Otras opciones # insertamos la primera pgina del documento
$MiPDF->Addpage();
# cambiamos el estilo de fuente a "normal"
Adems de las funciones que
$MiPDF->SetFont('Times','',12);
hemos descrito a lo largo de esta
# establecemos un color de fondo para las celdas de texto
pgina, existen clases extendidas
que incluyen nuevas, y en algunos # y el color de la tipografia
casos muy interesantes, funciones $MiPDF->SetFillColor(240,240,240);
que resuelven problemas $MiPDF->SetTextColor(0,0,0);
especficos concretos a la hora de # leemos un fichero de texto y lo recogemos en una variables
crear ficheros PDF. Algunas de $f1=fopen('regenta.txt','r');
ellas estn disponibles desde el $regenta1=fread($f1,filesize('regenta.txt'));
propio sitio FPDF de Olivier
fclose($f1);
PLATHEY. # insertamos el fichero mediante Multicell
Una de las utilidades ms # el ancho 57.5 estable el ancho de columna igual
interesantes -desde luego que ni # para la derecha que para la izquierda La interlinea ser de 4mm.
mucho menos nicas- de este tipo # el texto que se incluir (con salto de lnea automtico
de formatos podra ser la # e insercin automtica de nuevas pginas cuando se hayan completado
paginacin de los resultados de las # las dos columnas) ser el recogido
consultas en bases de datos. # del fichero de texto. La celda no tendr bordes
# el texto estar justificado y SI tendr relleno de fondo.
Cuando nos encontremos en esa $MiPDF->Multicell(57.5,4,$regenta1,0,'J',1);
situacin podremos utilizar un
# establecemos la visualizacin del documento
procedimiento casi idntico al
usado en el ejemplo sobre las $MiPDF->Output();?>
tablas de alimentos.
Programas necesarios
Proceso de generacin de fuentes
Esta primera imagen es la visualizacin del directorio fuentes de estos materiales. Podrs
Para generar las nuevas fuentes es observar que contiene fuentes TrueType y el ejecutable ttf2pt1.
necesario disponer del programa
ttf2pt1.exe. Si accedemos a este Hemos incluido dos fuentes TrueType llamadas bobcayge.ttf y bobcaygr.ttf. Sern las que
enlace podemos ver, en la zona de utilizaremos para aadir nuevas opciones de fuentes a nuestros PDF's.
descargas, una opcin dnde dice
Complete package, except sources
desde el que podemos descargar el
fichero ttf2pt1-3.4.4.exe.
Cuidado!
En el directorio fuentes
tienes los ficheros cayge.
afm y caygr.afm generados
segn el proceso descrito al
margen.
Nos generar dos ficheros con el nombre asignado al nuevo fichero y extensiones .afm
y .t1a tal como puedes ver en la imagen.
Definicin de las fuentes
En estos dos ejemplos pueden verse los resultados -con algunos problemas grficos- de
la sustitucin de las fuentes en algunos de los ejemplos de pginas anteriores.
ejemplo145.php ejemplo146.php
Qu es un header?
Utilizacin de header
En este ejemplo se utilizan algunas header e incluimos como comentarios las
En un documento PHP se pueden utilidades de cada una de ellas
incluir instrucciones que obliguen
al navegador del cliente a
comportarse de una manera <?
determinada. #esta variable recoge el nombre del fichero a visualizar
$fichero="ejemplo132.pdf";
Esas instrucciones que dicen al #esta funcin determina la longitud en bytes del fichero
navegador del cliente cmo tiene $len = filesize($fichero);
que comportarse, van contenidas /* esta cabecera -vlida para HTTP/1.1- ordena al navegador
en la header de la pgina y que no permita guardar la pgina
pueden resultar muy tiles como
que no permita que se almecene en la cach del cliente*/
complemento de otras funciones.
header("Cache-Control: no-store, no-cache, must-revalidate");
Su nombre se debe a que han de /* esta otra cabecera -vlida para HTTP/1.0
ser obligatoriamente lo primero indica al navegador que no guarde la pgina en la cach del cliente
que ha de recibir el navegador en he puesto ambas opciones para cubrir todo el especto probable */
el momento de ser atendida su header("Pragma: no-cache");
peticin. El grado de exigencia de /* esta cabecera especifica al navegador el contenido
esta condicin es tal que ni que va a recibir que en este caso no sera otra cosa
siquiera se permite que les que algo que requiere una aplicacion capaz de interpretar
preceda ni una lnea en blanco.
ficheros pdf */
header("Content-type: application/pdf");
Cmo colocar las /* como la norma de los headers establece que
cabeceras? siempre que se conozca el tamao del contenido enviado
se incluya en la cabecera ese contenido, pues...
Los header han de colocarse de incluimos el tamao ya que "filesize" nos midi el fichero
forma que sus contenidos sean lo y guardo esa medida en la variable $len...
primero que aparezca en la pgina pero... fue posible utilizar esa funcin antes de las header
que llega al cliente y eso significa porque esa medida no fue mandada a la salida...
que: si hubiramos escrito antes de los header... algo as como
Echo $len; ... la habramos fastidiado...
No puede aparecer delante de un ya habramos tenido error en las cabeceras...*/
header ninguna etiqueta HTML ni
header("Content-Length: $len");
ningn contenido de este tipo.
/* con esta otra header indicamos ls forma de presentacin de
Ni siquiera se permite que se les el contenido del documento... permite dos posibilidades
anteponga una lnea en blanco. inline (la que he puesto aqu) o
attachment (que seria como fichero anexo)
Requieren muchsima atencin y fijate que en este "header" he puesto en filename un nombre distinto
cerciorarse siempre de que la del que tena el fichero original... eso no tiene importancia
marca del comienzo del script PHP
solo ser el nombre con el que se guardar en la cach del cliente
(<?) est siempre en la primera
lnea del documento, sin dejar
en el caso de que no hubiramos incluido la cabecera "no cache"
lneas en blanco delante de ella. que dicho sea de paso... la he puesto aqu como ejemplo
pero que seran absolutamente innecesarias para este ejemplo
Puede que te preguntes: ha de ir de visualizacin del documento */
tambin en la primera lnea del header("Content-Disposition: inline; filename=felipe.pdf");
script PHP? /* ya se acabaron las cabeceras del documento
aqu le decimos al servidor que lea el fichero y lo envie
La respuesta es esta: tienen que ir
al navegador del cliente... este ya lo interpretar
antes de la primera funcin que
genere una salida hacie el siguiendo las especificaciones que le hemos incluido
navegador del cliente. las cabeceras....*/
readfile($fichero);
Intentaremos aclarar esta idea. ?>
Los scripts PHP (lo contenido
entre <? y ?>) se ejecutan en el ejemplo148.php
servidor y de ellos slo llegan al
navegador del cliente los
resultados de la ejecucin (las Visualizacin ficheros PDF creados en memoria
salidas echo o print, por citar dos
ejemplos). <?
Las cabeceras han de llegar al # Creamos el PDF con las nuevas funcionesn>
navegador antes que esas posibles $g = PDF_new();
salidas, lo cual no es bice para pdf_open_file($g);
que se puedan efectuar antes de # A partir de aqu todo es igual a los ejemplos anteriores
insertar las headers procesos que pdf_begin_page($g, 595, 842);
no produzcan salidas de tipo print, $imagen1 = pdf_open_jpeg($g, "./images/cruz.jpg");
echo, etctera. $h=0.5;
$v=0.8;
La sintaxis de algunas header vara
en algunos casos lo podemos ver
pdf_save($g);
en el ejemplo segn el protocolo $x1 = pdf_get_value($g, "imagewidth", $imagen1);
que utilice el servidor. Lo habitual $y1 = pdf_get_value($g, "imageheight", $imagen1);
es que lo servidores utilicen uno pdf_scale($g,$h,$v);
de estos: HTTP/1.1 HTTP/1.0. pdf_place_image($g, $imagen1, ((595/$h-$x1)/2), (842/$v-$y1), 1.0);
pdf_close_image ($g,$imagen1);
Para saber cul utiliza nuestro pdf_restore($g);
servidor basta con visualizar el info. pdf_save($g);
php y buscar la directiva $imagen2 = pdf_open_gif($g, "./images/cruz.gif");
SERVER_PROTOCOL. $ancho=150;
$alto=325;
Los diferentes haeder $x1 = pdf_get_value($g, "imagewidth", $imagen2);
$y1 = pdf_get_value($g, "imageheight", $imagen2);
$h=$ancho/$x1;
En los ejemplos que aparecen en
la columna de la derecha estn $v=$alto/$y1;
comentadas algunas de las pdf_scale($g,$h,$v);
cabeceras que es posible insertar pdf_place_image($g, $imagen2, ((595/$h-$x1)/2), 200, 1.0);
en los ficheros PHP. pdf_close_image ($g,$imagen2);
pdf_restore($g);
Cabra aadir la siguiente:
PDF_end_page($g);
header("Location:direccin") pdf_close($g);
# Despus del pdf_close empezamos la lectura del buffer
Mediante este header se $buffer = PDF_get_buffer($g);
redirecciona el navegador a la URL /* Esta porcin de cdigo es idntica a la del ejemplo anterior
(absoluta o relativa) que se con la nica diferencia que ahora medimos la longitud de la cadena
indicada en el parmetro direccin.
buffer en vez de la longitud de un fichero como hacamos all */
Cuando el navegador recibe un $len = strlen($buffer);
header de este tipo realiza de Header("Content-type: application/pdf");
forma automtica la peticin de la Header("Content-Length: $len");
pgina indicada en l. Header("Content-Disposition: inline; filename=loquesea.pdf");
# Escribimos en el documento que se enviar al cliente
Otra funciones PDF # el contenido de la cadena buffer
echo $buffer;
/* liberamos la memoria que contena el fichero
Existe una funcin muy til para con lo cual el documento solo aparecer en el navegador del cliente
un montn de propsitos que PHP
y en la cach de este (con el nombre loquesea.pdf).
empez a incluir a partir de la
versin 4.0.5. Se trata de la Si no queremos que se almacene en la cach sera solo cuestin de
funcin incluir las cabeceras no cach del ejemplo anterior */
pdf_delete($g);
$b=pdf_get_buffer($p) ?>
Esta funcin recoge en una
variable $b el contenido de un ejemplo149.php
documento PDF -identificado por
$p- pudiendo enviarlo al
navegador directamente desde la Una opcin alternativa
memoria del servidor y que, por
tanto, no necesita ser escrito ni En el caso de que no sea posible utilizar las funciones anteriores por incompatibilidad
almacenado en el servidor. de versiones PHP o de las propias libreras PDF, se puede recurrir a un truco. Se trata de
escribir el fichero PDF en servidor, enviarlo al cliente y, posteriormente, borrarlo. Ello
La utilizacin de esa funcin servira, al menos, para economizar espacio de almacenamiento en el servidor.
requiere una modificacin en la
sintaxis -respecto a la de los
ejemplos anteriores- y el uso de <?
dos funciones nuevas, que son: # creo un fichero de la misma forma que
# lo hacamos en ejemplo de pginas anteriores
$p=pdf_new() $filename="leocadio.pdf";
$f = fopen($filename, "w");
que es la funcin que generar un
identificador de recurso, distinto $g = pdf_open($f);
de los que hemos venido utilizando pdf_begin_page($g, 595, 842);
hasta ahora, ($p) para el nuevo /* aqui insertaramos el cdigo
fichero PDF y que debe insertarse para la generacin del pdf.
delante de: En este caso lo cerramos en blanco */
pdf_open_file($p) PDF_end_page($g);
que abrira un fichero pdf en
pdf_close($g);
memoria. # cerramos el fichero leocadio.pdf
fclose($f);
Como observars esta sintaxis /* ahora insertamos exactemente el codigo
difiere de la que hemos venido del primer ejemplo de esta pgina.
utilizando hasta ahora y que era la Fijate que pese a haber escrito un montn de cdigo
siguiente: aun estamos a tiempo de insertar las funciones de cabecera
ya que NO HE ENVIADO AUN NINGUNA SALIDA AL NAVEGADOR
$f = fopen(nombre, "w");
$g = pdf_open($f) eso s, no olvides que delante de <? no puede haber
ninguna linea en blanco...*/
Con esta sintaxis, crebamos $len = filesize($filename);
(mediante la funcin fopen) un header("Content-type: application/pdf");
documento en el servidor y su header("Content-Length: $len");
identificador de recurso ($f); header("Content-Disposition: inline; filename=felipe.pdf");
luego, creabmos un segundo readfile($filename);
identificador de recurso $g por
/* ahora que ya he enviado
medio de pdf_open que
el contenido del fichero pdf al navegador
asocibamos con el anterior para
que los resultados de las funciones ya puedo borrar el fichero del servidor
pdf se fueran escri- biendo en el unlink($filename);
fichero abierto con la primera /* como habrs observado
instruccin. se trata de una chapuza en tres actos
1.- Cramos el fichero en el servidor y lo cerramos
Ahora no necesitamos crear 2.- Leemos el contenido del fichero
ningn documento y bastar con 3.- Borramos el fichero del servidor */
un solo identificador de recurso, ?>
que es, la salida de la funcin
pdf_new.
ejemplo150.php
La aplicacin MySql
Organizacin de la informacin
Una de las opciones ms tiles de Hemos instalado MySQL en el directorio c:\mysql y durante el proceso de instalacin
PHP es la posibilidad de gestionar se cre un subdirectorio llamado data que es el destinado a albergar todas las bases de
bases de datos en ordenadores datos que vayamos creando.
remotos.
Como puedes ver en la tabla siguiente, durante la instalacin se crearon dos bases de
Existen multitud de programas de datos llamadas mysql y test.
servidores de bases de datos y
PHP dispone de funciones para el El directorio MySQL
manejo de muchos de ellos tales
como:
FilePro
dBase
DBM
Microsoft SQL
PostgreSQL
mSQL
InterBase
MySQL
Si ello te ocurriera, comprueba el En los scripts PHP con los que manejemos las bases de datos vamos a necesitar
semforo. Probablemente esa ser insertar continuamente: nombre del servidor, nombre de usuario y contrasea.
la causa del error.
Tanto la comodidad como la privacidad que hemos mencionado en pginas anteriores
aconsejan guardar los datos de usuario en lugar seguro. As que vamos a crear un fichero
llammosle mysql.inc.php idntico al que tenemos aqu debajo,(podemos copiar y
pegar) y guardmoslo en nuestro directorio de seguridad que como recordars estaba
en c:\apache\seguridad.
<?
$mysql_server="localhost";
$mysql_login="pepe";
$mysql_pass="pepa";
?>
Si aadimos a la instruccin El parmetro ZEROFILL slo tiene sentido junto con la opcin UNSIGNED ya que no es habitual
$c=mysql_conect('h','u','p') (sin rellenar los nmeros negativos con ceros a la izquierda del signo.
parntesis, ni comas, ni punto y
El valor por defecto de parmetro M (nmero de cifras) es 4 si no est activada la opcin UNSIGNED.
coma, slo separado por un
Si esta opcin estuviera activada el valor por defecto sera M=3. Para valores de M >valor por
espacio): defecto reajusta el tamao al valor por defecto.
or die ('mensaje') Si se asigna a M un valor menor que cuatro limita el nmero de caracteres al tamao especificado
considerando el signo slo en los nmeros negativos.
y ponemos el punto y coma de fin
de instruccin despus de cerrar Por ejemplo, si M=3 admitira 148, pero si intentamos insertar -148 recortara por la izquierda y solo
este ltimo parntesis, en el caso insertara -14.
de que se produzca un error se
Si intentamos insertar un valor fuera de rango registrara el valor dentro del rango ms prximo
interrumpir la ejecucin del script
a l.
y apare- cer en la ventana del P. ej.: Si tratamos de insertar el valor 437 escribira 127 255, este ltimo en el caso de tener la
navegador el texto incluido en opcin UNSIGNED.
mensaje. Si pretendiramos insertar -837 con la opcin UNSIGNED escribira 0 y sin ella pondra -128.
Son vlidos los comentarios hechos para TINYINT, excepto los relativos a los valores por defecto de
Este tipo de mensajes pueden M que en este caso seran 6 5. Su tamao es de 2 bytes.
deshabilitarse haciendo una
modificacin en php.ini. Pero hay
una tcnica mucho ms fcil. MEDIUMINT [(M)] [UNSIGNED] [ZEROFILL]
Bastar con insertar delante de la
funcin una arroba (@) para evitar
Nmero entero mediano. Con la opcin UNSIGNED puede tomar valores entre 0 y 16 777 215. En
que aparezcan. En este otro script caso contrario, puede estar comprendido entre -8 388 608 y 8 388 607.
lo hemos incorporado y puedes
comprobarlo aqui. Tambin son vlidos los comentarios hechos para TINYINT, excepto los relativos al valor por
defecto de M que en este caso seran 8. Su tamao es de 3 bytes.
$p=mysql_list_dbs($c) Nmero entero grande. Con la opcin UNSIGNED puede tomar valores entre 0 y 18 446 744 073
709 551 615. En caso contrario, puede estar comprendido entre -9 223 372 036 854 775 808 y
La variable $p es un nuevo 21 474 839 223 372 036 854 775 807 647, pero al usarlo desde PHP estar sujeto a las
identificador imprescindible y limitaciones mximas de los valores numricos de este.
previo a la determinacin del
nmero y los nombres de las Son vlidos todos los comentarios de los casos anteriores. Su tamao es de 8 bytes.
bases de datos existentes en el
enlace abierto (identificado por $c).
Nmeros de coma flotante
$n=mysql_num_rows($p)
Esta funcin devuelve el nmero Por la estructura binaria de los microprocesadores y habida cuenta de que algunos
de bases de datos existentes en el nmeros no enteros -sin ir ms lejos, el 0.1- requeriran infinitos caracteres binarios
servidor. para su representacin exacta, se hace necesario introducir un redondeo en su
tratamiento informtico y como consecuencia de ello asumir que se generan errores de
Utiliza como parmetro ($p) el
medida.
resultado obtenido mediante la
funcin anterior.
Esta circunstancia oblig al tratamiento de los nmeros decimales mediante el llamado
Ese nmero puede recogerse en Standar de Aritmtica de Punto Flotante, un algoritmo definido por la IEEE (Institute
una variable (en este caso $n). of Electrical and Electronics Engineers) que unific los procesos de representacin de
nmeros en ordenadores con lo que son uniformemente controlables los errores
mysql_db_name($p, i) introducidos.
Esta nueva funcin devuelve el El Standar de Aritmtica de Punto Flotante estableci dos niveles de precisin:
nombre de una de las bases de
datos, identificada por un nmero i
que debe pertenecer al intervalo Precisin Simple, en la que todo nmero debe ser almacenado en 32 bits
[0,$n). (4 bytes)
Doble precisin, en la que los nmeros se almacenan en 64 bits (8 bytes).
Fjate que i tiene que ser i<$n
porque si, por ejemplo, $n=5 los
cinco valores posibles de i seran: MySQL admite los siguientes tipos de nmeros de coma flotante:
0,1,2,3 y 4.
-3.402823466E+38 a -1.175494351E-38
Crear una base de datos
0y
1.175494351E-38 a 3.402823466E+38.
La creacin de una base de datos
tambin requiere una conexin M es la anchura mxima de visualizacin y D es el nmero de decimales. Si M > 24 se convierte
previa y utiliza la siguiente sintaxis: automaticamente a doble precisin
FLOAT sin argumentos representa un nmero de coma flotante y precisin simple.
mysql_query
("CREATE DATABASE nom")
Esta funcin devuelve TRUE si la Nmero de coma flotante de doble precisin. Siguen siendo vlidos los comentarios relativos a las
base de datos es creada, y FALSE opciones UNSIGNED y ZEROFILL del caso anterior.
si no es posible hacerlo.
Toma valores en los intervalos siguientes:
Si intentamos crear una base de
datos con un nombre ya -1.7976931348623157E+308 a -2.2250738585072014E-308
existente la funcin nos devolver 0y
FALSE. 2.2250738585072014E-308 a 1.7976931348623157E+308
Es muy necesario conocer los Su tamao es de M bytes siendo 1 <= M <= 255 .
diferentes tipos de campos que
pueden contener las tablas de VARCHAR(M) [BINARY]
MySQL. Aqu a la derecha los
tienes.
Es una cadena de caracteres de longitud variable. Su tamao mximo -especificado en el
Conocer las posibilidades de cada parmetro M- puede estar comprendido entre 1 y 255 caracteres. Con la opcin BINARY es capaz de
uno ser fundamental a la hora de discriminar entre Maysculas / minsculas.
disear una tabla. En ese
momento tendremos que decidir TINYBLOB o TINYTEXT
qu campos son necesarios, cul
es tipo requerido, cules han de
ser sus dimensiones y tambin TINYBLOB y TINYTEXT son cadenas de caracteres de longitud variable con un tamao mximo
cules de ellos requerirn ser de 255 (28 - 1) caracteres.
tratados como ndices. La diferencia entre ambas es que TINYBLOB discrimina entre Maysculas / minsculas, mientras
que TINYTEXT no lo hace.
Tipos de campo bien elegidos y un
tamao adecuado a las Ninguno de los campos BLOB y TEXT admite valores por DEFECTO
necesidades reales de nuestro
proyecto son las mejores garantas Las versiones de MySQL anteriores a 3.23.2 permiten utilizar estos campos para indexar.
para optimizar el tamao de la
Si se intenta guardar en un campo de este tipo una cadena de mayor longitud que la especificada
tabla y para hacerla realmente solamente se guardarn los M primeros caracteres de la cadena.
eficaz.
Una vez hecho esto, escribe tu Es una cadena de caracteres que contiene uno solo de los valores de la lista (valor1, valor2, etc.
etc.).
propio script y crea una segunda
base de datos como el nombre A la hora de insertar un nuevo registro en una tabla, el valor a especificar para un campo de este tipo
practicas. Esta ser la que habrs ha de ser una cadena que contenga uno de los valores especificados en la tabla. Si se tratara de
de utilizar en ejercicios que insertar un valor distinto de ellos insertara una cadena vaca.
tendrs que ir haciendo en el resto
del curso.
SET('valor1','valor2','valor3'...)
Cuidado!
Antes de continuar, es
Es una cadena de caracteres formados por la unin de ninguno, uno o varios de los valores de una
conveniente comprobar lista. El mximo de elementos es 64.
desde Windows que el
directorio c:\mysql\data Los valores que deben escribirse en los campos de este tipo han de ser numricos, expresados en
forma binaria o en forma decimal.
contiene las bases de datos
ejemplos y practicas En el supuesto de que contuviera tres valores los posibles valores a insertar en un campo de este
tipo a la hora de aadir un registro seran los siguientes.
Creacin de tablas
Crear una tabla MySQL
Las tablas son elementos de las La creacin de tablas MySQL requiere una de estas dos sentencias:
base de datos. Por esa razn nos
resultar imposible crear una CREATE TABLE IF NOT EXISTS tabla (campo1, campo2,... )
tabla sin tener creada y
seleccionada una base de datos. CREATE TABLE tabla (campo1, campo2,... )
Es por eso que para la creacin de
La nica diferencia entre ambas opciones es que la segunda dara un error si tratramos
una tabla se necesitan los
siguientes requisitos: de crear una tabla preexistente (deberamos recurrir al procedimiento que hemos visto
cuando crebamos bases de datos) mientras que la primera no da ese mensaje de error.
Tener abierta una conexin con
el servidor MySQL. Aunque no lo hemos indicado, CREATE DATABASE tambin permite esta sintaxis
alternativa.
Tener seleccionada una base de
datos.
Definicin de campos en una tabla MySQL
Conexin con el servidor
La hemos comentado en la pgina Cada uno de los campos que vayamos a crear en una tabla requiere una definicin que
anterior, recuerda que requera la debe contener lo siguiente:
funcin:
nombre del campo
$c=mysql_connect(h, u, p) Es una palabra cualquiera distinta para campo de la tabla y que normalmente suele
elegirse aludiendo al contenido. Por ejemplo, fec_nac, nom_perro, etctera.
Esa conexin ha de ser establecida
antes de cualquier otra
intervencin relacionada con No va entre comillas nunca y MySQL diferencia maysculas/minsculas.
accesos a bases de datos y tablas.
Para utilizar como nombres de campo palabras reservadas por ejemplo, create del
Seleccin lenguaje MySQL debemos escribirla entre ` `. Observa que no son comillas sino acentos
de la base de datos graves. Lo ms aconsejable es evitar esta situacin.
Dado que podemos manejar bases
de datos distintas en este curso
tipo y dimensiones
usaremos ejemplos y practicas es Los tipos de campos los hemos visto en la pgina anterior tienen que ajustarse a uno
preciso decir a MySQL con qu de los soportados por MYSQL. Se escriben a continuacin del nombre sin otra separacin
base queremos trabajar. que un espacio y requieren la sintaxis estricta correspondiente a cada tipo.
mysql_select_db("n", $c); flags del campo ( son opcionales) Puede utilizarse cualquiera de los permitidos para
cada tipo de campo puedes verlos encerrados entre corchetes al lado de cada tipo de
donde n es el nombre de la base
de datos (puede ser una cadena campo.
entrecomillada o el nombre de una
variable previa que contenga ese Ejemplo de creacin de una tabla
nombre). En este ltimo caso,
como es habitual, el nombre de la
variable no llevara comillas.
<?
/* nos conectamos con el servidor
El segundo parmetro $c es el recogiendo en $c el identificador de conexin */
identificador de conexin. Es decir, $c=mysql_connect ("localhost","pepe","pepa") or die ("Imposible
la variable creada al establecer la conectar");
conexin con MySQL. # seleccionamos una base de datos existente
# de lo contrario nos dara un error
Este valor debe insertarse
# pondremos como nombre ejemplos nuestra base de datos
siempre. La razn es que MySQL
permite mantener abiertas, de # creada en la pgina anterior y usaremos $c
forma simultnea, varias # importante no olvidarlo
conexiones (podramos manejar mysql_select_db ("ejemplos", $c);
ms de un servidor de bases de /* ahora ya estamos en condiciones de crear la tabla
datos) y en esas condiciones sera podramos escribir ya la instruccin mysql_query y meter
necesaria una conexin distinta detro la sentencia MySQL pero, por razones de comodidad
para cada servidor. crearemos antes una variable que recoja toda la sentencia
y ser luego cuando la ejecutemos.
Creacin de una tabla Definiremos una varable llamada $crear e iremos aadiendo cosas */
En todas las transacciones PHP # la primera parte de la instruccin es esta (espacio final incluido
MySQL habremos de utilizar $crear="CREATE TABLE IF NOT EXISTS ";
instrucciones de ambos lenguajes. # aadiremos el nombre de la tabla que ser ejemplo1
La forma habitual hay algunas # fijate en el punto (concatenador de cadenas) que permite
excepciones en la que PHP se # ir aadiendo a la cadena anterior
comunica con MySQL es la funcin: $crear .="ejemplo1 ";
#ahora pongamos el parntesis (con un espacio delante)
mysql_query("sent", $c); #aunque el espacio tambin podra detrs de ejemplo1
donde la cadena sent contiene las $crear .="( ";
instrucciones propias de MySQL # insertemos el primer campo y llamemoslo num1
las comentamos al margen y $c # hagamoslo de tipo TINYINT sin otras especificamos
sigue siendo la variable que # sabiendo que solo permitira valores numricos
contiene el identificador de # comprendidos entre -128 y 127
conexin. $crear .="num1 TINYINT , ";
# LOS CAMPOS SE SEPARAN CON COMAS por eso
La sintaxis de las sentencias
# la hemos incluido al final de la instruccin anterior
MySQL que crean tablas la
tenemos en la columna de la
derecha. # ahora num2 del mismo tipo con dimensin 3 y el flag UNSIGNED
# Y ZEROFILL que: cambiar los lmites de valores
DIMENSIONES # al intervalo 0 - 255, y rellenar con ceros por la izquierda
# en el caso de que el nmero de cifras significativas
Cuando se establezca una # sea menor de 3.
dimensin como parmetro # Fijate que los flags van separado unicamente por espacios
opcional de un campo deben $crear .="num2 TINYINT (3) UNSIGNED ZEROFILL, ";
tenerse en cuenta algunos detalles. # en num3 identico al anterior aadiremos un valor por defecto
Si en un campo numrico # de manera que cuando se aadan registros a la tabla
# se escriba automaticamente ese valor 13 en el caso
introdujramos valores que
# de que no le asignemos ninguno a ese campo
exceden los lmites su valor no se
# por ser numrico 13 no va entre comillas
registrara en la tabla sino el valor
$crear .="num3 TINYINT (7) UNSIGNED ZEROFILL DEFAULT 13, ";
del lmite ms prximo
correspondiente a ese tipo de # ahora un nmero decimal num4 tipo REAL con 8 digitos en total
campo. # de los cuales tres sern decimales y tambin rellenaremos con ceros
# Pondremos como valor por defecto 3.14
Supongamos un campo tipo $crear .="num4 REAL (8,3) ZEROFILL DEFAULT 3.14, ";
TINYINT que permite valores # aadamos una fecha
comprendidos entre -128 y 127. Si $crear .="fecha DATE, ";
asignramos en uno de sus /* una cadena con un limite de 32 carcter con BINARY
registros un valor igual a 234 se
para que diferencie Pepe de PEPE */
escribira en la tabla 127 (el lmite
$crear .="cadena VARCHAR(32) BINARY, ";
superior) y si ponemos -834
escribira el lmite inferior, es decir, /* un ultimo campo opcion del tipo ENUM que solo admita
-128. como valores SI, NO, QUIZA
fijate en las comillas y en el parentesis
En caso de cadenas, si el valor cuidado...!! aqui no ponemos coma al final
introducido sobrepasara la longitud es el ltimo campo que vamos a insertar y no necesita
mxima permitida, la cadena sera ser separado. Si la pones dar un ERROR */
recortada y nicamente se $crear .="opcion ENUM('Si','No','Quiza') ";
registrara el nmero mximo de
# solo nos falta aadir el parntesis conteniendo toda la instruccin
caracteres permitidos.
$crear .=")";
Consideraciones /* tenemos completa la sentencia MYSQL
solo falta ejecutarla mediante mysql_query
sobre IF NOT EXISTS
ya que la conexin est abierta
Esta variante de CREATE y la base de datos ya est seleccionada */
aplicable tanto en tablas como en
bases de datos tiene la ventaja /* pongamos un condicional de comprobacin */
de no dar mensajes de error en if(mysql_query($crear,$c)){
caso de intentar crear una tabla o print "Se ha creado la base de datos<br>";
base ya existente, pero puede print "La sentencia MySQL podramos haberla escrito asi:<br>";
darnos algn sobresalto porque no print "mysql_query("."\"".$crear."\" , $c);";
advierte que la tabla no ha sido
}else{
creada y puede darnos la
sensacin de que puede haber
print "Se ha producido un error al crear la tabla";
reescrito una tabla anterior. }
?>
Si pulsas reiteradamente en el
enlace Crear tabla ejemplo1
comprobars que no aparece Crear tabla
ningn mensaje de error. ejemplo1
Ejercicio n 38
Como prctica de creacin de tablas, debers crear en tu base de datos practicas una
tabla a la que llamaremos tabla1 que recoja al menos en diferentes campos, los siguientes
datos de tus alumnos: DNI (con letra incluida), nombre, apellidos (en campos diferentes),
fecha de nacimiento, y en un campo tipo ENUM su condicin de repetidor o no.
Visualizar la estructura de
Ver la estructura de una tabla utilizando MySQL
una tabla La sentencia MySQL que permiten visualizar la estructura de una tabla es la siguiente:
Los resultados devueltos por estas $resultado=mysql_query( "SHOW FIELDS from $tabla",$c);
sentencias requieren ser
convertidos a un formato que sea # determinamos el nmero campos de la tabla
interpretable por PHP.
$numero=mysql_num_rows($resultado);
Esa traduccin se realiza de la
siguiente forma:
# Presentamos ese valor nmerico
El resultado devuelto por MySQL a
travs de una llamada print "La tabla tiene $numero campos<br>";
mysql_query() es recogido en
una variable, de la forma siguiente: # ejecutamos los bucles que comentamos al margen
while($v=mysql_fetch_row ($resultado)){
$r=mysql_query(sent, $c)
foreach($v as $valor) {
El resultado recogido en la variable echo $valor,"<br>";
$r, est estructurado en lneas y la }
funcin: }
$t =mysql_fetch_row ($r)
Nos devuelve la longitud del Borrar uno de los campos de una tabla
campo correspondiente a la
posicin en la tabla sealada por el La sentencia MySQL que permite borrar uno de los campos de una tabla es la
ndice $i. Igual que las anteriores siguiente:
en lo relativo a los ndices.
ALTER TABLE nombre de la tabla DROP nombre deL campo
mysql_field_name($rs, $i)
Es posible modificar la estructura de una tabla -en este caso borrar un campo-
Nos devuelve el nombre del siguiendo un procedimiento similar a los anteriores.
campo correspondiente a la
posicin en la tabla sealada por el La nica diferencia estriba en utilizar la sentencia MySQL adecuada.
ndice $i. En lo relativo a los
ndices su comportamiento es Resulta obvio que el campo debe existir para que pueda ser borrado y si no existiera,
idntico a las anteriores. es obvio tambin que se producira un error.
Liberando memoria Aqu tienes el cdigo fuente de un script que borra uno de los campos de una tabla.
Aqu tienes el cdigo fuente de un script que aade uno de los campos de una tabla.
Manejando ndices
Aadir registros a una tabla
Las sentencias MySQL que permiten aadir registros a una tabla son las siguientes:
Es muy frecuente la utilizacin de INSERT tabla (campo1,campo2,..) VALUES (valor1,valor2,..)
ndices en las bases de datos.
Pero... qu son los ndices? para Vamos a desarrollar un ejemplo completo de creacin de una tabla e insercin de
qu sirven?. registros utilizando diversos mtodos. Para ello seguiremos el siguiente proceso:
Si nos planteamos cul es la
utilidad del ndice de un libro la 1.- Creacin de la tabla
respuesta sera:
Empezaremos creando una tabla a la que llamaremos demo4 y que contendr los
Facilitar la bsqueda de siguientes campos:
datos
Agilizar esa bsqueda
Contador, que ser de tipo TINYINT(8) (nmero entero con un mximo de 8
dgitos) que contenga solo valores positivos, que se rellene automticamente
La utilidad de los ndices en la
bases de datos es la misma.
con ceros por la izquierda y que se autoincremente cada vez que aadimos un
registro.
DNI, destinado a recoger valores de nmeros de DNI y que debe poder contener
Tipos de ndices un mximo de ocho caracteres.
Lo definiremos de tipo CHAR porque sus valores, pese a ser numricos, nunca van
Si seguimos con el ejemplo del a requerir ningn tratamiento aritmtico.
libro veremos que caben las Nombre, Apellido1 y Apellido2 sern tres campos tipo VHAR de tamaos
posibilidades de que tenga: mximos respectivos de 20, 15 y 15 caracteres.
Su finalidad la evidencian los nombres de campo. Les asignaremos el flag NOT
Un solo ndice NULL aunque no sea totalmente correcto dado que existen pases en los que se
Varios ndices utiliza un solo apellido.
Nacimiento ser un campo tipo DATE al que asignaremos como valor por
Algunos libros slo contienen un defecto el de 1970-12-21. Recuerda que MySQL trata las fechas en ese orden
indice de contenidos. Sin (ao-mes-dia) y que admite como separadores tanto - como / por lo que son
embargo, es frecuente que vlidas entradas con cualquiera de estos formatos: 1970-12-21 1970/12/21,
tambin dispongan de otros, tales aunque esta segunda es convertida automaticamente al primer formato por
como: ndices analticos, ndices MySQL.
onomsticos, etctera. Hora ser un campo tipo TIME al que asignaremos como valor por defecto el de
00:00:00. Recuerda que MySQL trata las horas en ese orden (hh:mm:ss) y que
Cuando existe un solo ndice es
slo admite como separador :.
obvio que puede decirse de l que
es nico y cuando existen varios Este campo est destinado a recoger la hora de nacimiento que aunque no tiene
podemos decir que el ndice de demasiado sentido es una buena excusa para introducir este tipo de campo.
contenidos es el ndice principal Sexo ser un campo tipo ENUM que tendr dos opciones: M (masculino) y F
y los dems son ndices sin ms o (femenino) y al que asignaremos M como valor por defecto.
ndices auxiliares. Fumador ser un campo tipo CHAR(0) que por su estructura -cadena de longitud
cero- tendr dos nicas opciones de valor: NULL "", que, como veremos, son
Coincidirs con nosotros en que en valores distintos para MySQL
el ndice de contenidos de un libro
Idiomas ser un campo tipo SET definido para los valores: Castellano, Francs,
de texto slo existe una referencia
Ingls, Alemn, Blgaro y Chino y que podr contener, como ocurre con los
al Tema XIII en la que puede
decir: Tema XIII pgina 314. campos de este tipo, ninguno, uno o varios de los valores de la lista.
ndice primario ser tratado como tal el campo DNI ya que se trata de un valor
Tambin coincidirs en que si en nico para cada persona y que, como tal, no puede tener duplicados
ese ndice, adems de lo anterior, ndices auxiliares. Para ejemplificar su tratamiento consideraremos el campo
dijera: Tema XIII pgina 714 nos Contador como ndice secundario.
encontraramos en una situacin
confusa que nos obligara a
preguntarnos: donde est el El cdigo fuente del fichero que genera esta tabla puedes verlo aqu debajo
Tema XIII? En la pgina 314? En
la 714? En ambas?. Ver cdigo fuente
Es por eso que las tablas de las Presta atencin a los siguientes aspectos:
bases de datos tambin admiten
duplicados cuando se trata de
ndices auxiliares. En la sentencia no se alude al campo Contador. La razn es que se trata un
campo AUTOINCREMENTAL y en ese tipo de campos los valores de los registros se
escriben automticamente cada vez que se aade uno nuevo.
Sintaxis de la definicin El registro no se aadira si el valor de DNI coincidiera con otra ya existente
de ndices MySQL en la tabla. Recuerda que habamos definido ese campo como ndice primario.
Si no hubiramos incluido el aviso de error no tendramos ninguna referencia
Tanto al crear una tabla como al sobre el xito de la insercin y no detectaramos el problema de duplicidad.
modificarla se pueden aadir Sencillamente ocurrira que el registro no se aadira pero no nos enteraramos de
ndices de la misma forma que tal circunstancia.
tambin se pueden insertar Si en los valores de nombre y apellidos hubiramos insertado textos ms largos
campos.
del tamao establecido para ellos al crear la tabla, las cadenas se recortaran y
slo se aadiran -de izquierda a derecha- los n primeros caracteres de la cadena.
La sintaxis (dentro de la sentencia
MySQL que crea o modifica una
Si en la fecha de nacimiento hubiramos introducido una cadena vaca nos habra
tabla) es la siguiente: puesto el valor por defecto, pero si hubiramos introducido un valor no
vlido nos habra escrito 0000-00-00.
PRIMARY KEY(campo) Seran valores no vlidos en este caso:
Los que tuvieran como valor de mes alguno no perteneciente al intervalo
donde campo es el nombre del [1,12].
campo que se establece como
Los que tuvieran como valor de da un valor no vlido en concordancia con
ndice principal de la tabla.
el mes y el ao. Admitira 29 en un mes de febrero slo en el caso de que
El nombre del campo no va el ao fuera bisiesto.
entrecomillado y PRIMARY KEY Cuando la secuencia no coincidiera con esta AAAA-MM-DD.
(campo) se aade dentro de la Cuando los separadores no fueran (-) o (/)
sentencia CREATE como si se En el campo Sexo si hubiramos introducido una cadena vaca nos habra puesto
tratara de un campo ms, M (valor por defecto) pero si hubiramos intentado introducir un valor que no
delimitado por comas, salvo que fuera M ni F nos habra insertado una cadena vaca.
estuviera al final de la sentencia El campo hora se comportara de idntica forma al de fecha salvo que aqu la
CREATE, en cuyo caso se omitira
secuencia es: hh:mm:ss, que la hora debe pertenecer al intervalo [0,23], los
la coma final.
minutos y los segundos a [0,59] y que el nico separador vlido en este caso es
En el cdigo fuente de la creacin (:).
de la tabla que tienes a la derecha El campo Fumador requiere particular atencin ya que se trata de un campo
puedes ver un ejemplo prctico de CHAR(0) que slo admite dos valores: NULL o cadena vaca, que como
la sintaxis. recordars son distintos para MySQL.
Para introducir el valor NULL -utilizando el procedimiento de insercin de
Solo puede definirse un ndice
este ejemplo- tienes dos posibilidades, o escribir NULL sin ponerlo entre
primario por tabla y el campo
comillas -tal como lo he hecho en el ejemplo o escribir '\n' que como ves,
utilizado ha de ser un campo no
nulo. es el carcter especial \n esta vez colocado entre comillas.
Para introducir una cadena vaca en este campo bastara con que
UNIQUE nombre (campo) pusieramos '' (ojo no es una comilla doble es la comilla sencilla (') repetida
dos veces!
Similar a PRIMARY KEY, en cuanto Date cuenta de que si pusiramos comillas dobles tendramos un error ya
a que no admite valores que hay unas comillas dobles delante del INSERT que se cierran al final de
duplicados, pero con dos
la sentencia MySQL y que no podemos volver a escribirlas entre ambas
diferencias importantes.
UNIQUE permite la creacin de
para evitar un falso cierre de la cadena que contienen.
ms de un ndice de este tipo por
tabla y adems no requiere que los
En este caso el valor del campo Idiomas puede contener valores decimales
campos sobre los que se define comprendidos entre 0 y 64 o entre sus equivalentes binarios que son 0 y 111111.
sean no nulos. El valor 64 lo justifica el hecho de que son seis los elementos que puede
contener el campo (hemos definido: Castellano, Francs, Ingls, Alemn, Blgaro y
INDEX nombre (campo) Chino que son seis y que el caso de insertarlos todos requerira el nmero binario
111111, cuyo valor decimal es precisamente 64.
Con esta sintaxis se crea un ndice
El valor 3 significa lo mismo que su equivalente binario (11) o mejor (000011) lo
secundario que debe tener un
nombre (la posibilidad de que
cual quiere decir que, como el primer carcter de la derecha es uno el campo
existan varios obliga a toma el primer elemento de la lista (Castellano), como el segundo (de derecha
identificarlos de esta forma) y - a izquierda) tambin es uno tomar tambin el segundo elemento de la lista
como en los casos anteriores- el (Francs) y por ser cero todos los dems no tomar ningn otro valor de la lista,
campo que va a ser utilizado como con lo que la cadena resultante sera en este caso Castellano, Francs.
ndice. Fjate tambin en que el valor 3 no lo hemos puesto entre comillas porque se trata
de una expresin decimal. Qu ocurra si hubiera puesto 11? Lo habra
INDEX nombre (campo(n)) interpretado como once (decimal) o como tres (binario)?.
Es un caso particular del anterior La solucin es simple: '11' (entre comillas) sera interpretado como binario, sin
utilizable slo en el caso de que el comillas como decimal.
campo ndice sea tipo CHAR y No es necesario introducir valores en todos los campos, es decir, que la lista
VARCHAR que permite indexar de campos de la sentencia INSERT puede no contenerlos a todos.
por los n primeros caracteres No es necesario escribir el nombre de los campos en el mismo orden en el que
de esas cadenas. fueron creados pero si es imprescindible que campos y valores estn escritos
en la sentencia INSERT exactamente en el mismo orden y tambin que en esa
El valor de n ha de ser:
sentencia el nmero de campos y el nmero de valores sea el mismo.
n <= 256 Recuerda que los values tipo numrico no se incluyen entre comillas, mientras
que los no numricos tienen que estar contenidos entre comillas incluso en el
dado que el tamao mximo de un caso de no se inserten directamente sino a travs de una variable PHP.
ndice est limitado en MySQL a
256 bytes.
2.2- Aadir un registro a partir de datos contenidos en variables
Otra limitacin de MySQL es el
nmero mximo de ndices de una Tambin es posible aadir registros a partir de valores contenidos en variables PHP.
tabla que no puede ser mayor de
Esta opcin es, sin ninguna duda, la ms utilizada ya que lo habitual ser escribir el
diecisis.
contenido a aadir en un form y despus -a travs del method (POST o GET)- pasar al
script de insercin esos valores como variables PHP.
Los errores MySQL
Aqu tienes el cdigo fuente de un ejemplo con la tabla anterior.
PHP dispone de dos funciones que
nos permiten detectar si una Ver cdigo fuente Aadir regitro
sentencia MySQL se ha ejecutado
correctamente o si se ha producido Quiz te resulten de alguna utilidad estos comentarios
algn error.
Son las siguientes: Observa en el cdigo fuente que al insertar las variables en los VALUES de la
sentencia MySQL ponemos cuando se trata de valores tipo cadena
mysql_errno($enl) '$variable' (el nombre de la variable entre comillas) y cuando se trata de valores
nmericos sin comillas.
Indica el nmero de error que se
ha producido en la transaccin
Si quieres introducir el valor NULL en un campo tipo VAR(0) define la variable as:
MySQL realizada a travs del $var="\n" y si quieres introducir una cadena vaca defnela de este otro modo:
identificador de enlace $enl. $var="''" -comillas dobles (") seguidas de dos comillas sencillas (') y para
terminar otras comillas dobles (").
Cuando el nmero de error es
CERO significa que no se ha
producido error. 3.- Variantes de la sentencia INSERT
Otros valores bastante usuales son La sentencia INSERT cuya sintaxis se indica ms arriba como:
los siguientes:
INSERT tabla (campo1,campo2,..) VALUES (valor1,
valor2,..)
Error nmero 1050
permite algunos modificadores opciones tales como:
Indica que hemos tratado de crear INSERT [LOW_PRIORITY | DELAYED] [IGNORE] tabla (campo1,..)
una tabla ya existente. VALUES (valor1,..)
de ellos LOW_PRIORITY y DELAYED son incompatibles por lo que solo cabe uno u
Error nmero 1062 otro pero ambos a la vez.
Indica que hemos tratado de
introducir un valor con clave
Veamos su utilidad. La insercin de registros y la lectura de una tabla son
duplicada. Aparecer cuando procesos incompatibles, pero cabe la posibilidad de que se intenten ejecutar
tratemos de introducir un valor ya simultneamente. No olvides que estamos en Internet y es perfectamente posible que
existente en un campo con ndice desde dos ordenadores distintos, dos personas distintas estn accediendo a la misma
nico o principal. tabla simultneamente y que uno de los accesos sea de escritura, es decir: aadir,
modificar o borrar campos en la tabla
mysql_error($enl)
Quin tiene preferencia de paso? Quien tiene que esperar?. Si la opcin
Devuelve la descripcin del error.
LOW_PRIORITY est activada, el proceso de escritura esperar a que terminen
Cuando el nmero de error es
los procesos de lectura activos pero se si est activa la opcin DELAYED el proceso
CERO devuelve una cadena vaca.
de lectura se interrumpir automticamente para ceder el paso al de escritura.
Resulta de muchsima utilidad para
depurar scripts. Respecto a la opcin IGNORE tiene utilidad cuando se trata de realizar una
secuencia de inserciones. Si no est activa en el momento en el que aparezca una
clave duplicada se interrumpir el proceso de insercin, por el contrario, si
Ejercicio n 39 estuviera activa el proceso de insercin continuar con los siguientes registros de la
secuencia, aunque -como es lgico- seguirn sin insertarse los registros con clave
Como otra prctica de duplicada.
creacin de tablas trata de
crear una tabla con los 4.- Tablas para pruebas
supuestos datos ms
Aqu tienes comentado un script que permite agregar aleatoriamente y de forma
significativos de todos los
automtica registros a la tabla demo4.
compaeros de este Curso.
Dado que en las pginas siguientes trataremos de consultas va a resultarnos muy
cmodo poder rellenarlas de forma automtica.
Insertar datos
demo4
Los valores de
Creacin del formulario
SELECT MULTIPLE El caso ms frecuente -casi el nico- es que los registros de una tabla se aadan
utilizando un formulario y enviando desde l los datos a un script PHP que ejecute la
La opcin SELECT MULTIPLE opcin de aadir. Si no recuerdas el funcionamiento de este mtodo, pulsa aqu
dentro de un form tpico de HTML
permite elegir ninguno, uno o En el ejemplo hemos desarrollado un formulario para aadir registros a la tabla
varios de los elementos de la lista. demo4 con las siguientes peculiaridades:
20, 21, 22, 23, 24, 25, y 26 En realidad, tal como habrs podido ver en el cdigo fuente, la depuracin ha sido la
siguiente:
Al ir seleccionando valores, van
aadindose al array. Por ejemplo.
Si seleccionamos Francs y Hemos creado un valor de fecha y hora en formatos MySQL vlidos de la forma
Blgaro el array sera este: var que describimos un poco ms arriba.
[0]=2, var[1]=16 Hemos sumado todos los valores numricos recibidos en el array obtenido del
SELECT MULTIPLE y hemos asignado el resultado a la variable depurada que
Si sumamos esos valores (2 + 16) recoge el valor a escribir en el campo Idiomas. La justificacin de esa suma la
el resultado sera 18, y al convertir
tienes al margen.
a binario este valor, resultar:
La variable Fumador es la que tiene un poquito ms de complicacin. Vemosla
010010 con calma:
Los valores que recibimos desde formulario son 1 o 0 y hemos de transformarlos
que es como decirle a MySQL en una cadena vaca o en NULL. Hemos insertado un operador condicional (un
(mirando la cadena de derecha a if... else) para convertir eso valores en: $var="'\N'" (comilla doble, comilla
izquierda, lo recuerdas?) que simple, barra invertida, N, comilla simple y comilla doble) $var="''" (comillas
incluya los valores segundo dobles, dos comillas simples y unas comillas dobles)
(Francs) y quinto (Blgaro) del Asignados los nuevos valores tenemos que recurrir a un pequeo truco. Venimos
SELECT MULTIPLE que repitiendo que en la sentencia INSERT los nombres de las variables no
corresponden a las posiciones en numricas que contienen los values hay que escribirlos dentro de comillas
las que la cadena binaria contiene
simples, pero en el caso de un campo tipo CHAR(0) hemos de hacer una
un uno.
excepcin que sera no poner esas comillas al nombre de la variable. Al hacerlo
as, se escribiran como valores en la sentencia de insercin uno de estos: ='\N'
o =' ' (los valores de la variable) que al contener comillas ya son interpretados por
MySQL como una cadena.
Ejercicio n 40
Sintaxis MySQL de
Consultar los registros de una tabla
seleccin de registros
Las consultas de los datos y registros contenidos en una tabla ofrecen un amplsimo
abanico de posibilidades a partir de las opciones que tienes descritas al margen. Veamos
Las sentencias de seleccin de
registros requieren utilizar -entre algunas de las posibilidades.
otras- palabras clave como las que
enumeramos a continuacin. La consulta ms simple
Observa que hay dos tipos:
obligatorias y opcionales, y que Si utilizamos la sentencia
algunas de las palabras clave son SELECT * FROM tabla
alternativas y por lo tanto,
incompatibles en una misma
sentencia. obtendremos informacin sobre todos los campos (*) y la salida estar en el mismo
orden en el que fueron aadidos los datos. Si visualizas este ejemplo, vers que aparecen
El uso de estas palabras clave
ordenados por el valor autonumrico del campo Contador lo cual, como ves, resulta
requiere que sean insertadas en un
coherente con la afirmacin anterior.
determinado orden tal y como se
enumera aqu debajo.
Es una clusula opcional que se Consultando slo algunos campos y limitando la salida a n registros
usa para indicar al optimizador que
el resultado va a tener una gran
cantidad de registros. Ahora utilizaremos la sentencia
SELECT campo1,campo2, ... FROM tabla LIMIT (n, m)
En ese caso, MySQL utilizar
tablas temporales cuando sea
necesario para optimizar la y tendremos como resultado una lista que contendr m registros a partir del n+1, por el
velocidad de gestin de la mismo orden que la anterior, y mostrando los campos indicados.
informacin.
[SQL_BUFFER_RESULT]
Consultando slo algunos campos y ordenando la salida
Es opcional y su finalidad es la de
forzar a MySQL a tratar el Utilizaremos la sentencia MySQL de esta forma
resultado en un fichero temporal.
SELECT campo1,campo2, ... FROM tabla ORDER BY campo_n [ASC|DESC],
Ese tratamiento ayuda a MySQL a campo_m [ASC|DESC]
liberar recursos ms rpidamente
y es de gran utilidad (siempre
desde el punto de vista de la y tendremos como resultado una lista ordenada por el primero de los campos indicados
rapidez) cuando es necesario un en ORDER BY, y en caso de coincidencia de valores en ese campo, utilizaramos el
largo proceso de clculo antes de criterio de ordenacin sealado en segundo lugar.
enviar los resultados al cliente.
Si esta opcin est activa, los que nos devolver la lista de registros que cumplen la condicin indicada. Aqu
intentos de escritura que pudieran tienes un ejemplo muy sencillo.
producirse de forma simultnea
deberan esperar al final de este
proceso para ejecutarse. Ver cdigo fuente Ejecutar la consulta
campo1, campo2, ...
La clasula WHERE permite un variado abanico de condiciones, que trataremos de
Tienen carcter obligatorio y resumir aqu. Algunos de ellas son los siguientes:
sealan los campos de la tabla
que deben incluirse en la consulta.
Tipo Cdigo Ver
Operador Sintaxis Descripcin
de campo fuente ejemplo
La funcin SELECT slo devolver
informacin de aquellos campos Selecciona los registros
que estn enumerados aqu. que contienen en el
= Numrico WHERE campo=num
campo un valor igual a
Ver Probar
mysql_affected_rows($c )
Aplicando la opcin GROUP BY
En este caso la funcin devuelve
tambin el nmero de registros Tal como sealamos al margen, las funciones anteriores pueden aplicarse a grupos de
afectados, pero slo en el caso de registros seleccionados mediante un criterio GROUP BY (nombre del campo)
que la sentencia MySQL haya
producido modifi- caciones en los En este ejemplo obtendremos los mismos parmetros estadsticos que en el anterior,
contenidos de la tabla. Es decir,
pero ahora agrupados por sexo, lo que significara que obtendremos dos filas de
slo recoge resultados de
sentencias que: aaden,
resultados. Aqu tienes el ejemplo
modifican o borran registros.
Ver cdigo fuente Ejecutar la consulta
Manejo de fechas en las
Como habrs podido observar, la opcin SELECT tiene un sinfn de posibilidades.
consultas
DATE_FORMAT( campo,formato) Supongamos que entre los individuos de nuestra tabla demo4 se pretende
establecer un proceso de seleccin para elegir entre ellos un nmero determinado de
Las diferentes opciones de formato astronautas, pongamos por caso.
las tienes en la tabla de la
derecha. Es importante tener en Supongamos tambin, que la seleccin va a constar de tres pruebas que sern
cuenta que la sintaxis correcta es
juzgadas y calificadas por tres tribunales distintos.
%Y (sin espacio) ya que si hubiera
un espacio % Y interpretara la
Una primera opcin sera crear tres tablas -una para cada tribunal- e incluir en ellas
letra Y como un texto a incluir.
todos los datos de cada uno de los individuos.
CURDATE()
Esa opcin es factible pero no es ni la ms cmoda, ni tampoco es la ms rpida ni la
Dentro de DATE_FORMAT se que menos espacio de almacenamiento necesita. No debemos olvidar que una tabla
puede incluir -en vez del nombre puede tener una enorme cantidad de registros.
del campo- una cadena en la que
se indique una fecha en formato Una opcin alternativa sera crear tres nuevas tablas que slo contuvieran dos
YYYY-MM-DD hh:mm:ss. Puedes campos cada una. Por ejemplo el campo DNI y el campo Calificacin.
verlo en los ejemplos. De igual
modo es posible sustituir el Como quiera que el campo DNI ha de contener los mismos valores en las cuatro
nombre del campo -o la cadena- tablas y adems es un campo nico podran crearse las nuevas tablas y luego copiar en
por la funcin CURDATE() que cada una de ellas todos los DNI de la tabla original.
recoge la fecha actual del
sistema (nicamente da, mes y Nos garantizara que no habra errores en los DNI y adems nos garantizara que se
ao). A efectos de horas, minutos
incluyeran todos los aspirantes en esas nuevas tablas.
y segundos CURDATE() va a
tomar el medioda de la fecha
Aqu tienes el cdigo fuente de un script que crea esas tres tablas (a las que hemos
actual.
llamado demodat1, demodat2 y demodat3.
CURTIME()
Ver cdigo fuente
Se comporta de forma similar a
CURDATE().
Crear las tablas
Devuelve la hora actual del anteriores
sistema que alberga el servidor
MySQL en formato hh:mm:ss
Devuelve la fecha y hora actual del Para ese menester se usa la siguiente sintaxis:
sistema en formato YYYY-MM-DD
hh:mm:ss SELECT tabla1.campo1, tabla2.campo2, ... FROM tabla1, tabla2
NOW()
en la que, como ves, modificamos ligeramente la sintaxis ya que anteponemos el
Es un alias de nombre de la tabla al del campo correspondiente separando ambos nombres por un
CURRENT_TIMESTAMP().
punto, con lo cual no hay posibilidad de error de identificacin del campo incluso
mysql_result($resultado,num, cuando campos de distinta tabla tengan el mismo nombre.
campo)
Otra innovacin -respecto a los ejemplos anteriores- es que detrs de la clusula
Esta funcin PHP permite obtener FROM escribimos los nombres de todas las tablas que est usando SELECT.
un solo campo de uno solo de los
registros obtenidos como resultado A partir de ah se pueden establecer todo tipo de relaciones para las sentencias
de una consulta MySQL. WHERE, ORDER BY y GROUP BY utilizando para ello campos de cualquiera de las
tablas sin otra particularidad ms que poner cuidado al aludir a los campos utilizando
El parmetro $resultado es la
siempre la sintaxis nombre_tabla.nombre_campo.
variable que recoge en resultado
obtenido de la ejecucin de
A modo de ejemplo -hemos procurado comentarlo lnea a lnea- aqu tienes un script
mysql_query de forma idntica a
PHP que hace una consulta conjunta de las tablas demo4, demodat1, demodat2 y
como lo hacamos en otras
consultas. demodat3 y nos presenta una tabla con los datos personales y las puntuaciones de las
tres pruebas as como las suma de puntos de las tres y, adems, ordena los resultados -
El valor num es un nmero entero de mayor a menor- segn la suma de las tres puntuaciones.
que indica el nmero de fila de la
que queremos extraer el valor
contenido en uno de sus campos. Ver cdigo fuente Ejecutar la consulta
Ejercicio n 41
Ejercicio n 42
Construye una nueva tabla tabla2 con los mismos campos que tu tabla1 pero aadiendo
el carcter de clave principal al campo que recoge el DNI, con lo cual podrs impedir que
puedan repetirse dos alumnos con el mismo DNI.
A partir de ella, crea tablas auxiliares (transfiriendo los datos de tabla1) de calificaciones
de materias, por ejemplo que contengan dos campos: DNI y calificacin.
Por ltimo, tendras que crear todo lo necesario para que el profesor de cada materia,
pudiera insertar sus calificaciones y, adems, crea un documento final que permita visualizar
simultneamente las calificaciones del alumno en todas la materias.
Sintaxis MySQL de
Modificar un campo en todos los registros de una tabla
modificacin de registros La sentencia MySQL, que permite modificar uno o varios campos en todos los
registros de una tabla, es la siguiente:
Las sentencias MySQL que
permiten la modificacin de UPDATE tabla SET campo1=valor1, campo2=valor2
registros en las tablas pueden
incluir algunas de las siguientes
clusulas que, al igual que ocurra Cuidado con esta sentencia!. Hay que tener muy presente que con esta sentencia -en
en casos anteriores, pueden tener la que no aparece WHERE- se modificarn TODOS LOS REGISTROS DE LA TABLA y
categora de obligatorias u por lo tanto los campos modificados tendrn el mismo valor en todos los registros.
opcionales.
UPDATE
MySQL requiere SIEMPRE que los valores tipo cadena que incluyen campos de
Tiene carcter obligatorio, debe fecha vayan entre comillas. Por el contrario, los numricos no deben llevar
ser la primera palabra de la comillas.
sentencia e indica a MySQL que Presta mucha atencin a esto cuando escribas los valores directamente en la
vamos realizar una modificacin. sentencia MySQL
Cuando pases valores desde una variable PHP debes tener muy en cuenta las
[LOW_PRIORITY] consideraciones anteriores y si el contenido de la variable es una cadena que va a
Es opcional e indica a MySQL ser tratada como tal por MySQL tienes dos opciones para evitar el error:
espere a que se terminen de
hacer las consultas que en ese Definir la variable as: $variable ="'valor'" (comillas dobles, comilla
momento pudiera haber en simple al principio y comilla simple, comilla doble al final) y poner en la
proceso antes realizar la sentencia MySQL el nombre de la variable sin entrecomillar, o
actualizacin. Definir la variable PHP as: $variable ="valor" y al escribir el nombre de
esa variable en la sentencia MySQL escribirlo entre comillas sencillas, es
[IGNORE] decir, as: '$variable'
Es opcional. Cuando se incluye en
No pienses que es caprichoso el orden que hemos puesto en las comillas. Recuerda
una sentencia el proceso de
que al llamar a la sentencia MySQL, el contenido de la sentencia va entre
actualizacin no se interrumpe si
aparece un conflicto de clave comillas (que por costumbre son comillas dobles, por esa razn todo
duplicada en uno de los registros entrecomillado que vaya dentro de esa sentencia ha de usar comillas simples
en proceso. Simplemente ignora para evitar un error seguro).
ese registro y contina con los
siguientes De ah que al definir una variable PHP en la forma $variable ="'valor'" las
comillas dobles exteriores indican a PHP que se trata de una cadena, por lo que, al
Si no se incluye, el proceso de pasar la variable a MySQL ste recibir el contenido de la cadena que es,
modificacin se interrumpe en el logicamente: 'valor' y en este caso las comillas forman parte del valor, razn por
momento en que encuentre un el que no es necesario escribir -en la sentencia MySQL- el nombre de la variable
conflicto de clave duplicada.
entrecomillado.
Tanto con ignore como sin esa
clusula, en el caso de duplicidad En este primer ejemplo, hemos incluido una actualizacin de tablas que pondr
de clave NUNCA se efectan las puntuacin 7 en la primera de las pruebas a todos los aspirantes a astronautas de
modificaciones. nuestro ejemplo.
tabla
Es un caso de actualizacin sin la condicin WHERE y tiene el cdigo comentado.
Es obligatoria y contiene el
nombre de la tabla que
Ver cdigo fuente Ejecutar la modificacin
pretendemos modificar.
WHERE Ver cdigo formulario Ver cdigo del script Ejecutar la modificacin
Es un campo opcional y su
comportamiento es idntico a Modificacin simltanea de un campo
sealado al mencionar el proceso
de consultas. en cualquiera de los registros
ORDER BY Aqu tienes un ejemplo que permite visualizar el valor actual de todas las
puntuaciones de la prueba 2 de los astronautas as como sus nombres y apellidos y DNI y
Tiene idntica funcionalidad a la en la cual se pueden modificar ninguno, uno, varios o todos los valores y
descrita al referirnos a consultas posteriormente actualizarlos todos con los nuevos valores.
Crea los formularios y scripts necesarios para poder elegir un alumno cualquiera mediante
su DNI en la tabla1 y modificar cualquiera de sus datos personales.
LIMIT n En este ejemplo, tienes el cdigo fuente de un script que realiza el borrado de un
registo mediante un formulario en el que se inserta el DNI tanto en la tabla demo4
La opcin LIMIT es opcional y como demodat1, demodat2 y demodat3 manteniendo la integridad referencial entre
propia de MySQL. los cuatro ficheros.
Su finalidad es limitar el tiempo
de ejecucin del comando DELETE
Ver script Borrar un registro
ya que cuando est activada
devuelve el control al potencial
cliente despus de borrar n
registros, con lo que en procesos
Borrar registros seleccionndolos de una lista
de borrados muy largos (ficheros
En el ejemplo siguiente tienes el cdigo para utilizar la clusula WHERE en un proceso
de gran tamao) no obliga a
esperar a borrado total para de borrado de registros que presenta un formulario que contiene una lista con todos
proceder a la consulta de la tabla. los registros actuales y una casilla de verificacin por cada uno.
Cuando se utiliza esta opcin, la Al marcar las casillas y enviar el formulario el script que recibe los datos procede al
sentencia DELETE debe repetirse borrado de todos los registros marcados en todas la tablas afectadas.
hasta que el nmero de registros
pendientes de borrado sea inferior Ver formulario Ver script Ejecutar ejemplo
al valor de n.
Optimizacin de tablas
Guardar y recuperar bases de datos y o tablas
Cuando se ejecuta la sentencia
DELETE -pese a que son Aunque es perfectamente factible desarrollar scripts propios que permitan guardar y
eliminados los valores de los recuperar tanto las estructuras como los datos de una tabla de la base de datos
campos- se conservan las completa, mencionaremos aqu una de las posibilidades ms cmodas de hacerlos.
posiciones de los registros
borrados, con lo cual no se PhpMyAdmin es una magnifica herramienta para hacer y recuperar copias de
reduce el tamao de la tabla. seguridad.
Esas posiciones de registro sern
Si abrimos esta utilidad http://localhost/myadmin/ podremos ver los dos enlaces que
utilizadas por MySQL para
escribir los registros que se vayan ves en la imagen SQL y Exportar que permiten importar y exportar tanto estructuras
aadiendo despus del proceso como datos y estructuras.
de borrado.
mysql_fetch_array()
y
mysql_fetch_row()
En el caso del array asociativo donde podremos elegir una, varias o todas la tablas y que segn la opciones elegidas nos
devuelto por la primera de estas permite exportar estructuras y/o datos, segn las casillas de verificacin que tengamos
funciones, los ndices coinciden marcadas. Adems nos permite elegir el formato en el que queremos guardar la copia
siempre con los nombres de los en nuestro caso elegiramos SQL y tambin segn est o no activada la casilla de
campos de los que han sido
verificacin Enviar visualizar el fichero generado o guardarlo con el nombre que hayamos
extrados los datos.
consignado en la caja de texto Plantilla del nombre del archivo.
En el caso de que la consulta
afecte a varias tablas (recuerda
que los campos se asignan
poniendo tabla.campo (nombre de
la tabla y nombre del campo) el
ndice del array asociativo sera
esa expresin con el punto incluido.
Para restaurar datos y/o estructuras desde un fichero de seguridad creado mediante el
proceso anterior usaramos la opcin SQL de la primera imagen. A travs de ella
accederamos a una pgina cuyo contenido estamos visualizando en esta ltima imagen.
Peculiaridades de las
tablas
Creacin de una tabla ejemplo
Las tablas que han de contener Lo primero de todo ser disponer de una tabla en la que puedan guardarse imgenes.
imgenes deben tener campos del Aqu tienes un ejemplo.
tipo BLOB, MEDIUMBLOB o
LONGBLOB, pudiendo elegir aquel <?
de ellos que ms se adecue al #el nombre de la tabla
tamao, en bytes, de las imgenes
$base="ejemplos";
que se desean guardar en la tabla.
#definimos otra variable con el NOMBRE QUE QUEREMOS DAR A LA TABLA
Por si te has olvidado de los tipos $tabla="fotos";
de campos, aqu tienes un enlace # establecemos la conexin con el servidor
para recordarlos. $conexion=mysql_connect ("localhost","pepe","pepa");
#Seleccionamos la BASE DE DATOS en la que PRETENDEMOS CREAR LA TABLA
En el ejemplo la hemos creado con mysql_select_db ($base, $conexion);
un campo BLOB insertando
tambin campos para recoger su $crear="CREATE TABLE IF NOT EXISTS $tabla (";
nombre, su tamao (en bytes), su
$crear.="num_ident INT(10) unsigned NOT NULL AUTO_INCREMENT,";
formato (el tipo de fichero
$crear.="imagen BLOB NOT NULL, ";
transferido) as como un campo
autoincremental. $crear.="nombre VARCHAR(255) NOT NULL DEFAULT '',";
$crear.="tamano VARCHAR(15) NOT NULL DEFAULT '',";
Desde este enlace -has de tener $crear.="formato VARCHAR(10) NOT NULL DEFAULT '',";
activo el servidor MySQL- podrs $crear.="PRIMARY KEY (num_ident))";
crear la tabla fotos e insertar
automticamente algunas #Creamos la cadena, comprobamos si esa instruccin devuelve
imgenes de ejemplo. # VERDADERO o FALSO
# y dependiendo de ellos insertamos el mensaje de exito o fracaso
Crear tabla con
imgenes if(mysql_db_query ($base,$crear ,$conexion)) {
echo "<h2> Tabla $tabla creada con EXITO </h2><br>";
}else{
Transferencia de la imagen echo "<h2> La tabla $tabla NO HA PODIDO CREARSE</h2><br>";
};
El formulario para realizar la
transferencia de la imagen no # cerramos la conexin... y listo...
tiene particularidades. Es un
formulario como los de toda la mysql_close($conexion);
vida. Lo nico reseable sera ?>
incluir un campo oculto en el que
pudiera especificarse una
restriccin en cuanto al tamao Formulario para la transferencia de las imgenes
mximo permitido para cada
imagen y que debe estar acorde
con el tipo de campo utilizado en <FORM ENCTYPE="multipart/form-data" ACTION="ejemplo211.php"
la tabla. METHOD="post">
#con este input "oculto" establecemos el limite mximo
Comprobacin # del tamao del fichero a transferir. En este ejemplo 65.000 bytes
<INPUT type="hidden" name="lim_tamano" value="65000">
del tipo de imagen
<p><b>Selecciona la imagen a transferir<b><br>
<INPUT type="file" name="foto"><br>
Al transferir imgenes jpg png <p><b>Ttulo la imagen<b><br>
el type MIME que reciba el <INPUT type="text" name="titulo"><br></p>
servidor es distinto segn el
<p><INPUT type="submit" name="enviar" value="Aceptar"></p>
navegador que se utilice para
hacer la transferencia.
</FORM>
Ver imgenes
guardadas
Tipos de tablas
Creacin de una tabla InnoDB
Aunque en los temas anteriores no
hemos hecho alusin a ello, MySQL La creacin de tablas tipo InnoDB requiere una de estas dos sentencias:
permite usar diferentes tipos de
tablas tales como: CREATE TABLE IF NOT EXISTS tabla (campo1, campo2,... ) Type=InnoDB
ISAM
CREATE TABLE tabla (campo1, campo2,... ) Type=InnoDB
MyISAM
Este script crear una tabla InnoDB con idnticos campos a los utilizados en el caso de la
InnoDB
tabla demo4 con la que hemos venido trabajando hasta ahora. La sintaxis, muy similar a
la utilizada all es esta:
Las tablas ISAM son las de
formato ms antiguo. Estn
limitadas a tamaos que no <?
superen los 4 gigas y no permite $base="ejemplos";
copiar tablas entre mquinas con $tabla="demoINNO";
distinto sistema operativo. $c=mysql_connect ("localhost","pepe","pepa");
mysql_select_db ($base, $c);
Las tablas MySAM son el resultado
de la evolucin de las anteriores,
$crear="CREATE TABLE $tabla (";
ya que resuelven el problema que
planteaban las anteriores y son el $crear.="Contador TINYINT(8) UNSIGNED ZEROFILL NOT NULL
formato por defecto de MySQL a AUTO_INCREMENT,";
partir de su versin 3.23. $crear.="DNI CHAR(8) NOT NULL, ";
$crear.="Nombre VARCHAR (20) NOT NULL, ";
Las tablas del tipo InnoDB tienen $crear.="Apellido1 VARCHAR (15) not null, ";
una estructura distinta que $crear.="Apellido2 VARCHAR (15) not null, ";
MyISAM, ya que utilizan un slo $crear.="Nacimiento DATE DEFAULT '1970-12-21', ";
archivo por tabla en ver de los
$crear.="Hora TIME DEFAULT '00:00:00', ";
tres habituales en los tipos
$crear.="Sexo Enum('M','F') DEFAULT 'M' not null, ";
anteriores.
$crear.="Fumador CHAR(0) , ";
Incorporan un par de ventajas $crear.="Idiomas SET(' Castellano',' Francs','Ingls',
importantes, ya que permiten ' Alemn',' Blgaro',' Chino'), ";
realizar transacciones y definir $crear.=" PRIMARY KEY(DNI), ";
reglas de integridad referencial. $crear.=" UNIQUE auto (Contador)";
$crear.=")";
Creacin y uso de # esta es la nica diferencia con el proceso de
tablas InnoDB # creacin de tablas MyISAM
$crear.=" Type=InnoDB";
La creacin de tablas de este tipo
if(mysql_query ($crear ,$c)) {
no presenta ninguna dificultad
echo "<h2> Tabla $tabla creada con EXITO </h2><br>";
aadida. El proceso es idntico a
las tablas habituales sin ms que }else{
aadir Type=InnoDB despus de echo "<h2> La tabla $tabla NO HA PODIDO CREARSE ";
cerrar el parntesis de la sentencia # echo mysql_error ($c)."<br>";
de creacin de la tabla. $numerror=mysql_errno ($c);
if ($numerror==1050){echo "porque YA EXISTE</h2>";}
Una vez creadas, las tablas };
InnoDB se comportan a efectos mysql_close($c);
de uso exactamente igual que las
?>
que hemos venido utilizando en las
pginas anteriores. No es preciso
hacer ningn tipo de modificacin
en la sintaxis. Por tanto, es
Crear tabla
totalmente vlido todo lo ya InnoDB
comentado respecto a: altas,
modificaciones, consultas y bajas.
Cuidado!
Las transacciones
Bajo Windows, al crear una base de datos o tabla InnoDB el nombre de la misma aparecer
Uno de los riesgos que se plantean en minsculas independientemente de la sintaxis que hayamos utilizado en su creacin.
en la gestin de bases de datos es
que pueda producirse una Si observas el ejemplo anterior, hemos puesto demoINNO como nombre de la tabla. Sin
interrupcin del proceso mientras embargo, si miras el directorio c:\mysql vers que aparece el fichero demoinno.frm con
se est actualizando una o varias minsculas.
tablas. Pongamos como ejemplo el
cobro de nuestra nmina. Son
necesarias dos anotaciones
simultneas: ll cargo en la cuenta Las primeras transacciones
del Organismo pagador y el abono
en nuestra cuenta bancaria. Si se
interrumpiera fortuitamente el <?
proceso en el intermedio de las $base="ejemplos";
dos operaciones podra darse la # escribimos el nombre de la tabla en MINUSCULAS
circunstancia de que apareciera # para asegurar la compatibilidad entre plataformas
registrado el pago sin que se $tabla="demoinno";
llegaran a anotar los haberes en $conexion=mysql_connect("localhost","pepe","pepa");
nuestra cuenta. mysql_select_db ($base, $conexion);
# insertamos la sentencia BEGIN para indicar el comienzo
Las transacciones evitan este tipo
de situaciones ya que los registros # de una transaccin
de los datos se registran de mysql_query("BEGIN",$conexion);
manera provisional y no toman /* hasta que no aparezca una sentencia que finalice la transaccin
carcter definitivo hasta que una (ROLLBACK COMMIT) las modificaciones en la tabla sern registradas
instruccin confirme que esas de forma "provisional") */
anotaciones tienen carcter mysql_query("INSERT $tabla (DNI,Nombre,Apellido1,Apellido2,
definitivo. Para ello, MySQL Nacimiento,Sexo,Hora,Fumador,Idiomas)
dispone de tres sentencias: VALUES
BEGIN, COMMIT y ROLLBACK. ('111111','Alvaro','Alonso','Azcrate','1954-11-23',
'M','16:24:52',NULL,3)",$conexion);
Sintaxis de las if (mysql_errno($conexion)==0){
transacciones echo "Registro AADIDO<br>";
}else{
Existen tres sentencias para if (mysql_errno($conexion)==1062){
gestionar las transacciones. Son echo "No ha podido aadirse el registro <br>";
las siguientes: echo "Ya existe un registro con este DNI<br>";
}else{
mysql_query("BEGIN",$c) $numerror=mysql_errno($conexion);
Su ejecucin requiere que este
$descrerror=mysql_error($conexion);
activa la conexin $c con el echo "Se ha producido un error n $numerror<br>";
servidor de base de datos e indica echo "<br>que corresponde a: $descrerror<br>";
a MySQL que comienza una }
transaccin. }
# indicamos el final de la transaccin, en este caso con ROLLBACK
Todas las sentencias que se # por lo tanto el registro con DNI 111111 no ser insertado en la tabla
ejecuten a partir de ella tendrn mysql_query("ROLLBACK",$conexion);
carcter provisional y no se
# incluyamos una nueva transaccin
ejecutarn de forma efectiva hasta
que encuentre una sentencia de
mysql_query("BEGIN",$conexion);
finalizacin. mysql_query("INSERT $tabla (DNI,Nombre,Apellido1,Apellido2,
Nacimiento,Sexo,Hora,Fumador,Idiomas)
mysql_query("ROLLBACK",$c) VALUES
('222222','Genoveva','Zarabozo','Zitrn','1964-01-14',
Mediante esta sentencia 'F','16:18:20',NULL,2)",$conexion);
advertimos a MySQL que finaliza la
if (mysql_errno($conexion)==0){
transaccin pero que no debe
echo "Registro AADIDO";
hacerse efectiva ninguna de las
modificaciones incluidas en ella. }else{
if (mysql_errno($conexion)==1062){
mysql_query("COMMIT",$c) echo "No ha podido aadirse el registro <br>";
echo "Ya existe un registro con este DNI";
Esta sentencia advierte a MySQL }else{
que ha finalizado la transaccin y $numerror=mysql_errno($conexion);
que debe hacer efectivos todos
$descrerror=mysql_error($conexion);
los cambios incluidos en ella.
echo "Se ha producido un error n $numerror";
echo "<br>que corresponde a: $descrerror";
Precauciones a tener en }
cuenta }
# indicamos el final de la transaccin, en este caso con COMMIT
Cuando se utilizan campos # por lo tanto el registro con DNI 222222 si ser insertado en la tabla
autoincrementales en tablas mysql_query("COMMIT",$conexion);
InnoDB los contadores se van # leamos el contenido de la tabla para ver el resultado
incrementando al aadir registros $resultado= mysql_query("SELECT * FROM $tabla" ,$conexion);
(incluso de forma provisional) con print "<br>Lectura de la tabla depus del commit<br>";
lo cual si se aborta la inclusin con while ($registro = mysql_fetch_row($resultado)){
un ROLLBACK ese contador foreach($registro as $clave){
mantiene el incremento y en
echo $clave,"<br>";
inserciones posteriores partir de
}
ese valor acumulado.
}
Por ejemplo. Si partimos de una mysql_close();
tabla vaca y hacemos una ?>
transaccin de dos registros
(nmero 1 y nmero 2 en el
campo autoincremental) y la
finalizamos con ROLLBACK, no se Ejecutar el ejemplo
insertarn pero en una insercin
posterior el contador Integridad referencial en tablas InnoDB
autoincremental comenzar a
partir del valor 2.
Cuando se trabaja con varias tablas que tienen algn tipo de vnculo resulta interesante
MySQL anuncia que a partir de la disponer de mecanismos que protejan o impidan acciones no deseadas. Supongamos,
versin 5.0.3 se incluir una nueva como veremos en los ejemplos posteriores que pretendemos utilizar una tabla con datos de
sentencia para permitir que se alumnos y otra tabla distinta para las calificaciones de esos alumnos. Si no tomamos
puedan renumerar los campos ninguna precaucin (bien sea mediante los script o mediante el diseo de las tablas) podra
autoincrementales. darse la circunstancia de que incluyramos calificaciones a alumnos inexistentes, en
materias de las que no estn matriculados, etctera. Tambin podra darse la circunstancia
Elementos necesarios de que diramos de baja a un alumno pero que se mantuvieran las calificaciones
para la integridad vinculadas a l. Todas estas circunstancias suelen producir efectos indeseados y las tablas
InnoDB pueden ser diseadas para prever este tipo de situaciones.
referencial
Sintaxis para la vinculacin de tablas
La integridad referencial ha de
establecerse siempre entre dos
Los vnculos entre tablas suelen establecer en el momento de la creacin de la tabla
tablas. Una de ellas ha de
vinculada.
comportarse como tabla principal
(suele llamarse tabla padre y la
otra sera la tabla vinculada CREATE TABLE tabla (campo1, campo2,...
tabla hijo. KEY nombre (campo de vinculacion ),
FOREIGN KEY (campo de vinculacion)
Es imprescindible: REFERENCES nombre_de la tabla principal (Indice primario de la tabla principal)
) Type=InnoDB
Que la tabla principal
tenga un ndice primario donde el campo de vinculacion ha de ser un ndice (no es necesario que sea PRIMARY KEY
(PRIMARY KEY) ni UNIQUE) y donde Indice primario de la tabla principal ha de ser un ndice primario
Que la tabla vinculada (PRIMARY KEY) de la tabla principal. Debe haber plena coincidencia (tanto en tipos como
tenga un ndice (no es contenidos) entre ambos ndices.
necesario que sea ni nico
ni primario) asociado a
campos de tipo idntico a <?
los que se usen para ndice $base="ejemplos";
de la tabla principal. $tabla1="principal";
$tabla2="vinculada";
Si observas el cdigo fuente del $c=mysql_connect ("localhost","pepe","pepa");
ejemplo que tienes a la derecha mysql_select_db ($base, $c);
podrs observar que utilizamos el # creacin de la tabla principal type InnoDB
nmero del DNI (nico para $crear="CREATE TABLE IF NOT EXISTS $tabla1 (";
alumno) como elemento de $crear.="DNI CHAR(8) NOT NULL, ";
vinculacin de la tabla de datos
$crear.="Nombre VARCHAR (20) NOT NULL, ";
personales con la que incluye las
$crear.="Apellido1 VARCHAR (15) not null, ";
direcciones.
$crear.="Apellido2 VARCHAR (15) not null, ";
# el indice primario es imprescindible. Recuerda que debe
Borrado de tablas # estar definido sobre campos NO NULOS
vinculadas $crear.=" PRIMARY KEY(DNI) ";
$crear.=")";
Si pretendemos eliminar una tabla $crear.=" Type=InnoDB";
principal recibiremos un mensaje # creamos la tabla principal comprobando el resultado
de error tal como puedes ver si if(@mysql_query ($crear ,$c)){
ejecutas este ejemplo cuyo cdigo print "La tabla ".$tabla1." ha sido creada<br>";
fuente tienes aqu. cmo es lgico, }else{
antes de ejecutarlo habrs de print "No se ha creado ".$tabla1." ha habido un error<br>";
tener creada la tabla cuyo cdigo }
fuente tienes a la derecha. # crearemos la tabla vinculada
$crear="CREATE TABLE IF NOT EXISTS $tabla2 (";
Las tablas vinculadas si permiten
$crear.="IDENTIDAD CHAR(8) NOT NULL, ";
el borrado y una vez que stas ya
han sido eliminadas (o quitada la $crear.="calle VARCHAR (20), ";
vinculacin) ya podrn borrarse sin $crear.="poblacion VARCHAR (20), ";
problemas las tablas principales. Si $crear.="distrito VARCHAR(5), ";
ejecutas este ejemplo podrs # creamos el ndice (lo llamamos asociador) para la vinculacin
observar que borramos ambas # en este caso no ser ni primario ni nico
tablas siguiendo el orden que # Observa que el campo IDENTIDAD de esta tabla CHAR(8)
permite hacerlo. Primero se borra # es idntico al campo DNI de la tabla principal
la vinculada y luego la principal. $crear.=" KEY asociador(IDENTIDAD), ";
Este es el cdigo fuente del script. #establecemos la vinculacin de ambos ndices
$crear.=" FOREIGN KEY (IDENTIDAD) REFERENCES $tabla1(DNI) ";
Cuidado! $crear.=") TYPE = INNODB";
# creamos (y comprobamos la creacin) la tabla vinculada
Si has borrado las tablas con if(@mysql_query ($crear ,$c)){
los ejemplos anteriores no print "La tabla ".$tabla2." ha sido creada<br>";
olvides crearlas de nuevo }else{
para poder visualizar los print "No se ha creado ".$tabla2." ha habido un error<br>";
ejemplos siguientes. }
mysql_close();
?>
Modificacin o borrado de
campos vinculados
Crear tablas vinculadas
Las sentencias MySQL que deban
modificar o eliminar campos Modificacin de estructuras
utilizados para establecer vnculos
entre tablas requieren de un La modificacin de estructuras en tablas vinculadas puede hacerse de forma idntica a
parmetro especial (CONSTRAINT) la estudiada para los casos generales de MySQL siempre que esas modificaciones no
-puede ser distinto en cada una de afecten a los campos mediante los que se establecen las vinculaciones entre
las tablas- que es necesario
tablas.
conocer previamente.
La forma de visualizarlo es Aqu tienes un ejemplo en se borran y aaden campos en ambas tablas. Como puedes ver
ejecutar la sentencia: SHOW la sintaxis es exactamente la misma que utilizamos en temas anteriores.
CREATE TABLE nombre tabla que
devuelve como resultado un array <?
asociativo con dos ndices. Uno de $base="ejemplos";
ellos -llamado Table- que contiene
$tabla="principal";
el nombre de la tabla y el otro -
Create Table- que contiene la
$tabla1="vinculada";
estructura con la que ha sido $c=mysql_connect ("localhost","pepe","pepa");
creada la tabla pero incluyendo el mysql_select_db ($base, $c);
parmetro CONSTRAINT seguido
de su valor. Ese valor es if(mysql_query("ALTER TABLE $tabla ADD Segundo_Apellido VARCHAR(40)",$c)){
precisamente el que necesitamos print "Sea ha creado el nuevo campo en ".$tabla."<br>";
para hacer modificaciones en los }
campos asociados de las tablas if(mysql_query("ALTER TABLE $tabla DROP Apellido2",$c)){
vinculadas. print "Sea ha borrado el campo Apellido 2 en ".$tabla."<br>";
Pulsando en este enlace cuyo
}
cdigo fuente tienes aqu podrs
if(mysql_query("ALTER TABLE $tabla1 ADD DP VARCHAR(5)",$c)){
visualizar el resultado de la
print "Sea ha creado el nuevo campo en ".$tabla1."<br>";
ejecucin de esa sentencia.
}
Conocido el valor de parmetro if(mysql_query("ALTER TABLE $tabla1 DROP distrito",$c)){
anterior el proceso de borrado del print "Sea ha borrado el campo distrito en ".$tabla1."<br>";
vnculo actual requiere la siguiente }
sintaxis:
mysql_close();
ALTER TABLE nombre de la tabla
?>
DROP FOREIGN KEY parametro
<?
$base="ejemplos";
$tabla="principal1";
$conexion=mysql_connect("localhost","pepe","pepa");
mysql_select_db($base,$conexion);
# modificamos un registro
mysql_query("UPDATE $tabla SET DNI='123456' WHERE DNI='111111'",
$conexion);
# borramos un registro
mysql_query("DELETE FROM $tabla WHERE (DNI='222222')",$conexion);
if (mysql_errno($conexion)==0){echo "<h2>Tablas actualizadas</b></H2>";
}else{
print "Ha habido un error al actualizar";
}
mysql_close();
?>
Ver contenido de la
Actualizar en cascada
tabla
Para que puedas retornar a las condiciones iniciales, desde este enlace podrs borrar las
tablas creadas para actualizacin en cascada. De esta forma podrs volver a crearlas,
cuando desees, en las condiciones iniciales.
Definicin de tablas
Estructura de tablas y relaciones
Para desarrollar los ejemplos de este captulo vamos a crear las tablas, cuyas estructuras
En este ejemplo de tablas e interrelaciones que puedes ver en el cdigo fuente siguiente:
vinculadas con integridad
relacional vamos a proponer la
situacin siguiente. <?
$base="ejemplos";
Crearemos una primera tabla $c=mysql_connect ("localhost","pepe","pepa");
(alumnos) que va a contener mysql_select_db ($base, $c);
datos personales de un grupo de ###############################################
personas. # Creacin de la tabla nombres con indice primario DNI
Para evitar duplicar un mismo
# tabla de nombres con ndice primario en DNI
alumno y alumnos sin DNI, vamos ###############################################
a utilizar como ndice primario $crear="CREATE TABLE IF NOT EXISTS alumnos (";
(PRIMARY KEY) el campo DNI (que $crear.="DNI CHAR(8) NOT NULL, ";
es nico para cada persona). $crear.="Nombre VARCHAR (20) NOT NULL, ";
$crear.="Apellido1 VARCHAR (15) not null, ";
La condicin de que el campo DNI $crear.="Apellido2 VARCHAR (15) not null, ";
sea PRIMARY KEY nos obliga a $crear.=" PRIMARY KEY(DNI) ";
definirlo con el flag NOT NULL,
$crear.=")";
dado que esta es una condicin
necesaria para la definicin de
$crear.=" Type=InnoDB";
ndices primarios. if(mysql_query ($crear ,$c)){
print "tabla <b>nombres</b> creada<BR>";
Crearemos una segunda tabla }else{
(domicilios) con los domicilios de print "ha habido un error al crear la tabla <b>alumnos</b><BR>";
cada uno de los alumnos, }
identificndolos tambin por su ###############################################
DNI. Para evitar que un mismo # Creacin de la tabla direcciones
alumno pueda tener dos domicilios
# tabla de nombres con ndice nico en DNI
asignamos a al campo DNI de esta
# para evitar dos direcciones al mismo alumno
tabla la condicin de ndice nico
(UNIQUE). # y clave fornea nombres(DNI)
# para evitar direcciones no asociadas a un alumno
El ndice UNIQUE podramos # concreto. Se activa la opcin de actualizar
haberlo creado tambin como # en cascada y de borrar en cascada
PRIMARY KEY ya que la nica ###############################################
diferencia de comportamiento $crear="CREATE TABLE IF NOT EXISTS domicilios (";
entre ambos es el hecho que aquel $crear.="DNI CHAR(8) NOT NULL, ";
admitira valores NULOS pero,
$crear.="calle VARCHAR (20), ";
dado que debemos evitar
$crear.="poblacion VARCHAR (20), ";
domicilios sin alumnos,
insertaremos el flag NOT NULL en $crear.="distrito VARCHAR(5), ";
este campo. $crear.=" UNIQUE identidad (DNI), ";
$crear.="FOREIGN KEY (DNI) REFERENCES alumnos(DNI) ";
El hecho de utilizar dos tablas no $crear.="ON DELETE CASCADE ";
tiene otro sentido que la $crear.="ON UPDATE CASCADE ";
ejemplificacin ya que lo habitual $crear.=") TYPE = INNODB";
sera que todos los datos if(mysql_query ($crear ,$c)){
estuvieran en una misma tabla.
print "tabla <b>domicilios</b> creada<br>";
Vincularemos ambas tablas de }else{
modo que no puedan crearse print "ha habido un error al crear la tabla <b>domicilios</b><BR>";
direcciones de alumnos }
inexistentes y les pondremos la ###############################################
opcin de actualizacin y borrado # Creacin de la tabla nombres con indice primario EVALUACIONES
en cascada. De esta forma las # tabla de nombres con ndice primario en NUMERO
acciones en la tabla de alumno se ###############################################
reflejaran automticamente en la $crear="CREATE TABLE IF NOT EXISTS evaluaciones (";
tabla de domicilios. $crear.="NUMERO CHAR(1) NOT NULL, ";
La tercera de las tablas $crear.="nombre_evaluacion VARCHAR (20) NOT NULL, ";
(evaluaciones) tiene como $crear.=" PRIMARY KEY(NUMERO)";
finalidad definir las distintas $crear.=")";
evaluaciones que puede realizarse $crear.=" Type=InnoDB";
a cada alumno. Tendr dos if(mysql_query ($crear ,$c)){
campos. Uno descriptivo (el print "tabla <b>evaluaciones</b> creada<BR>";
nombre de la evaluacin) y otro }else{
identificativo (no nulo y nico) que print "ha habido un error al crear la tabla <b>evaluaciones</b><BR>";
ser tratado como PRIMARY KEY }
para evitar duplicidades y porque,
###############################################
adems, va a ser utilizado como
clave fornea en la tabla notas.
# Creacin de la tabla notas
# indice UNICO para los campos DNI y evaluacion
La tabla notas va a tener tres # con ello se impide calificar dos veces al mismo
campos: DNI, n de evaluacin y # alumno en la misma evaluacion
calificacin. # claves forneas (DOS)
# el DNI de nombres para evitar calificar a alumnos inexistentes
Estableceremos restricciones para
# el NUMERO de la tabla evaluaciones para evitar calificar
evitar que:
# DOS VECES en una evaluacin a un alumno
###############################################
Podamos calificar a un $crear="CREATE TABLE IF NOT EXISTS notas (";
alumno inexistente. $crear.="DNI CHAR(8) NOT NULL, ";
Podamos calificar una
$crear.="evaluacion CHAR (1) NOT NULL, ";
evaluacin no incluida entre
las previstas.
$crear.="calificacion TINYINT (2), ";
Podamos poner ms a cada /* observa que este indice primario est formado
alumnos ms de una por dos campos (DNI y evalucion) y que, como siempre
calificacin por evaluacin. en el caso de PRIMARY KEY ambos son de tipo NOT NULL */
$crear.=" PRIMARY KEY vemaos(DNI,evaluacion), ";
Creando una ndice primario
/* Fijate en la secuencia siguiente:
formado por los campos DNI y 1.- Creamos el ndice
evaluacin evitaremos la ltima de 2.- Establecemos la clave fornea
3.- Establecemo las condiciones ON DELETE
las situaciones y aadiendo una 4.- Establecemos las condiciones ON UPDTE
vinculacin con las tablas alumnos
Es muy importe mantener esta secuencia para evitar
y evaluaciones estaremos en
condiciones de evitar las dos
errores MySQL */
primeras. $crear.=" INDEX identico (DNI), ";
$crear.="FOREIGN KEY (DNI) REFERENCES alumnos(DNI) ";
En este grfico puedes ver un $crear.="ON DELETE CASCADE ";
esquema de la definicin de estas $crear.="ON UPDATE CASCADE,";
tablas. /* Esta tabla tiene dos claves forneas asociadas a dos tablas
la anterior definida sobre alumnos como tabla principal
y esta que incluimos a continuacin asociada con evaluaciones
Como ves repetimos la secuencia descrita anteriormente
Es importante establecer estas definiciones de una en una
(tal como ves en este ejemplo) y seguir la secuencia
comentada anteriormente */
$crear.=" INDEX evalua (evaluacion),";
$crear.="FOREIGN KEY (evaluacion) REFERENCES evaluaciones(NUMERO) ";
$crear.="ON DELETE CASCADE ";
$crear.="ON UPDATE CASCADE";
$crear.=") TYPE = INNODB";
if(mysql_query ($crear ,$c)){
print "tabla <b>notas</b> creada <BR>";
}else{
print "ha habido un error al crear la tabla <b>notas</b><BR>";
echo mysql_error ($c)."<br>";
echo mysql_errno ($c);
}
mysql_close();
?>
Crear tablas
ejemplo
Cuidado!
Observa tambin que los campos de referencia de los vnculos que se establecen (en las
tablas primarias) tienen que ser definidos como PRIMARY KEY y que, por tanto, han de
establecerse como no nulos (NOT NULL).
El uso de esta opcin no requiere SELECT * INTO OUTFILE "nombre del fichero'
que se especifique previamente FIELDS
ENCLOSED BY pero si necesita
que se haya incluido FIELDS.
TERMINATED BY 'indicador de final de campo'
LINES ENCLOSED BY 'caracteres delimitadores de campos'
Si el fichero de datos contiene LINES
caracteres (distintos de los valores STARTING BY 'caracteres indicadores de comienzo de registro'
por defecto) para sealar el TERMINATED BY 'caracteres indicadores del final de registro'
comienzo de un registro, el final
FROM nombre de la tabla
del mismo o ambos, debe incluirse
este parmetro y, despus de l,
las especificaciones de esos <?
valores correspondientes a: $base="ejemplos";
$c=mysql_connect ("localhost","pepe","pepa");
STARTING BY
mysql_select_db ($base, $c);
Permite especificar una carcter
if(mysql_query ("SELECT * INTO OUTFILE
como indicador de comienzo de un
registro. Si se omite o se 'c:/Apache/htdocs/cursoPHP/alumnos.txt'
especifica como '' se interpretar FIELDS ENCLOSED BY '\"' TERMINATED BY ';'
que no hay ningn carcter que LINES STARTING BY '*' TERMINATED BY '\r\n'
seale en comienzo de lnea. FROM alumnos",$c)){
print "fichero alumnos.txt creado<br>";
TERMINATED BY }else{
Es el indicador del final de un echo mysql_error ($c)."<br>";
registro. Si se omite ser echo mysql_errno ($c);
considerado como un salto de lnea
}
(\n).
if(mysql_query ("SELECT * INTO OUTFILE
'c:/Apache/htdocs/cursoPHP/domicilios.txt'
Exportacin de ficheros FIELDS ENCLOSED BY '|' TERMINATED BY '*'
LINES STARTING BY '#' TERMINATED BY '}'
Se comporta de forma similar al FROM domicilios",$c)){
supuesto anterior. Utiliza la print "fichero domicilios.txt creado<br>";
sintaxis siguiente: }else{
echo mysql_error ($c)."<br>";
SELECT * INTO OUTFILE
echo mysql_errno ($c);
Inicia la consulta de los campos
}
especificados despus de SELECT
(si se indica * realiza la consulta if(mysql_query ("SELECT * INTO OUTFILE
sobre todos los campos y por el 'c:/Apache/htdocs/cursoPHP/notas.txt'
orden en el que fue creada la FROM notas",$c)){
tabla) y redirige la salida a un print "fichero notas.txt creado<br>";
fichero. }else{
echo mysql_error ($c)."<br>";
nombre del fichero echo mysql_errno ($c);
Es la ruta, nombre y extensin del }
fichero en el que sern
if(mysql_query ("SELECT * INTO OUTFILE
almacenados los resultados de la
consulta. 'c:/Apache/htdocs/cursoPHP/evaluaciones.txt'
FIELDS ENCLOSED BY '\'' TERMINATED BY ','
FIELDS
LINES STARTING BY ' ' TERMINATED BY '\r\n'
ENCLOSED BY FROM evaluaciones",$c)){
TERMINATED BY
print "fichero evaluaciones.txt creado<br>";
LINES
}else{
STARTING BY
TERMINATED BY echo mysql_error ($c)."<br>";
Igual que ocurra en el caso de echo mysql_errno ($c);
importacin de datos, estos }
parmetros son opcionales. Si no mysql_close();
se especifican se incluirn los ?>
valores por defecto.
Ejecutar script
Borrado
Borrado de usuarios
de usuarios MySQL
Modificacin de la
configuracin de
PHPMyAdmin
PHPMyAdmin nos dar este mensaje de error porque su configuracin por defecto utiliza
Hemos de modificar el fichero el usuario root que ya no existe. Acabamos de borrarlo!
config.inc.php que est en el
sudirectorio libraires de MyAdmin. Modificacin de config.inc.php
Un simple cambio, tal como el que
ves en las imgenes ser
suficiente.
Acceso a PHPmyAdmin
Dos opciones de
Precauciones previas
instalacin
Para configurar PHP como CGI es necesario que httpd.conf tenga una configuracin
distinta a la que hemos utilizado al instalarlo como mdulo de Apache.
El software del servidor Apache
permite configurar PHP de dos
Antes de realizar y probar esta nueva configuracin ser conveniente tomar algunas
maneras distintas, conocidas
como: mdulo de Apache y modo precauciones:
CGI.
Tenemos un fichero llamado httpd.conf que contiene la configuracin de PHP
La diferencia entre ambas como mdulo y nos interesa conservarlo.
configuraciones estriba en la forma
en la que interactan Apache y Vamos a abrirlo como nuestro editor DEV-PHP y lo guardaremos en el
PHP en cada caso.
mismo directorio c:/Apache/conf y sin hacer ninguna modificacin con el
Cuando se configura como mdulo nombre httpd_modulo.conf.
de Apache se utiliza el denominado
Dynamic Shared Object (Soporte De esta forma tendremos una copia segura de nuestra configuracin actual.
de Objetos Dinmicos
Compartidos), DSO, que permite Tenemos tambin otro fichero llamado httpd.orig, que habamos creado como
que el propio Apache cargue en medida cautelar al comenzar la instalacin de PHP como mdulo de Apache.
tiempo de ejecucin, y con un
formato especial, porciones de Como recordars, este fichero contiene la configuracin que se crea por
cdigo de un programa ejecutable defecto en el momento de instalar el servidor.
que, en nuestro caso, ser el
intrprete de PHP. Abramos httpd.orig y, sin hacer cambios por el momento, guardmoslo con
el nombre httpd_cgi.conf
Cuando Apache trabaja de esta
manera los mdulos no se cargan De esta forma podremos hacer nuestras modificaciones sobre httpd_cgi.conf sin
hasta el momento en que son correr el riesgo de daar la configuracin actual.
necesarios y eso tiene, entre otras,
la ventaja de que permiten
disponer de ms es- pacio de Modificaciones en httpd_cgi.conf
memoria.
Cuando Apache utiliza la Haremos ahora las modificaciones en httpd_cgi.conf como recordars, es una copia
configuracin en modo CGI de la configuracin inicial de Apache para que PHP trabaje en modo CGI.
(Common Gateway Interface) los
programas se ejecutan en tiempo Buscaremos las lnea 386:
real, de forma que cuando se
requiere la actuacin del y sustituiremos
intrprete, el servidor debe DirectoryIndex index.html
transferir toda la informacin por el siguiente bloque de lneas
necesaria a ese programa en este
caso el intrprete de PHP y
esperar a que ste concluya la DirectoryIndex index.html index.php index.htm
ejecucin y le devuelva los ScriptAlias /php/ "C:/Apache/php4/"
resultados de la misma. AddType application/x-httpd-php .php .php4
Action application/x-httpd-php "/php/php.exe"
Hay una
opcin ptima? guardaremos los cambios y ya tendremos lista la configuracin como CGI.
Es cierto que la configuracin Bastar abrir httpd_cgi.conf y guardar como... httpd.conf (reemplazando el que
como mdulo permite dotar a exista anteriormente con ese nombre), apagar el servidor si lo tenemos activo y
Apache con algunas opciones que arrancarlo de nuevo.
no permite la configuracin CGI y
esa es la razn por la que hemos En este nuevo arranque podremos observar dos cosas que nos indicarn que ha
optado por utilizar ese modo de cambiado la configuracin. La ventana MS-DOS de Apache, aparecer ahora as:
configuracin.
Configuracin CGI
Las directivas ScriptAlias se usan Este procedimiento puede resultarnos cmodo cuando utilicemos esta versin del
para indicarle a Apache cul es el servidor. Pero puede ocurrir que los mensajes de estas ventanas sean distintos de
directorio concreto que ha sido hecho, en la versin 2 de Apache lo son y el mtodo de comprobacin no nos sirva.
asignado para contener los
programas que debe ejecutar en Recurramos a info.php. Si abrimos una nueva ventana del navegador y ponemos
modo CGI. Apache asumir que como direccin http://localhost/info.php (recuerda que el fichero info.php lo habamos
cada fichero de este directorio es
guardado en htdocs que es el directorio raiz del servidor) podremos ver en las primeras
un programa CGI y tratar de lneas de la pgina lo siguiente:
ejecutarlo cuando sea preciso.
Instalacin de PHP5
Antes de empezar la configuracin
Configuracin de php.ini
Descomprime el fichero zip en C:
\Apache\php5 y copia al directorio
del sistema el fichero php5ts.dll En el directorio C:\Apache\php5 tenemos un fichero llamado php.ini-dist. Lo
que encontrars en l. abriremos con un editor de textos por ejemplo el Dev-PHP y haremos estas
modificaciones:
Recuerda usamos Windows98 lo
tenemos que poner en c:
Fichero inicial php.ini-dist
\windows\system.
Guardar como php.ini
Si tenemos Windows NT,
W2000, o XP tendremos que Modificaciones en el fichero inicial
copiarlo a \system32 Lnea Cambios
correspondiente al directorio en el
que tengamos instalado el sistema Donde dice:
operativo.
doc_root =
464
cambiar por:
Libreras no incluidas en
la distribucin doc_root=c:\Apache\htdocs\
Donde dice:
El fichero zip de esta versin de
PHP no incluye todas las libreras ;extension_dir="./"
de extensiones de PHP. Por citar 471
cambiar por:
un ejemplo, no viene la librera
que permite crear ficheros pdf que extension_dir ="c:\Apache\php5\ext\"
hemos tratado en pginas
Donde dice:
anteriores.
register_globals= Off"
En el directorio Extras encontrars 399
el fichero pecl-5.1.4-Win32.zip. cambiar por:
Cuidado!
(lnea en blanco)
728
cambiar por:
Proceso de instalacin
El programa de instalacin
Arrancar
Apache 2.0.58
El puerto 8080
(***) Las razones de esta modificacin son similares a las anteriores. Al quitar el :8080 ya no ser
Al realizar la instalacin de preciso incluir este valor al pedir las pginas desde el navegador
Apache2 nos aparece un icono
como este en la barra de tareas de (****)
Windows. Si quieres quitarlo, basta
con borrar el icono de acceso
directo que est en la carpeta:
C:\WINDOWS\Men Inicio Una vez efectuadas las modificaciones anteriores, al arrancar el servidor y escribir la
\Programas\Inicio. direccin: http://localhost deber aparecer la pgina por defecto de Apache.
Si a pesar de eso se resiste
tambin ir al la opcin Inicio -
>Ejecutar y escribir all msconfig
y desactivar all (pestaa Inicio)la
casilla de verificacin que dice:
Apache Service Taskbar Icon
Proceso de instalacin
PHP 4 como CGI
Los ficheros httpd.conf para esta instalacin de Apache 2.0.58 sern los que se
Al establecer este proceso hemos encuentran en el directorio: C:\Apache2\conf
considerado que las condiciones
son las sealadas en la pgina
anterior Fichero inicial httpd.orig
Guardar como h2_cgi4.conf
Es decir, consideraremos que ya
tenemos instalado PHP4 y que el Modificaciones en el fichero inicial
directorio de instalacin es c:
Lnea Cambios
\apache\php4\.
Donde dice:
Consideraremos tambin que el
directorio raz del servidor va a ser DocumentRoot "C:/Apache2/htdocs"
el mismo que el de Apache 1.3.35 228
cambiar por:
(que suponemos tambin
instalado) y que tenemos de los DocumentRoot "C:/Apache/htdocs"
ficheros php.ini creados al hacer
la configuracin de PHP 4 para la Donde dice:
versin 1 de Apache. <Directory "C:/Apache2/htdocs">
253
cambiar por:
Modo CGI
<Directory "C:/Apache/htdocs">
La configuracin es idntica a la Donde dice:
realizada en el caso de Apache
1.3.35. Slo se incluyen dos DirectoryIndex index.html index.html.var
modificaciones adicionales para cambiar e incluir la lneas siguientes:
indicar que el root de este servidor 321
no va a estar en el directorio DirectoryIndex index.html index.php index.htm
Apache2 sino en Apache. ScriptAlias /php4/ "C:/Apache/php4/"
AddType application/x-httpd-php .php
Respecto al acceso directo hay dos Action application/x-httpd-php "/php4/php.exe"
cambios a tener en cuenta. En esta
versin del servidor el fichero
ejecutable apache.exe no est en
Sintaxis de la lnea de comandos del acceso directo a esta configuracin
el directorio raz (como ocurre en
Apache 1.3.35) sino en el C:\Apache2\bin\apache.exe -w -f "C:\Apache2\conf\h2_cgi4.conf" -d "C:
subdirectorio bin. Esta \Apache2\"
circunstancia no obliga a
considerar esa modificacin a la
hora de escribir la ruta de acceso
en el acceso directo que crearemos PHP4 como mdulo de Apache 2.0.58
para arrancar el servidor en este
modo.
Fichero inicial httpd.orig
(lnea en blanco)
756
cambiar por:
Proceso de instalacin
PHP 5 como CGI
Al establecer este proceso hemos
considerado que las condiciones Los ficheros httpd.conf para esta instalacin de Apache 2.0.58 sern los que se
son las sealadas en la pgina encuentran en el directorio: C:\Apache2\conf
anterior
<Directory "C:/Apache2/htdocs">
Modo CGI 253
cambiar por:
La configuracin es idntica a la <Directory "C:/Apache/htdocs">
realizada en el caso de Apache
1.3.35. Slo se incluyen dos Donde dice:
modificaciones adicionales para
DirectoryIndex index.html index.html.var
indicar que el root de este servidor
no va a estar en el directorio cambiar e incluir la lneas siguientes:
Apache2 sino en Apache.
321 DirectoryIndex index.html index.php index.htm
Respecto al acceso directo hay dos ScriptAlias /php5/ "C:/Apache/php5/"
cambios a tener en cuenta. En esta AddType application/x-httpd-php .php
versin del servidor el fichero Action application/x-httpd-php "/php5/php-cgi.exe
ejecutable apache.exe no est en
el directorio raz (como ocurre en
Apache 1.3.35) sino en el
subdirectorio bin. Esta Sintaxis de la lnea de comandos del acceso directo a esta configuracin
circunstancia no obliga a
considerar esa modificacin a la C:\Apache2\bin\apache.exe -w -f "C:\Apache2\conf\h2_cgi5.conf" -d "C:
hora de escribir la ruta de acceso \Apache2\"
en el acceso directo que crearemos
para arrancar el servidor en este
modo.
(lnea en blanco)
756
cambiar por:
Proceso de instalacin
Proceso de instalacin
En la ventana 2 elegiremos la
opcin Custom que nos permitir
elegir el directorio de instalacin
tal como puedes ver en la ventana
3.
El fichero my.ini
En el caso de Windows XP y de
W2000 las cosas son distintas ya
que el instalador escribe my.ini en
directorio de instalacin (en el
supuesto que describimos sera c:
\mysql41). Si se trata de Windows
XP has que tomar la precaucin de
borrar cualquier otro archivo my.
ini que existiera en el directorio
Windows. De no hacerlo, MySQL
intentara utilizar aquel fichero y
no funcionara correctamente.
Uno de los cambios que han sido ubicacin en la que ha sido creado durante la instalacin.
introducidos en esta versin de La ubicacin donde ha sido creado my.ini se visualiza en la ventana 11 del
MySQL (respecto a las versiones proceso de instalacin.
4.0 y anteriores) es que ya no
incluye la opcin de utilizar Windows XP
winmysqladmin.
Requiere eliminar cualquier my.ini que pudiera existir en el directorio
No toques el registro de
Windows salvo en caso de
absoluta necesidad.
Desinstala previamente la
aplicacin a la que se accede
a travs del servicio antes de
eliminarlo.
Modificacin de php.ini
extension=php_mbstring.dll
MySQL 5.0