Universidad de Mendoza Teleinformática I – Lenguaje HTML ¿Qué es WWW? El servicio Web o WWW es una forma de representar la información en Internet basada en páginas. Una página WWW puede incluir información de diversas formas: texto, gráficos, sonido, video, hipertexto. Un hipertexto es texto resaltado que el usuario puede activar para cargar otra página WWW. La diferencia entre un documento hipertexto y un documento normal consiste en que el hipertexto contiene, además de la información, una serie de enlaces o conexiones con otros documentos relacionados, de manera que el lector puede pasar de un tema a otro y volver al documento original en el momento en que le interese. Las principales ventajas del servicio WWW son tres. Primera, que puede combinar texto y multimedia. Segunda, que los hiperenlaces permiten cargar páginas de cualquier otro servidor conectado a Internet, da igual que esté localizado en Argentina o en Australia. Y, tercera, que la creación de páginas WWW es bastante sencilla mediante el lenguaje HTML. ¿Qué es HTML? El HTML, HyperText Markup Language, es un lenguaje simple utilizado para crear documentos de hipertexto para WWW. No es un lenguaje de descripción de página como Postcript; HTML no permite definir de forma estricta la apariencia de una página, aunque una utilización algo desviada hace que se utilice en ocasiones como un lenguaje de presentación. Además, la presentación de la página es muy dependiente del navegador utilizado: el mismo documento no produce el mismo resultado en la pantalla si se visualiza con un navegador en modo caracter, Internet Explorer o Netscape, o sea, el HTML se limita a describir la estructura y el contenido de un documento, y no el formato de la página y su apariencia. Una de las claves del éxito de WWW, aparte de lo atractivo de su presentación es sin duda, su organización y coherencia. Todos los documentos WWW comparten un mismo aspecto y una única interfaz, lo que facilita enormemente su manejo por parte de cualquier persona. Esto es posible porque el lenguaje HTML, en que están escritos los documentos, no solo permite establecer hiperenlaces entre diferentes documentos, sino que es un "lenguaje de descripción de página" independiente de la plataforma en que se utilice. Es decir un documento HTML contiene toda la información necesaria sobre su aspecto y su interacción con el usuario, y es luego el navegador que utilicemos el responsable de asegurar que el documento tenga un aspecto coherente, independientemente del tipo de estación de trabajo desde donde estemos efectuando la consulta. Su simplicidad es tal que no es necesario utilizar un editor particular. Su gran permisividad exige rigor y atención en la estructura de documentos con el fin de que éstos se visualicen correctamente al margen del contexto y el navegador utilizado. Por tanto, como hemos visto, HTML es un lenguaje muy sencillo que nos permite preparar documentos Web insertando en el texto de los mismos una serie de marcas (tags) que controlan los diferentes aspectos de la presentación y comportamiento de sus elementos. Para escribir HTML lo único que se necesita es un editor de texto ASCII, como el Bloc de notas de Windows o en VI de UNIX. Las marcas o tags que controlan el comportamiento del documento son fragmentos de texto encerrados entre los signos "mayor que" y "menor que" (<marca>). Existen diferentes tipos de marcas: algunas controlan simplemente la presentación del texto del documento; otras, la forma en que se incluirán en él imágenes; otras, finalmente, los hipervínculos. Para completar el conjunto de herramientas básicas necesarias para escribir páginas HTML debemos contar con un cliente WWW, tal como Internet Explorer, o Netscape, para probar el documento a medida que lo 1 Universidad de Mendoza Teleinformática I – Lenguaje HTML vamos desarrollando. Las marcas funcionan muchas veces por parejas, una para indicar el inicio de enlace o formato, y otra para señalar el final. La marca de inicio consiste en una letra o una palabra (por ejemplo, estas son marcas de inicio: <B>, <TITLE>). La marca de final es la misma letra o palabra precedida por la barra inclinada o "slash" (es decir,</B>, </TITLE>). Existen, no obstante, algunas marcas que no requieren su pareja de cierre, como <BR> (que fuerza un salto de línea). Es importante señalar que las marcas, en general pueden estar indistintamente en mayúsculas o en minúsculas. Escribiendo un documento HTML Un documento HTML comienza con la etiqueta <html>, y termina con </html>. Dentro del documento (entre las etiquetas de principio y fin de html), hay dos zonas bien diferenciadas: el encabezamiento, delimitado por <head> y </head>, que sirve para definir diversos valores válidos en todo el documento; y el cuerpo, delimitado por <body> y </body>, donde reside la información del documento. La información almacenada en el encabezamiento no se muestra por pantalla, la única utilidad del encabezamiento en la que nos detendremos es la directiva <title>, que permite especificar el título de un documento HTML. Este título no forma parte del documento en sí: no aparece, por ejemplo, al principio del documento una vez que este se presenta con un programa adecuado, sino que suele servir como título de la ventana del programa que nos la muestra. Elementos y Atributos Elementos: La declaración de elementos en HTML por lo general está compuesta por 3 partes: Tag de inicio Contenido Tag de cierre El nombre del elemento se escribe en el tag de inicio (con el formato <elemento>) y en el tag de finalización (con el formato </elemento>). Existen algunos elementos que pueden omitir el tag de inicio o el tag de finalización. Pueden existir elementos anidados dentro de un documento, en este caso el primer tag de finalización cierra al último tag que se abrió el segundo al penúltimo y así sucesivamente. Atributos: Los elementos pueden tener propiedades asociadas, esas propiedades las llamamos atributos, algunos de ellos pueden tener valores y otros pueden ir sin valores. Los atributos se colocan en el tag de inicio a continuación del nombre del elemento y se separan entre ellos con espacios, en el caso de tener valores a continuación se coloca el signo igual (=) y entre comillas simples o dobles el valor. Se pueden asignar valores sin las comillas, pero no es una práctica muy recomendada. No es obligatorio definir todos los atributos en la definición de un elemento. Secciones General (Todos los documentos HTML deberían contener estos elementos) Tipo de documento 2 Universidad de Mendoza Teleinformática I – Lenguaje HTML <HTML></HTML> (Al principio y fin del documento) Cabecera de página <HEAD></HEAD> (Información descriptiva, tal como el título) Titulo de página <TITLE></TITLE> (Debe ir en el encabezado) Cuerpo de la página <BODY></BODY> (Cuerpo de la página) Definición estructural (Apariencia controlada por las preferencias del navegador) Encabezados <H?></H?> (Las especificaciones definen 6 niveles) Alineación <H? ALIGN=LEFT|CENTER|RIGHT></H?> División <DIV></DIV> Alineación <DIV ALIGN=LEFT|RIGHT|CENTER|JUSTIFY></DIV> Contenido definido (4.0) <SPAN></SPAN> Énfasis <EM></EM> (Se muestra usualmente como itálico) Énfasis fuerte <STRONG></STRONG> (Se muestra usualmente como negrita) Citación <CITE></CITE> (Se muestra usualmente como itálico) Código fuente <CODE></CODE> (Para listar código fuente) Ejemplo de salida <SAMP></SAMP> Entrada de teclado <KBD></KBD> Variable <VAR></VAR> Definición <DFN></DFN> Dirección del autor <ADDRESS></ADDRESS> Letras de tamaño grande <BIG></BIG> Letras de tamaño pequeña <SMALL></SMALL> Inserciones (4.0) <INS></INS> (Marca agregado en una nueva versión) <INS DATETIME=":::"></INS> (Fecha de cambios) <INS CITE="URL"></INS> (Puede ser usado para indicar una dirección que explique cambios) Borrado (4.0) <DEL></DEL> (Marca borrado en una nueva versión) El resto se aplica igual que en Inserciones 3 Universidad de Mendoza Teleinformática I – Lenguaje HTML Acrónimo (4.0) <ACRONYM></ACRONYM> Abreviado (4.0) <ABBR></ABBR> Formato de presentación (el autor específica la apariencia del texto) Negrita <B></B> Itálico <I></I> Subrayado (4.0) <U></U> (no muy utilizado) Línea al medio <STRIKE></STRIKE> (no muy utilizado) Línea al medio (4.0) <S></S> (no muy utilizado) Subíndice <SUB></SUB> Superíndice <SUP></SUP> Máquina de escribir <TT></TT> (se muestra con fuente mono espacio) Pre formato <PRE></PRE> (muestra el texto tal cual es) Ancho <PRE WIDTH=?></PRE> (en caracteres) Centrado <CENTER></CENTER> (tanto para texto como para imágenes) Parpadeo <BLINK></BLINK> Fuentes Tamaño <FONT SIZE=?></FONT> (varía desde 1 a 7) Cambio del tamaño del carácter <FONT SIZE="+|-?"></FONT> Color <FONT COLOR="#$$$$$$"></FONT> Tipo de fuente (4.0) <FONT FACE="***"></FONT> Tamaño de punto (Netscape 4) <FONT POINT-SIZE=?></FONT> Peso (Netscape 4) <FONT WEIGHT=?></FONT> Tamaño de fuente base (4.0) <BASEFONT SIZE=?> (desde 1 a 7; por defecto es 3) Marquesina (Internet Explorer) <MARQUEE></MARQUEE> Posicionamiento 4 Universidad de Mendoza Teleinformática I – Lenguaje HTML Múltiple columna (Netscape 3) <MULTICOL COLS=?></MULTICOL> Separación de columna (Netscape 3) <MULTICOL GUTTER=?></MULTICOL> Ancho de columna (Netscape 3) <MULTICOL WIDTH=?></MULTICOL> Capas (Netscape 4) Capa <LAYER></LAYER> Nombre <LAYER ID="***"></LAYER> Ubicación <LAYER LEFT=? TOP=?></LAYER> Ubicación relativa <LAYER PAGEX=? PAGEY=?></LAYER> Archivo origen <LAYER SRC="***"></LAYER> Apilamiento <LAYER Z-INDEX=?></LAYER> Ubicación en la pila <LAYER ABOVE="***" BELOW="***"></LAYER> Dimensión <LAYER HEIGHT=? WIDTH=?></LAYER> Camino de recorte <LAYER CLIP=,,,></LAYER> Visibilidad <LAYER VISIBILITY=SHOW|HIDDEN|INHERIT></LAYER> Fondo <LAYER BACKGROUND="$$$$$$"></LAYER> Color <LAYER BGCOLOR="$$$$$$"></LAYER> Capa inmediata <ILAYER></ILAYER> (Acepta los mismo atributos que LAYER) Contenido alternativo <NOLAYER></NOLAYER> Vínculos, gráficos y sonidos Vincular URI <A HREF="URL"></A> Vincular una localización en particular <A HREF="URL#***"></A> (Si se encuentra en otro documento) <A HREF="#***"></A> (Si se encuentra en el mismo documento) Ventana destino (4.0) <A HREF="URL" TARGET="***"></A> Acciones haciendo click (4.0) <A HREF="URL" ONCLICK="***"></A> (Javascript) Acciones de Mouse arriba de (4.0) <A HREF="URL" ONMOUSEOVER="***"></A> (Javascript) Acciones de Mouse saliendo (4.0) <A HREF="URL" ONMOUSEOUT="***"></A> (Javascript) 5 Universidad de Mendoza Teleinformática I – Lenguaje HTML Email Vincular un e-mail <A HREF="mailto:@"></A> Especificar subject <A HREF="mailto:@?SUBJECT=***"></A> (use a real ?) Definir localización (ancla) <A NAME="***"></A> Imágenes Mostrar imagen <IMG SRC="URL"> Alineación <IMG SRC="URL" ALIGN=TOP|BOTTOM|MIDDLE|LEFT|RIGHT> Alineación (Netscape 1) <IMG SRC="URL" ALIGN=TEXTTOP|ABSMIDDLE| BASELINE|ABSBOTTOM> Alternativa de presentación <IMG SRC="URL" ALT="***"> (si no se puede mostrar la imagen) Dimensiones <IMG SRC="URL" WIDTH=? HEIGHT=?> (en pixels) <IMG SRC="URL" WIDTH=% HEIGHT=%> (como porcentaje) Borde <IMG SRC="URL" BORDER=?> (en pixels) Mapas sobre imágenes <IMG SRC="URL" ISMAP> (requiere un script) <IMG SRC="URL" USEMAP="URL"> Mapas del lado del cliente <MAP NAME="***"></MAP> (describe al mapa) Sección del mapa <AREA SHAPE="DEFAULT|RECT|CIRCLE|POLY" COORDS=",,," HREF="URL"|NOHREF> Clip de video (Internet explorer <IMG DYNSRC="***" START="***" LOOP=?> Sonido de fondo (Internet explorer) <BGSOUND SRC="***" LOOP=?|INFINITE> Objeto embebido (Netscape 2) <EMBED SRC="URL"> (inserta un objeto en la página) Tamaño de objeto <EMBED SRC="URL" WIDTH=? HEIGHT=?> Objeto (4.0) <OBJECT></OBJECT> Parámetros de objetos (4.0) <PARAM> Divisores Párrafos <P></P> (El tag de cerrado es generalmente innecesario) Alineación <P ALIGN=LEFT|CENTER|RIGHT></P> 6 Universidad de Mendoza Teleinformática I – Lenguaje HTML Texto justificado <P ALIGN=JUSTIFY></P> Corte de línea <BR> (retorno de carro simple) Regla horizontal <HR> Alineación <HR ALIGN=LEFT|RIGHT|CENTER> Grosor <HR SIZE=?> (en pixels) Ancho <HR WIDTH=?> (en pixels) Ancho en porcentajes <HR WIDTH="%"> (como porcentaje del ancho de la página) Linea sólida <HR NOSHADE> (sin el efecto 3D) Sin cortes de líneas (Netscape 1) <NOBR></NOBR> (previene el corte de líneas) Listas (pueden anidarse entre si) Lista sin órden <UL><LI></UL> (<LI> antes de cada item de la lista) Compacta <UL COMPACT></UL> Tipo de viñeta <UL TYPE=DISC|CIRCLE|SQUARE> (para la lista entera) <LI TYPE=DISC|CIRCLE|SQUARE> (para este y los subsecuentes) Lista ordenada <OL><LI></OL> (<LI> antes de cada ítem de la lista) Compacta <UL COMPACT></UL> Tipo de numeración <OL TYPE=A|a|I|i|1> (para la lista entera) <LI TYPE=A|a|I|i|1> (para este y los subsecuentes) Numero de inicio <OL START=?> (para la lista entera) <LI VALUE=?> (para este y los subsecuentes) Lista de definición <DL><DT><DD></DL> (<DT> = término, <DD> = definición) Compacta <UL COMPACT></UL> Lista de menú <MENU><LI></MENU> (<LI> antes de cada ítem de la lista) Compacta <MENU COMPACT></MENU> Lista de directorio <DIR><LI></DIR> (<LI> antes de cada ítem de la lista) Compacta <DIR COMPACT></DIR> 7 Universidad de Mendoza Teleinformática I – Lenguaje HTML Fondo de pantalla y colores Fondo azulejado <BODY BACKGROUND="URL"> Marca de agua (Internet Explorer) <BODY BGPROPERTIES="FIXED"> Color de fondo <BODY BGCOLOR="#$$$$$$"> (el orden es rojo, verde y azul) Color de texto <BODY TEXT="#$$$$$$"> Color de vínculos <BODY LINK="#$$$$$$"> Color de vínculos visitados <BODY VLINK="#$$$$$$"> Color de vínculos activos <BODY ALINK="#$$$$$$"> Caracteres especiales Carácter especial < > & " Marca registrada Marca registrada Copyright Copyright Espacio &nbsp; &#?; &lt; &gt; &amp; &quot; &#174; &reg; &#169; &copy; (donde ? es el código ISO 8859-1) Información completa: Lista completa en <http://www.uni-passau.de/%7Eramsch/iso8859-1.html> Formularios (generalmente requiere un script en el servidor) Un formulario es una parte del documento que contiene elementos comunes y además contiene elementos especiales llamados controles, y, opcionalmente sus etiquetas. Los usuarios generalmente completan o modifican los valores de los controles de un formulario para luego enviárselo a un agente capaz de procesar esa información (WEB server, mail server, etc.). En la declaración de un formulario hay un atributo que indica a que URL se le va a enviar los datos (atributo ACTION), y solo puede ser enviado a través de un botón especial (tipo de botón SUBMIT). En HTML un documento puede contener mas de un formulario a la vez, pero solo se enviará la información del formulario al cual se le presiona el botón SUBMIT. Definición de formulario <FORM ACTION="URL" METHOD=GET|POST></FORM> Subir archivos (4.0) <FORM ENCTYPE="multipart/form-data"></FORM> Campo de entrada de datos <INPUT TYPE="TEXT| PASSWORD| CHECKBOX| RADIO| FILE| BUTTON| IMAGE| HIDDEN| SUBMIT| RESET"> 8 Universidad de Mendoza Teleinformática I – Lenguaje HTML Nombre del campo <INPUT NAME="***"> Valor del campo <INPUT VALUE="***"> Marcado? <INPUT CHECKED> (checkboxes y radio boxes) Tamaño del campo <INPUT SIZE=?> (en caracteres) Largo máximo <INPUT MAXLENGTH=?> (en caracteres) Botón <BUTTON></BUTTON> Nombre (4.0) <BUTTON NAME="***"></BUTTON> Tipo de botón (4.0) <BUTTON TYPE="SUBMIT|RESET|BUTTON"></BUTTON> Valor por defecto <BUTTON VALUE="***"></BUTTON> Etiquetas (4.0) <LABEL></LABEL> Elemento etiquetado (4.0) <LABEL FOR="***"></LABEL> Lista de selección <SELECT></SELECT> Nombre de la lista <SELECT NAME="***"></SELECT> Número de opciones <SELECT SIZE=?></SELECT> Selección múltiple <SELECT MULTIPLE> (se puede seleccionar mas de uno) Opción (de las listas desplegables) <OPTION> (items que se pueden seleccionar) Opción por defecto <OPTION SELECTED> Valor de la opción <OPTION VALUE="***"> Grupo de opciones (4.0) <OPTGROUP LABEL="***"></OPTGROUP> Área de texto Tamaño <TEXTAREA ROWS=? COLS=?></TEXTAREA> Nombre <TEXTAREA NAME="***"></TEXTAREA> Grupo de elementos <FIELDSET></FIELDSET> Leyenda (4.0) <LEGEND></LEGEND> (texto para grupo de elementos) Alineación <LEGEND ALIGN="TOP|BOTTOM|LEFT|RIGHT"></LEGEND> 9 Universidad de Mendoza Teleinformática I – Lenguaje HTML Tablas Definición de tablas <TABLE></TABLE> Alineación de la tabla (4.0) <TABLE ALIGN=LEFT|RIGHT|CENTER> Bordes <TABLE BORDER></TABLE> (activado o desactivado) <TABLE BORDER=?></TABLE> (asignar valor) Espacio entre celda y tabla <TABLE CELLSPACING=?> Espacio entre celda y texto <TABLE CELLPADDING=?> Ancho de tabla <TABLE WIDTH=?> (en pixels) Ancho en porcentaje <TABLE WIDTH=%> (porcentaje de la página) Color de tabla (4.0) <TABLE BGCOLOR="$$$$$$"></TABLE> Contorno de la tabla (4.0) <TABLE FRAME=VOID|ABOVE|BELOW|HSIDES|LHS|RHS| VSIDES|BOX|BORDER></TABLE> Reglas (4.0) <TABLE RULES=NONE|GROUPS|ROWS|COLS|ALL></TABLE> Color de borde (Internet explorer) <TABLE BORDERCOLOR="$$$$$$"></TABLE> Borde oscuro (Internet Explorer) <TABLE BORDERCOLORDARK="$$$$$$"></TABLE> Borde claro (Internet Explorer) <TABLE BORDERCOLORLIGHT="$$$$$$"></TABLE> Fila <TR></TR> Alineación <TR ALIGN=LEFT|RIGHT|CENTER VALIGN=TOP|MIDDLE|BOTTOM> Celda <TD></TD> (deben aparecer dentro de una fila) Alineación <TD ALIGN=LEFT|RIGHT|CENTER VALIGN=TOP|MIDDLE|BOTTOM> Sin corte de línea <TD NOWRAP> Columnas a unir <TD COLSPAN=?> Filas a unir <TD ROWSPAN=?> Ancho deseado (4.0) <TD WIDTH=?> (en pixels) Porcentaje de ancho (Netscape 3) <TD WIDTH="%"> (porcentaje de la tabla) Color de celda (4.0) <TD BGCOLOR="#$$$$$$"> Celdas de encabezado 10 Universidad de Mendoza Teleinformática I – Lenguaje HTML <TH></TH> (es igual que TD pero el texto es negrita y centrado) Alineación <TH ALIGN=LEFT|RIGHT|CENTER VALIGN=TOP|MIDDLE|BOTTOM> Sin corte de línea <TH NOWRAP> Columnas a unir <TH COLSPAN=?> Filas a unir <TH ROWSPAN=?> Ancho deseado (4.0) <TH WIDTH=?> (en pixels) Porcentaje de ancho <TH WIDTH="%"> (porcentaje de la tabla) Color de celda <TH BGCOLOR="#$$$$$$"> Cuerpo de tabla <TBODY> Pie de tabla (4.0) <TFOOT></TFOOT> (debe venir antes de THEAD> Encabezado de tabla (4.0) <THEAD></THEAD> Caption de la tabla <CAPTION></CAPTION> Alineación <CAPTION ALIGN=TOP|BOTTOM|LEFT|RIGHT> Columna (4.0) <COL></COL> (atributos de grupo de columnas) Columnas unidas (4.0) <COL SPAN=?></COL> Ancho de columna (4.0) <COL WIDTH=?></COL> Porcentaje de ancho (4.0) <COL WIDTH="%"></COL> Grupo de columnas (4.0) <COLGROUP></COLGROUP> (estructura de grupo de columnas) Columnas agrupadas (4.0) <COLGROUP SPAN=?></COLGROUP> Ancho de grupo <COLGROUP WIDTH=?></COLGROUP> Porcentaje de ancho <COLGROUP WIDTH="%"></COLGROUP> Marcos (Frames). Define y manipula regiones especificas de la pantalla Documento frame (4.0) <FRAMESET></FRAMESET> (en vez de <BODY>) Alto de filas (4.0) <FRAMESET ROWS=,,,></FRAMESET> (pixels o %) <FRAMESET ROWS=*></FRAMESET> (* = tamaño relativo) Ancho de columnas (4.0) <FRAMESET COLS=,,,></FRAMESET> (pixels o %) 11 Universidad de Mendoza Teleinformática I – Lenguaje HTML <FRAMESET COLS=*></FRAMESET> (* = tamaño relativo) Bordes (4.0) <FRAMESET FRAMEBORDER="yes|no"></FRAMESET> Ancho <FRAMESET BORDER=?></FRAMESET> Color <FRAMESET BORDERCOLOR="#$$$$$$"></FRAMESET> Espacio entre frames (Netscape 3) <FRAMESET FRAMESPACING=?></FRAMESET> Definición del frame (4.0) <FRAME> (contiene un frame individual) Mostrar documento (4.0) <FRAME SRC="URL"> Nombre (4.0) <FRAME NAME="***"|_blank|_self|_parent|_top> Ancho de margen (4.0) <FRAME MARGINWIDTH=?> (márgenes izquierdo y derecho) Alto de margen (4.0) <FRAME MARGINHEIGHT=?> (márgenes superior e inferior) Barras de desplazamiento? (4.0) <FRAME SCROLLING="YES|NO|AUTO"> No modificar el tamaño del frame (4.0) <FRAME NORESIZE> Bordes (4.0) <FRAME FRAMEBORDER="yes|no"> Color de bordes (4.0) <FRAME BORDERCOLOR="#$$$$$$"> Contenidos sin frame <NOFRAMES></NOFRAMES> (para navegadores sin frames) Frames inmediatos (4.0) <IFRAME></IFRAME> (tiene los mismos atributos que FRAME) Dimensiones <IFRAME WIDTH=? HEIGHT=?></IFRAME> <IFRAME WIDTH="%" HEIGHT="%"></IFRAME> Scripts y Java Script <SCRIPT></SCRIPT> Ubicación <SCRIPT SRC="URL"></SCRIPT> Tipo <SCRIPT TYPE="***"></SCRIPT> Lenguaje <SCRIPT LANGUAGE="***"></SCRIPT> Otro contenido (4.0) <NOSCRIPT></NOSCRIPT> (si los scripts no son soportados) Applet <APPLET></APPLET> Nombre de archivo <APPLET CODE="***"> 12 Universidad de Mendoza Teleinformática I – Lenguaje HTML Parámetros <APPLET PARAM NAME="***"> Ubicación <APPLET CODEBASE="URL"> Identificación <APPLET NAME="***"> (para referencias) Texto altenativo <APPLET ALT="***"> (para navegadores no Java) Alineación <APPLET ALIGN="LEFT|RIGHT|CENTER"> Tamaño <APPLET WIDTH=? HEIGHT=?> (en pixels) Espaciado <APPLET HSPACE=? VSPACE=?> (en pixels) Scripts en el servidor (Netscape 4) <SERVER></SERVER> Misceláneos Comentarios <!-- *** --> (el navegador no lo muestra) Prólogo <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> Dirección URL de este archivo <BASE HREF="URL"> (debe incluirse en el header) Nombre base de la ventana <BASE TARGET="***">( debe incluirse en el header) Relaciones <LINK REV="***" REL="***" HREF="URL"> (en el header) Archivo vinculado (4.0) <LINK TYPE="***" SRC="***"></LINK> Información Meta <META> (debe incluirse en el header) Hojas de estilos <STYLE></STYLE> HTML - Tabla Cronológica · 1986. Publicación de la ISO 8879 que presenta el Standard General Markup Language, origen del HTML. · 1989. Tim Berners-Lee, a la sazón en el Centro Europeo de Investigaciones Nucleares presenta su artículo Information Management: A Proposal dedicándose de lleno al desarrollo de un sistema que permitiera el acceso en línea de manera uniforme a la información disponible en muchos recursos distintos, y que pudiese funcionar en máquinas que conectadas por redes basadas en TCP/IP. · 1990-1991. Tim Berners-Lee define el HTML como un subconjunto de SGML (Standard Generalized Markup Language), que más tarde se llamará nivel 0; soporta encabezados, listas y anclas. Se crea el nombre World Wide Web. 13 Universidad de Mendoza Teleinformática I – Lenguaje HTML · 1991. Tim Berners-Lee introduce el primer visor de HTML, LineMode, que trabaja en modo texto y sólo en plataformas UNIX. El Centro Europeo de Investigaciones Nucleares realiza la apertura del primer sitio con acceso público de World Wide Web el 17 de mayo (http://info.cern.ch). · 1992. Dan Connolly produce la primera Definición de Tipo de Documento (DTD) para el lenguaje, llamada HTML 1.0, agregando a la definición original atributos para modificar el estilo físico del texto. Se distribuye Viola, primer visor gráfico de Web y disponible sólo para X.11. · 1993. Un nuevo visor que soporta un mayor nivel, Lynx, es producido por la Universidad de Kansas, si bien lee sólo texto. Aparece Mosaic, desarrollado por el Centro Nacional para Aplicaciones de Supercomputadoras, es el primer visor de Web en entorno gráfico que se hace disponible para computadoras personales, lo que lo hace inmediatamente popular. A fines de año, comienzan a aparecer los primeros artículos sobre WWW en diarios y revistas de circulación masiva. Tim Berners-Lee utiliza el trabajo del año anterior de Connolly para presentar el borrador de la primera norma (RFC -Recommendation for Comments) de HTML para Internet. · 1994. La Universidad Técnica de Graz desarrolla un servidor y clientes con mayores prestaciones para HTML, Hyper-G, que no tiene gran éxito. Cello, primer visor de HTML que no requiere TCP/IP presentado por la Escuela de Leyes de la Universidad de Cornell. Dan Connolly y Karen Olson Muldrow redefinen el HTML para el nivel 2.0, que ahora soporta formularios. Un grupo de programadores que desarrollaran el Mosaic producen un nuevo visor de World Wide Web, Netscape (también conocido como Mozilla), que tiene una amplia aceptación entre los usuarios, pero que soporta elementos de programación que equivalen a una degeneración del HTML (tamaños de letra, fondos). Se define un equivalente para los modelos en tres dimensiones del HTML, el VRML (Virtual Reality Modeling Language), que permite moverse dentro de los ambientes definidos. En este mismo año se realizan la Primera y Segunda conferencias internacionales de WWW, en Ginebra y Chicago, respectivamente. Se crea la W3 Organization. · 1995. Dave S. Raggett (Hewlett-Packard, Inglaterra) comienza a compilar la normativa del nuevo nivel del lenguaje, el HTML 3.0, cuya principal novedad es el soporte de tablas. Microsoft produce su primer visor de Internet, el cual también utiliza elementos de HTML degenerados. Una nueva versión de Netscape, Navigator 2.0, agrega soporte de encuadres. Sun Microsystems produce el primer visor de World Wide Web con soporte de un lenguaje de programación, HotJava. Se celebran la Tercera y Cuarta conferencias internacionales de WWW, en Boston y Darmstadt respectivamente, y la conferencia de WWW para Asia y el Pacífico en Wagga-Wagga.. · 1996. Netscape Communications y Microsoft presentan las nuevas versiones de sus visores que soportan gran parte del nivel de HTML 3.0. Aparecen visores no comerciales que implementan la norma completa de HTML 3.0. Se formaliza un nuevo nivel para la modelación en tres dimensiones, VRML 3.0, que permite interactuar con los objetos definidos. Se celebra la Quinta conferencia internacional de WWW en Rocquencourt. · 1997. D. Raggett presenta, en enero, la versión normalizada del 3.2. En julio, aparece la versión 4.0, experimental. · 1998. HTML 4.0. 14 Universidad de Mendoza Teleinformática I – Lenguaje PHP ¿Que es PHP? Es un lenguaje de scripts embebido dentro del lenguaje HTML. PHP fue creado por Rasmus Lerdorf en 1994 con la idea de mejorar las prestaciones que hasta ese momento brindaba la WWW, en un comienzo se lo llamaba Personal Home Pages Tools. En un principio era un lenguaje muy limitado y solo parseaba unos cuantos macros, y funciones básicas. Posteriormente le agrego un interprete y así surgió el PHP FI versión 2 (tenía soporte para la base de datos mSQL). Luego Zeev Suraski y Andi Gutmans se unieron al equipo y re escribieron el parser surgiendo la versión 3. La Ultima versión (la 4) cuenta con el motor de de scripts de Zend, haciéndolo más potente y rápido. Tipo de lenguaje Interpretado o compilado Scripts del lado del cliente o del servidor Orientado a objetos o no orientado a objetos Principales características del lenguaje del Lenguaje Permite hacer debug (con productos comerciales). Se puede compilar a código intermedio (con productos comerciales), lo que lo hace más rápido e inviolable. No permite que el usuario final pueda ver el código fuente una vez ejecutada la aplicación, pero el código fuente queda en el servidor, por lo que el administrador del sistema si tiene acceso. Se puede utilizar con clientes livianos y universales. Las actualizaciones en el sistema quedan a disposición automáticamente para todos los usuarios. Soporte para múltiples bases de datos (aproximadamente 21). Se puede instalar en múltiples plataformas (Unix, Linux, OS/2, Windows). Esta muy bien amalgamado con Apache. Alta curva de aprendizaje del lenguaje, sobre todo para los programadores del lenguaje C. Es de libre distribución. Ampliamente conocido. Gran cantidad de funciones, lo que lo hace muy potente. Soporta orientación a objetos. Como se instala en apache Primero se instala apache –la instalación depende de la plataforma donde se lo instales -, luego se deben modificar los siguientes parámetros del archivo httpd.conf ServerRoot "C:/Archivos de programa/Apache Group/Apache" Donde esta instalado el servidor. ServerName localhost Nombre del server. DocumentRoot "C:/Archivos …. /Apache/htdocs" Directorio principal de archivos. DirectoryIndex index.html Archivo por defecto del servidor. Una vez que se haya modificado los datos se agrega el soporte para PHP ScriptAlias /php/ "C:/Archivos de programa/Apache Group/php/" Action php3-script /php/php.exe AddHandler php3-script .php3 .html .htm .phtml Entorno de desarrollo, ejecución, server y debugger Desarrollo: Editor común o editor de html (FrontPage, GoLive, HomeSite) 15 Universidad de Mendoza Teleinformática I – Lenguaje PHP Ejecucion: Cliente de HTML (Netscape, Internet Explorer) Server: IIS, apache Debugger: www.zend.com Como se agregan scripts de PHP en HTML Formas de incluir codigo PHP: <script languaje="PHP"> ......... </script> <?PHP ..... ?> Esta es la forma estandar <? ..... ?> Pautas generales del PHP comentarios de una línea y de varias // comentarios de una línea /* comentario de varias líneas */ Fin de sentencias Pueden haber casos en que una sentencia con texto tenga varios renglones la delimitación debe hacerse entre comillas y luego finalizar con ; ; fin de líneas Salida por pantalla echo variable; echo “string”; 16 Universidad de Mendoza Teleinformática I – Tipos de datos primitivos Tipos de datos Primitivos ¿Cómo son las variables en PHP? Las variables se definen con el signo $ adelante del nombre de la variable, por ejemplo: $variable = 1; El nombre de variables puede tener cualquier largo y debe comenzar con una letra o el guión bajo (underscore), seguido de cualquier letra de la a-z o A-Z, guión bajo, carácter ascii desde 127 a 255, o un número. Las variables son case sensitive. Tipos de datos primitivos Números enteros (integer) La definición de los números enteros depende de la plataforma donde se ejecuta el interprete PHP, generalmente es un número de 32 bits con signo. Formas de declarar números enteros: $numero = 100; $numero = -100; $numero = o100; $numero = 0x100; // número 100 positivo // número 100 negativo //64 en decimal (octal 100) //256 en decimal (hexadecimal 100) Números flotantes (double) El tamaño de los números flotantes depende de la plataforma en que se ejecuta el PHP pero por lo general el número máximo aproximado es 1.8e208 con una precisión de 14 cifras decimales (64 bits) La forma de definir los números flotantes son: $numero = 1.234; $número = 1.2e3; Hay que tener en cuenta que algunos números no pueden ser convertidos a números binarios sin evitar la perdida de precisión y esa perdida de precisión puede generar errores no esperados. Cadenas (strings) Los strings pueden ser definidos por dos tipos de delimitadores: Comilla doble: $cadena = “esta es una cadena”; Comilla simple: $cadena = ‘esta es una cadena’; Las variables que están entre comillas dobles son evaluadas (sujeto a ciertas restricciones), el símbolo de escape que se utiliza es la barra invertida “\”. Los caracteres que se permiten escapar son los siguientes: \n Retorno de carro \r Avance de línea \t Tabulador \\ barra invertida \ 17 Universidad de Mendoza Teleinformática I – Tipos de datos primitivos \$ \” signo $ comillas dobles En el caso de la definición de strings con comillas simples, no se evalúan las variables y los únicos caracteres que se pueden escapar son los siguientes \’ y \\ Existe otra forma de delimitar strings que es el uso de la sintaxis “here doc”. La forma en que se define es la siguiente: "«<" más un identificador proporcionado por nosotros, al finalizar se termina con el mismo delimitador y ;. Por ejemplo: $str = «<CADENA Hola, buenos dias CADENA; El comportamiento de la sintaxis “here doc” es similar a la definición de string con comillas dobles. Los strings se concatenan con el punto (.), no con el más (+). Los caracteres dentro de un string pueden ser accedidos tratándolos como un arreglo indexado numéricamente. Conversión de strings $numero = 1 + ”2” ; $numero = 1 + “1.1e3”; $numero = 1 + “texto + 1”; $numero = 1 + “texto”; $numero = 1 + “10 años”; $numero = “10 años” + 1 ; $numero = “10 años” + 1.0 ; // igual a 3 // igual a 1101 // igual a 1 // igual a 1 // igual a 11 // igual a 11 // igual a 11 Comportamiento de variables (Type Juggling) PHP no requiere ni soporta definición explícita en la declaración de variables. El tipo de variable depende del contexto en el que se la usa. Si se le asigna a una variable un número entero entonces esa variable tendrá el tipo entero, pero si se le asigna a continuación a la misma variable un string entonces dejara de ser un entero para ser un string. Ejemplos de cambios de variables $variable = “0”; $variable++; $variable = $variable + 1; $variable = $variable + 1.3; $variable = 1 + “10 años”; es un string (“0”) es un string (“1”) es un entero (2) es un flotante (3.3) es un entero (11) Forzado de variables (Type Casting) El forzado de variables consiste en forzar un tipo dado de una variable, independientemente de la 18 Universidad de Mendoza Teleinformática I – Tipos de datos primitivos operación que se esté realizando. Para realizar el forzado de variables se indica entre paréntesis el tipo antes de la variable. El siguiente ejemplo fuerza una variable para que sea un número flotante: $entero = 200; $flotante = (int) $entero; Los tipos válidos de forzados son los siguientes: (int), (integer) – fuerza a entero (real), (float), (double) – fuerza a double (string) – fuerza a string (array) – fuerza a arreglo (object) – fuerza a objeto Cuando se fuerza una variable a un objeto la variable quedará almacenada en el atributo “scalar” del objeto, cuando se transforma a arreglo el valor será el primer elemento del arreglo. 19 Universidad de Mendoza Teleinformática I - Variables Variables Fundamentos Las variables se definen con el signo $ adelante del nombre de la variable, por ejemplo: $variable = 1; El nombre de variables puede tener cualquier largo y debe comenzar con una letra o el guión bajo (underscore), seguido de cualquier letra de la a-z o A-Z, guión bajo, carácter ascii desde 127 a 255, o un número. Las variables son case sensitive. Asignación de variables En la versión 3 de PHP se asignan las variables solamente por valor, esto quiere decir que si asigno una variable por valor $a=4; $b=$a; $b=5; al cambiar el valor de alguna de las dos variable no va a afectar a la otra. PHP 4 ofrece otro modo de asignar variables, este modo se llama asignación de variables por referencia. De esta forma la nueva variable hace referencia a la variable vieja, en otras palabras se convierte en un “alias de” o “apunta a” la otra variable. Cualquier cambio que haga a cualquiera de las dos variables, va a repercutir en la otra. El modo de asignar variables por referencia es anteponer el carácter & a la variable cuando se está haciendo la asignación. $b=&$a; Algo importante de destacar es que solo se puede asignar variables por referencia a variables declaradas, no se puede hacer sobre funciones, ni asignaciones de números u operaciones matemáticas. $variable = &(45+3); Incorrecto $variable = &5; Incorrecto $variable = &funcion(); Incorrecto Variables predefinidas PHP nos proporciona una gran cantidad de variables predefinidas, pero hay que tener en cuenta que existen algunas variables que dependen del entorno donde se ejecuta el PHP. Variables de Apache Estas variables son creadas por el servidor web Apache, si se utiliza un servidor web distinto al apache no hay garantía de que estas variables estén disponibles, puede que algunas no existan o que hayan otras nuevas. SERVER_NAME: es el nombre del host donde se está ejecutando el script de PHP. Si el script se está ejecutando en un host virtual, será el nombre del servidor virtual. SERVER_PROTOCOL: Es el nombre y la versión del protocolo con el cual se requirió la página por ejemplo ’HTTP/1.0’ REQUEST_METHOD: Cual fue el método con el que se accedió la página, por ejemplo ’GET’, ’HEAD’, ’POST’, ’PUT’. HTTP_REFERER: La dirección de la página – si existiera- de la cual fue referida la página 20 Universidad de Mendoza Teleinformática I - Variables actual en el navegador, esta se coloca por el navegador del usuario, no todos los navegadores lo hacen. REMOTE_ADDR: es la dirección IP desde donde se está viendo la página actual. REMOTE_PORT: es el puerto IP desde donde se está viendo la página actual. SERVER_PORT: el puerto IP que utiliza el servidor WEB REQUEST_URI: es la URI que fue dado para poder acceder a la página actual por ejemplo ’/index.html’. Variables de entorno Estas variables se importan al espacio de nombres global del PHP desde el ambiente donde se ejecuta el parser de PHP. Muchas de ellas son provistas por el shell donde se está ejecutando el PHP, como existen diferentes tipos de shell es prácticamente imposible listar las variables de entorno. Variables de PHP Estas variables son creadas por el mismo PHP. argv: Es un arreglo de argumentos que han sido pasados al script. cuando se llama al PHP desde la linea de comandos, nos da un estilo similar al C para acceder a los datos pasados al script. Cuando se lo llama a través del método GET, este contendrá el string de petición. argc: si se lo ejecuta desde la linea de comandos, contendrá el número de parámetros que se le enviaron al script. PHP_SELF: Indica el nombre del script que se está ejecutando actualmente, se presenta en forma relativa al documento raíz, si se esta ejecutando desde la linea de comandos la variable no está disponible. HTTP_COOKIE_VARS: es un arreglo asociativo de variables pasado al script actual a través de cookies HTTP. HTTP_GET_VARS: es un arreglo asociativo de variables pasado as script actual a través del método HTTP GET. HTTP_POST_VARS: es un arreglo asociativo de variables pasado as script actual a través del método HTTP POST. HTTP_POST_FILES: es un arreglo asociativo de variables que contiene información a cerca de archivos subidos al servidor a través del método HTTP_POST HTTP_ENV_VARS: es un arreglo asociativo de variables pasadas al script actual a traves del entorno pariente HTTP_SERVER_VARS: es un arreglo asociativo de variables pasado as script actual a través del servidor HTTP, estas variables son análogas a las variables de entorno previamente mencionado. Ambito de las variables El ámbito de las variables está determinado por el contexto donde se han definido. La mayor parte de las variables tienen un ámbito simple. Este ámbito simple también abarca a los archivos incluidos y requeridos. $var = 1; include(“archivo.php3”); Function probar() { echo $var; 21 Universidad de Mendoza Teleinformática I - Variables } probar(); echo $var; En este script se define la variable $var, a diferencia del lenguaje C – donde las variables globales están disponibles dentro de las funciones- la variable $var no estará disponible dentro de la función probar(), la función hace referencia a la variable $var que es local a la función, para hacer que las variables globales se puedan acceder desde adentro de una función se deberá hacer lo siguiente: Function probar() { global $var; $var = 4; } echo $var; global //el resultado por pantalla va a ser 4 ya que se hicieron cambios sobre la variable Otra forma de acceder a las variables globales dentro de una función es: Function probar() { echo $GLOBALS[“var”]; } La variable $GLOBALS es un arreglo asociativo cuyas claves son los nombres de las variables globales. Cuando se crean las variables dentro de un ámbito se asigna una porción de la memoria del sistema para almacenar el valor de la misma, al abandonar o salir de ese ámbito la variable se “destruye” y se libera la memoria asignada, otra característica del ámbito de variables es el modificador static, este modificador hace que cuando se salga del contexto en que se creó la variable no se “destruya” y pueda ser utilizada la próxima vez que se trabaje dentro de ese ámbito (generalmente en el llamado a funciones). Por ejemplo: Function probar() { static $var=0; $var++; } Esta función inicializará la variable $var en cero y luego conservará el valor que vaya tomando a medida que se ejecuta la función. Variables variables Existen ocasiones en que es muy útil tener variables de nombres variables. Dicho de otro modo, son nombres de variables que se pueden establecer y usar dinámicamente. 22 Universidad de Mendoza Teleinformática I - Variables Suponiendo que se han definido las siguientes variables: $variar = “valor”; $valor = “auto”; $color = “rojo”; Para utilizar variables variables se utiliza el signo pesos ($) delante de la variable. echo $variar; //produce como salida: valor echo $valor; //produce como salida: auto echo $$variar; //produce como salida: auto En el tercer caso se utilizó una variable variable, como $nombre tiene como dato “valor” hacer $$nombre equivale a hacer $valor. Por ende, es evidente que $variable es el nombre de la variable; Si se asignara a $variar = “color” cuando se haga echo $$variar; dará como resultado “rojo” Para usar variables variables con arreglos, hay que resolver un problema de ambigüedad. Si se escribe $$a[1] el intérprete necesita saber si nos referimos a utilizar $a[1] como una variable, o si se pretendía utilizar $$a como variable y el índice [1] como índice de dicha variable. La sintaxis para resolver esta ambiguedad es: ${$a[1]} para el primer caso y ${$a}[1] para el segundo. Variables externas a PHP Formularios HTML (Métodos GET y POST) Cuando se envía un formulario a un script de PHP todas los objetos del formulario automáticamente pasan a ser variables en el script de PHP. Se puede enviar arreglos desde HTML a PHP de la siguiente forma: <form action=”siguiente.php3” method=”post”> <input type=”text” name=”direccion[calle]”> <input type=”text” name=”direccion[nro]”> <input type=”submit”> </form> En PHP versión 3 se pueden trabajar arreglos unidimensionales, en el caso del PHP 4 no existe esa restricción. HTTP Cookies Las cookies son un mecanismo de almacenamiento de datos en el cliente remoto, y de esa forma poder realizar diversos controles. PHP provee una forma de asignar cookies a través de la función SetCookie. Dado que las cookies son parte de del encabezado del HTTP las llamadas a la función SetCookie deben hacerse antes de enviar cualquier dato al navegador. Esta es la misma restricción que para la función header(). Las cookies que se reciben son transformadas automáticamente a variables en el PHP. 23 Universidad de Mendoza Teleinformática I - Variables Variables de entorno Puntos en los nombres de variables Como el punto es un carácter que se utiliza para concatenar cadenas, todos los puntos que vienen con variables serán transformadas a guión bajo. Determinando el tipo de variable PHP convierte los datos automáticamente al tipo que más le conviene según la operación que se está utilizando. Algunas veces para el usuario no es tan obvio de que tipo de dato se trata, para ello PHP incluye las siguientes funciones para poder determinar el tipo de dato: gettype() is_long() is_double() is_string() is_array() is_object() 24 Universidad de Mendoza Teleinformática I - Constantes Constantes PHP define varias constantes y además proporciona un mecanismo para definir más constantes en tiempo de ejecución. Las constantes son similares a las variables, pero se diferencian en ciertos puntos: Para declararlas se debe utilizar la función define(). Una vez que se ha definido no puede cambiarse el valor originalmente asignado. Las constantes no tienen el signo $ precediendolas. Se pueden acceder desde cualquier lugar sin tener en cuenta el ámbito de las variables. Solo pueden evaluar valores escalares. Declaración de constantes: define(“Nombre”, “valor”) Ejemplo: define("CONSTANTE", "esta es una constante"); echo CONSTANTE; Constantes que siempre están presentes en PHP __FILE__: Es el nombre del archivo que se está siendo interpretado actualmente. Si se usa dentro de un archivo que ha sido incluido o requerido nos dará el nombre del archivo incluido o requerido y no el del padre. __LINE__: Es el número de línea dentro del archivo que se está interpretando, si se utiliza dentro de un archivo incluido o requerido entonces la posición será la del archivo incluido o requerido. PHP_VERSION: Es un string que representa la versión del intérprete de PHP que está ejecutando el script que produjo el llamado a la constante, por ejemplo ‘3.0.8-dev’. PHP_OS: Es el nombre del sistema operativo en el cual se esta ejecutando el PHP, por ejemplo: ‘Linux’. TRUE: valor verdadero. FALSE: valor falso. E_ERROR: Denota un error distinto de un error de interpretación del cual no es posible recuperarse. E_WARNING: Denota una condición en la que PHP sabe que hay un error, pero de todas formas puede continuar; este puede ser capturado por el mismo script. E_PARSE: El interprete encontró sintaxis inválida en el archivo de comandos. La recuperación no es posible. E_NOTICE: Ocurrió algo que pudo ser o no un error. La ejecución continúa. Los ejemplos incluyen usar una cadena sin comillas como un índice "hash", o acceder a una variable que no ha sido inicializada. Las constantes E_* se usan típicamente con la función error_reporting() para configurar el nivel de informes de error. 25 Universidad de Mendoza Teleinformática I - Operadores Operadores Operadores aritméticos Ejemplo $a + $b $a - $b $a * $b $a / $b $a % $b Operación Suma Resta Multiplicación División Módulo Resultado La suma de $a y $b La diferencia entre $a y $b El producto entre $a y $b El cociente entre $a y $b El resto del cociente entre $a y $b Operador de asignación El operador de asignación es el “=”. PHP permite hacer algunos trucos al realizar asignaciones: $a = $b = 5; $a = ($b = 4) + 5; //$a y $b tienen valor 5 //$a tiene el valor 9 y $b el valor 4 Además del operador básico de asignación, pueden utilizarse “operadores combinados” para todos los operadores binarios aritméticos y de strings que permiten, de una sola vez, usar una variable en una expresión y luego establecer el valor de esa variable al resultado de la expresión. Ejemplo: $a = 10; $a += 20; $a = “Buenos “; $a .= “días”; //$a tendrá un valor de 10 //$a tendrá un valor de 30 //$a tendrá un valor “Buenos dias” Operadores a nivel de bits Ejemplo Operación Resultado $a & $b And Los bits que estén en 1 en $a y $b permanecerán en 1 $a | $b Or Los bits que estén en 1 en $a o $b permanecerán en 1 $a ^ $b Xor Los bits que estén en 1 o 0 a la vez en $a y $b se pondrán en 1 ~$a Not Todos los bits en 1 pasan a cero y los que están en cero pasan a1 $a « $b Desplazar a la izquierda Se desplazan los bits hacia la izquierda (equivale a multiplicar por 2) $a » $b Desplazar a la derecha Se desplazan los bits hacia la derecha (equivale a dividir por 2) Operadores de comparación Ejemplo Operación $a == $b Igual $a === $b Idéntico mismo tipo de dato (PHP4) $a != $b No igual $a !== $b No idéntico diferentes (PHP4) Resultado Verdadero si $a es igual a $b Verdadero si $a es igual a $b y además si son del Verdadero si $a es distinto a $b Verdadero si $a es distinto a $b o si sin de tipos de dato 26 Universidad de Mendoza Teleinformática I - Operadores $a < $b $a > $b $a <= $b $a >= $b Menor que Mayor que Menor o igual que Mayor o igual que Verdadero si $a es menor que el valor de $b Verdadero si $a es mayor que el valor de $b Verdadero si $a es menor o igual que el valor de $b Verdadero si $a es mayor o igual que el valor de $b Otro operador de comparación es el operador ternario ?: Ejemplo: (expresión 1) ? (expresión 2) : (expresión 3) En este caso se evalúa la expresión 1, si es verdadera entonces se evalúa la expresión 2, si la expresión 1 es falsa entonces se ejecuta la expresión 3. Los operadores se pueden dividir en operadores unarios y binarios. Los operadores unarios aquellos que operan sobre un término p.e. ~$a, los operadores binarios operan sobre 2 términos p.e. $a - $b. Operador de control de errores PHP tiene un solo operador de control de errores que es la arroba “@”. Para utilizarlo se antepone el carácter @ a la expresión que queremos controlar, si la expresión produce un error se ignorará el error generado. Si la opción track_errors fue habilitada en la configuración de PHP entonces se cargará el error en la variable global $php_errormsg. Esta variable contendrá solo el último error por lo que si se desea saber cual fue el error debemos asegurarnos de leerlo antes que otra línea de código genere un nuevo error y sobreescriba la variable. Hay que tener cuidado cuando se utiliza la @, ya que incluso deshabilita los errores críticos que detienen la ejecución de los scripts, esto quiere decir que si se utiliza la @ para suprimir errores que puedan llegar a producir algunas expresiones puede que se interrumpa la ejecución del script y no podamos saber cual fue el error. Operador de ejecución PHP tiene un solo operador de ejecución que es la comilla simple invertida “ ` ”, hay que aclarar que NO es la comilla simple. Cuando PHP encuentre una expresión entre comillas simples invertidas tratará de ejecutarla como una llamada al sistema operativo y se devolverá el resultado, este resultado puede ser asignado a una variable. Ejemplo En Unix o Linux: $salida = `ls -l`; echo “<PRE>$salida</PRE>”; En Windows $salida = `dir`; echo “<PRE>$salida</PRE>”; Operadores de incremento y decremento Ejemplo ++$a Operación Preincremento Resultado Devuelve $a después de haber incrementado en 1 su valor 27 Universidad de Mendoza Teleinformática I - Operadores $a++ --$a $a-- Postincremento Predecremento Postdecremento Devuelve $a, y después incrementa en 1 su valor Devuelve $a después de haber decrementado en 1 su valor Devuelve $a, y después decrementa en 1 su valor Ejemplos <?php echo "<h3>Postincremento</h3>"; $a = 5; echo "Debería ser 5: " . $a++ . "<br>\n"; echo "Debería ser 6: " . $a . "<br>\n"; echo "<h3>Preincremento</h3>"; $a = 5; echo "Debería ser 6: " . ++$a . "<br>\n"; echo "Debería ser 6: " . $a . "<br>\n"; echo "<h3>Postdecremento</h3>"; $a = 5;echo "Debería ser 5: " . $a-- . "<br>\n"; echo "Debería ser 4: " . $a . "<br>\n"; echo "<h3>Predecremento</h3>"; $a = 5; echo "Debería ser 4: " . --$a . "<br>\n"; echo "Debería ser 4: " . $a . "<br>\n"; ?> Operadores lógicos Ejemplo $a and $b And $a or $b $a xor $b Xor al mismo tiempo !$a Not $a && $b And $a || $b Or Operación Or Resultado Verdadero si $a y $b son verdaderos Verdadero si $a o $b son verdaderos Verdadero si $a o $b son verdaderos, pero no si $a y $b lo son Verdadero si $a no es verdadero Verdadero si $a y $b son verdaderos Verdadero si $a o $b son verdaderos La diferencia entre las dos formas distintas de operadores AND y OR es la precedencia de operadores que se explica más tarde. Precedencia de operadores La precedencia de operadores especifica cómo se agrupan las expresiones. Por ejemplo, en la expresión 1 + 5 * 3, la respuesta es 16 y no 18 porque el operador de multiplicación ("*") tiene una mayor precedencia que el de adición ("+"). La siguiente tabla lista la precedencia de operadores, indicándose primero los de menor precedencia. Asociatividad Operadores izquierda , izquierda or 28 Universidad de Mendoza Teleinformática I - Operadores izquierda izquierda derecha izquierda izquierda izquierda izquierda izquierda izquierda izquierda no asociativo no asociativo izquierda izquierda izquierda derecha derecha no asociativo xor and print = += -= *= /= .= %= &= |= ^= ~= <<= >>= ?: || && | ^ & == != === < <= > >= << >> +-. */% ! ~ ++ -- (int) (double) (string) (array) (object) @ [ new Operadores de strings Hay dos operadores de strings. El primero es el operador de concatenación punto “.”, el cual devuelve como resultado la concatenación de los argumentos a la derecha y a la izquierda del argumento. El segundo operador de concatenación es el operador de concatenación y asignación “.=” el cual agrega y asigna el argumento de la derecha en el de la izquierda. 29 Universidad de Mendoza Teleinformática I – Estructuras de control Estructuras de control IF La construcción IF es una de las construcciones más importantes de los lenguajes de programación, y en PHP no es la excepción. Permite ejecutar fragmentos de programas en forma condicional. La estructura de IF es similar al lenguaje C. Estructura: if (expresión) sentencia En la definición se evalúa la condición de verdadero de la expresión, si es verdadero se ejecutará la sentencia, en caso de ser falso se ignorará. Ejemplo if ($a < $b) echo ‘$a es menor que $b’; Siempre que se cumpla que $a sea menor que $b se ejecutará el la porción de código. Pueden anidarse las estructuras IF dentro de otras, de esta forma si pueden armar estructuras muy complejas. ELSE Si se quiere ejecutar una porción de código cuando cierta expresión es verdadera se utiliza la estructura IF, pero si quisiéramos ejecutar una porción de código cuando no se cumple la condición se utiliza la estructura ELSE. ELSE extiende la funcionalidad a la estructura IF. Ejemplo: if ($a < $b) echo ‘$a es menor que $b’; else echo ‘$a es mayor que $b’; ELSEIF Es una combinación entre else y el if, como el else extiende al if cuando la condición del if no se cumple. Pero la diferencia es que el elseif se ejecuta si la condición dentro del elseif es verdadera. Ejemplo: if ($a < $b) echo ‘$a es menor que $b’; elseif ($a == $b) echo ‘$a es igual a $b’; 30 Universidad de Mendoza Teleinformática I – Estructuras de control else echo ‘$a es mayor que $b’; WHILE El lazo while es el más simple en PHP, el comportamiento es igual al del lenguaje C. La estructura básica del lazo while es la siguiente: while (expresión) sentencias El funcionamiento del lazo while es muy simple, se ejecutará el bloque de sentencias anidadas sentencias hasta que la expresión sea verdadera. La expresión sólo se evalúa cada vez que se reinicia el lazo de sentencias, por lo tanto por más que se cumpla la condición de la expresión en medio de la ejecución no se terminará de ejecutar el bloque de sentencias hasta que se evalúe la expresión al finalizar el bloque (antes de comenzar una nueva iteración del ciclo). Puede ocurrir que la expresión evalúe a verdadero en la primera iteración, por lo tanto no se ejecutará el bloque de sentencias. Ejemplo $i = 1; while ($i <= 10) { print $i++; } DO .. WHILE do {sentencias;} while (expresión); El lazo do .. while es similar al bloque while, la principal diferencia es que la condición de la expresión se evalúa al finalizar el bloque de sentencias. De esta forma nos aseguramos que por lo menos se ejecute una vez el bloque de sentencias. $i =1; do { print $i++; } while ($i <= 10); Existe una forma de interrumpir la ejecución de un bloque de sentencias de manera inmediata y así abandonarlo y continuar con la siguiente sentencia a continuación del lazo do .. while. La intrucción que nos permite realizar esto es break. Ejemplo 31 Universidad de Mendoza Teleinformática I – Estructuras de control $i =1; do { print $i++; if ($i == 5) {break;} } while ($i <= 10); print $i; En el ejemplo cuando $i valga 5 la condición del if será verdadera y se ejecutará la sentencia break, a continuación se ejecutará la sentencia print $i. FOR El lazo For es el más complejo en PHP, el comportamiento es similar al del lenguaje C. For (expresión 1; expresión 2; expresión 3) sentencias La expresión 1 se ejecuta UNA SOLA VEZ de manera incondicional al principio del lazo, estas sentencias se utilizan por lo general para inicializar variables. La expresión 2 se evalúa cada vez que se inicia el ciclo de sentencias, y se seguirá haciendo siempre y cuando la expresión 2 sea evaluada como verdadera. Al finalizar el bloque de sentencias, se ejecuta la expresión 3 y a continuación se vuelve a evaluar la expresión 2. Cada expresión puede ser vacía (expresión 1 o expresión 2 o expresión 3), en el caso en que la expresión 2 sea vacía será evaluada siempre verdadera. A primera vista esto puede resultar inútil, ya que nunca terminará el lazo for, pero se podría terminar la ejecución haciendo una evaluación con las sentencias if y break. Ejemplos: Ejemplo 1 for ($i = 1; $i <= 10; $i++) { print $i; } Ejemplo 2 for ($i = 1;;$i++) { if ($i > 10) { break; } print $i; } Ejemplo 3 $i = 1; for (;;) 32 Universidad de Mendoza Teleinformática I – Estructuras de control { if ($i > 10) { break; } print $i; $i++; } Ejemplo 4 for ($i = 1; $i <= 10; print $i, $i++) ; Estos 4 ejemplos dan el mismo resultado, pero da una muestra de cómo se puede utilizar los lazos for de formas diferentes. FOREACH El lazo foreach se introdujo en la versión 4 de PHP. Es una forma corta y sencilla de recorrer los elementos de un arreglo. Existen 2 formas de declarar los lazos foreach, que se describen a continuación: foreach(arreglo as $valor) sentencias foreach(arreglo as $clave => $valor) sentencias En cada iteración del lazo la variable $valor va conteniendo el valor de cada uno de los elementos del arreglo y el puntero que indica el elemento actual se va incrementando. Cada vez que se inicie el lazo foreach el puntero del arreglo inicia desde el primer elemento, por lo que no hay que reestablecer el puntero cada vez que queramos leer los elementos del arreglo. La diferencia entre la primer forma de declarar el lazo de la segunda es que en la última se irá almacenando cada elemento (clave o key) en la variable $clave. Hay que aclarar que el lazo foreach trabaja sobre una copia del arreglo y no sobre el propio arreglo, por lo que si se realizan cambios a los elementos el arreglo original no se verá afectado. Ejemplos: reset ($arr); while (list(, $value) = each ($arr)) { echo "Value: $value<br>\n"; } foreach ($arr as $value) { echo "Value: $value<br>\n"; } reset ($arreglo); 33 Universidad de Mendoza Teleinformática I – Estructuras de control while (list($clave, $valor) = each ($arreglo)) { echo "Clave: $clave; Valor: $valor<br>\n"; } foreach ($arreglo as $clave => $valor) { echo "Clave: $clave; Valor: $valor<br>\n"; } Estos son ejemplos de cómo se leen elementos de un arreglo con foreach y como se hacía en PHP versión 3. Los ejemplos corresponden a las dos formas en las que se pueden declarar los lazos foreach. BREAK La sentencia break permite detener la ejecución de los lazos for, while y switch. Opcionalmente se le puede pasar un argumento que indicará cuantos niveles de anidamiento queremos detener. Ejemplo: $i = 0; while (++$i) { switch ($i) { case 5: echo "At 5<br>\n"; break 1; /* Sale solamente del switch. */ case 10: echo "En 10; salir <br>\n"; break 2; /* Sale del switch y del while. */ default: break; } } CONTINUE La sentencia continue permite saltear la ejecución del resto de una iteración y continua ejecutando desde el comienzo de la próxima iteración. La diferencia con break es que continua la ejecución del lazo que contiene la sentencia y break la interrumpe. Al igual que break acepta un parámetro opcional que permite saltear varios niveles de iteraciones. SWITCH La sentencia switch equivale a hacer una serie de comparaciones con la sentencia if, pero sobre el mismo valor, de hecho la sentencia switch fue hecha para esto. En muchas ocasiones uno desea hacer comparaciones de una misma variable con un cierto número de valores y en función de cada una de las comparaciones ejecutar una porción de código distinto. 34 Universidad de Mendoza Teleinformática I – Estructuras de control if ($i == 0) { print "i es igual a 0"; } if ($i == 1) { print "i es igual a 1"; } if ($i == 2) { print "i es igual a 2"; } switch ($i) { case 0: print "i es igual a 0"; break; case 1: print "i es igual a 1"; break; case 2: print "i es igual a 2"; break; } El funcionamiento de switch es muy sencillo: el programa busca alguna sentencia case en la que coincida el valor con el valor de la variable $i, una vez encontrada ejecutará el código asociado al case y se detendrá en la sentencia break. Si no se escribe la sentencia break al final del bloque seguirá ejecutando hasta terminar con los case que siguen o hasta que encuentre la sentencia break. Muchas veces se desea ejecutar la misma porción de código para uno o más valores de la variable $i, para este caso se hará lo siguiente: switch ($i) { case 0: case 1: case 2 print "i es menor o igual que 2"; break; case 3 print "i es mayor que 2"; break; } Existe una opción dentro de la declaración del switch que sirve para ejecutar una porción de código cuando ninguna de las opciones se han cumplido. Para este caso se utiliza la sentencia default. Ejemplo: switch ($i) { case 0: 35 Universidad de Mendoza Teleinformática I – Estructuras de control print "i es igual a 0"; break; case 1: print "i es igual a 1"; break; default: print "i es distinto de 0 y de 1"; break; } 36 Universidad de Mendoza Teleinformática I – Tipos de datos no primitivos Tipos de datos no primitivos Arreglos (arrays) Un arreglo es un conjunto ordenado de elementos del mismo tipo. Los arreglos pueden ser de una dimensión o de múltiples dimensiones. En PHP se pueden referenciar los arreglos como tablas de comparaciones (arreglo asociativo) – también llamadas hash tables– o como vectores, esto no significa que existan dos tipos de arreglos sino que a los arreglos se los puede acceder de las dos formas. Arreglos de una dimensión Sintaxis $arreglo[clave]=valor; //en forma de vector Para poder leer o escribir un dato de un arreglo como vector la clave deberá ser un número entero. $arreglo[‘clave’]=valor; //en forma de arreglo asociativo Para poder leer o escribir un dato de un arreglo como arreglo asociativo la clave deberá ser un una palabra (string). Ejemplo: $arreglo[0]=1; $arreglo[1]=20; $arreglo[‘texto’]=300; Si el programador quisiera agregar datos en la última posición (en el caso del ejemplo $arreglo[2]) no debería preocuparse en averiguar cual fue el último elemento cargado previamente, existe una forma que consiste en lo siguiente: $arreglo[]=25; //equivale a $arreglo[2]=25; $arreglo[]=122; //equivale a $arreglo[3]=122; De esta forma se simplifica enormemente el código de la aplicación ya que no se tiene que hacer controles ni llevar variables extras para saber cuál será el último elemento. Existe una gran cantidad de sentencias que hacen que PHP sea un lenguaje muy poderoso en el manejo de arreglos, como por ejemplo: Funciones de ordenamiento asort(), arsort(), ksort(), rsort(), sort(), uasort(), usort(), y uksort() Funciones de conteo count(), sizeof() Funciones para recorrer arreglos next(), prev(), each() Funciones de para unir arreglos 37 Universidad de Mendoza Teleinformática I – Tipos de datos no primitivos array_merge(), array_merge_recursive() Función de mezclado shuffle() Arreglos multidimensionales Los arreglos de múltiples dimensiones son muy fáciles de definir, simplemente se agrega una clave por cada dimensión deseada. Ejemplo $arreglo[0]=1; $arreglo[1]=0; //arreglo de una dimensión $arreglo[0][0]=1; $arreglo[0][1]=2; //arreglo de dos dimensiones $arreglo[‘accion’][0]=2; $arreglo[‘accion’][1]=3; $arreglo[0][‘color’]=3; //arreglo de 2 dimensiones mezcla de arreglo asociativo y vectorial $arreglo[0][0][0]=1; //arreglo de 3 dimensiones Puede verse en los ejemplos que se pueden mezclar arreglos asociativos con arreglos vectoriales y ordenarlo de cualquier forma que deseemos. En la versión 3 de PHP no es posible referenciar un arreglo multidimensional, en forma directa dentro de los strings. Es evidente que en el siguiente ejemplo: $arreglo[‘color’][0]=”amarillo”; echo “El color seleccionado es $arreglo[‘color’][0]”; Esto no funcionará en la versión 3 de PHP, en su lugar deberíamos hacer lo siguiente: $arreglo[‘color’][0]=”amarillo”; echo “El color seleccionado es “.$arreglo[‘color’][0]”; //Se quita la expresión fuera del string y se concatena Esta limitación del intérprete de PHP en la versión 3 fue solucionada en la versión 4 haciendo lo siguiente: $arreglo[‘color’][0]=”amarillo”; echo “El color seleccionado es {$arreglo[‘color’][0]}”; Se pueden llenar los arreglos de distintas maneras, una muy ingeniosa es utilizar la sentencia array(). Ejemplo: $arreglo["color"] = "rojo"; $arreglo["gusto"] = "dulce"; $arreglo["forma"] = "redonda"; 38 Universidad de Mendoza Teleinformática I – Tipos de datos no primitivos $arreglo["nombre"] = "manzana"; $arreglo[3] = 4; el mismo arreglo puede llenarse utilizando array() de la siguiente forma: $arreglo = array( “color” => “rojo” , “gusto” => “dulce” , “forma” => “redonda” , “nombre” => “manzana” , 3 => 4); También se pueden llenar arreglos multidimensionales con la sentencia array() anidándolos. Ejemplo $arreglo = array( “manzana” => array( “color” => “rojo” , “gusto” => “dulce” , “forma” => “redonda” ) “naranja” => array( “color” => “anaranjado” , “gusto” => “acido” , “forma” => “redonda” ) ) al hacer echo arreglo[‘manzana’][‘gusto’]; El resultado será dulce. Clases y objetos Definición de clases class Fruta { var color; var gusto; var forma; function cargar_datos($c, $g, $f) {$this->color=$c; $this->gusto=$g; $this->forma=$f; } function mostrar_datos() {echo “Color: “.$this->color.”<br>”; echo “Gusto: “.$this->gusto.”<br>”; echo “forma: “.$this->forma.”<br>”; } 39 Universidad de Mendoza Teleinformática I – Tipos de datos no primitivos } $manzana= new Fruta; $manzana->cargar_datos(“rojo”, ”dulce”, ”redonda”); Para crear un objeto de la clase Fruta se debe utilizar la sentencia new. La sentencia new se utiliza para crear una variable nueva. Una clase puede heredar de otra clase o dicho de otra forma una clase puede extender a otra. Para hacerlo posible se utiliza el modificador extends. Al extender una clase la nueva clase hereda las propiedades y métodos de la clase padre, y a esta le podemos agregar nuevas propiedades y métodos. Constructores El constructor de una clase es un método que lleva el mismo nombre de la clase y se ejecuta automáticamente cuando se crea un nuevo objeto de la clase. class Fruta { var color; var gusto; var forma; function Fruta($c, $g, $f) {$this->color=$c; $this->gusto=$g; $this->forma=$f; } function cargar_datos($c, $g, $f) {$this->color=$c; $this->gusto=$g; $this->forma=$f; } function mostrar_datos() {echo “Color: “.$this->color.”<br>”; echo “Gusto: “.$this->gusto.”<br>”; echo “forma: “.$this->forma.”<br>”; } } $manzana= new Fruta; $manzana->cargar_datos(“rojo”, ”dulce”, ”redonda”); Creación de un objeto del tipo Fruta utilizando el constructor de la clase 40 Universidad de Mendoza Teleinformática I – Tipos de datos no primitivos $manzana= new Fruta (“rojo”, ”dulce”, ”redonda”); 41 Universidad de Mendoza Teleinformática I – Funciones de Filesystem Funciones de FileSystem Es un conjunto de funciones que permite la manipulación de archivos y directorios del servidor. A continuación se detalla la lista de funciones mas comunes. copy Copia un archivo int copy(string origen, string destino) Hace una copia del archivo origen al archivo destino (ambos pueden contener el path del archivo). Devuelve TRUE si la copia tiene éxito, y FALSE en otro caso. Ejemplo if (!copy($file, $file.'.bak')) { echo("Error al copiar el archivo $file...<br>\n"); } rename Renombra un archivo int rename(string archivo_viejo, string archivo_nuevo) Trata de renombrar archivo_viejo como archivo_nuevo. Devuelve TRUE en caso de éxito y FALSE en caso de fallo. dirname Devuelve la parte del path correspondiente al directorio string dirname(string path) Dada una cadena (string) conteniendo el path a un archivo, esta función devolverá el nombre del directorio. En Windows, tanto la barra (/) como la barra inversa (\) son usadas como separadores de caracteres. En otros entornos, debe usarse la barra directa (/). Ejemplo: $path = "c:\\windows\\win.ini"; $archivo = dirname($path); // $archivo toma el valor "c:\\windows" file_exists Verifica si un archivo existe int file_exists(string archivo_nombre) Devuelve TRUE si el archivo especificado por archivo_nombre existe; y FALSE en otro caso. unlink Borra un archivo int unlink(string archivo_nombre) Borra el archivo archivo_nombre. Es similar a la función unlink() del C Unix. Devuelve 0 o FALSE en caso de error. is_file Dice si el archivo nombrado es un archivo regular 42 Universidad de Mendoza Teleinformática I – Funciones de Filesystem bool is_file(string archivo_nombre) Devuelve TRUE si el archivo_nombre existe y es un archivo regular. Los resultados de esta función son cacheados. Ver clearstatecache() para más detalles. fopen Abre un archivo o una URL int fopen(string archivo_nombre, string modo [, int use_include_path]) Devuelve una referencia a un archivo abierto (file pointer o fp) para luego ser utilizado por las funciones de lectura y escritura. Si archivo_nombre comienza con "http://" (no es sensible a mayúsculas), se abre una conexión HTTP 1.0 hacia el servidor especificado y se devuelve un apuntador de archivo al comienzo del texto de respuesta. No maneja redirecciones HTTP, por eso se debe incluir una barra final cuando se trata de directorios. Si archivo_nombre comienza con "ftp://" (no es sensible a mayúsculas), se abre una conexión ftp hacia el servidor especificado y se devuelve un apuntador al archivo requerido. Si el servidor no soporta ftp en modo pasivo, esto fallará. Se pueden abrir archivo via ftp para leer o para escribir (pero no ambas cosas simultáneamente). Si archivo_nombre no comienza con nada de lo anterior, el archivo se abre del sistema de archivos, y se devuelve un apuntador al archivo abierto. Si el abrir el archivo falla, la función devuelve FALSE. modo puede ser cualquiera de lo siguiente: 'r' - Abre para sólo lectura; sitúa el apuntador del archivo al comienzo del mismo. 'r+' - Abre para lectura y escritura; sitúa el apuntador del archivo al comienzo del archivo. 'w' - Abre para sólo escritura; sitúa el apuntador del archivo al comienzo del archivo y trunca el archivo con longitud cero. Si el archivo no existe, trata de crearlo. 'w+' - Abre el archivo para lectura y escritura; sitúa el apuntador del archivo al comienzo del archivo y trunca el archivo con longitud cero. Si el archivo no existe, trata de crearlo. 'a' - Abre sólo para escribir (añadir); sitúa el apuntador del archivo al final del mismo. Si el archivo no existe, trata de crearlo. 'a+' - Abre para lectura y escritura (añadiendo); sitúa el apuntador del archivo al final del mismo. Si el archivo no existe, trata de crearlo. Además, modo puede contener la letra 'b'. Esto es útil para sistemas que diferencian entre archivos binarios y de texto (ej. es inútil en Unix). Si no se necesita, será ignorado. Puede usarse el tercer parámetro opcional y fijarlo a "1", si también se quiere buscar el archivo en el include_path. $fp = fopen("c:/windows/ file.txt", "r"); $fp = fopen("http://www.php.net/", "r"); $fp = fopen("ftp://user:password@ejemplo.com/", "w"); Si se experimentan problemas a la hora de leer y escribir a archivos y se esta usando la versión de PHP como módulo para el servidor, hay que recordar que debes asegurar que los archivos y directorios que estas usando son accesibles al proceso servidor. En la plataforma Windows, hay que tener de escribir correctamente las barras invertidas en el path del archivo (poniéndolas dobles), o usa barras directas. $fp = fopen("c:\\data\\info.txt", "r"); fread Lee archivos en modo binario string fread(int fp, int largo) 43 Universidad de Mendoza Teleinformática I – Funciones de Filesystem fread() lee hasta largo bytes del apuntador de archivo referenciado por fp. La lectura acaba cuando largo bytes se han leído o se alcanza EOF, lo que ocurra primero. fclose Cierra el apuntador a un archivo abierto int fclose(int fp) Se cierra el archivo apuntado por fp. Devuelve TRUE en caso de éxito y FALSE en caso de fallo. fgets Obtiene una línea del archivo apuntado string fgets(int fp, int largo) Devuelve una cadena de como mucho (largo- 1 bytes) leídos del archivo apuntado por fp. La lectura acaba cuando son leídos (largo - 1 bytes), cuando se llega a una nueva línea (el caracter de nueva línea se incluye en el valor devuelto), o cuando se llega a un EOF (lo que ocurra primero). Si ocurre un error, devuelve FALSE. Fallos Comunes: Los que hayan usado la semántica de 'C' de la función fgets deben darse cuenta de la diferencia que hay en como el EOF es devuelto por esta función. fgetc Obtiene un caracter del archivo apuntado string fgetc(int fp) Devuelve una cadena (string) conteniendo un simple caracter leído del archivo apuntado por fp. Devuelve FALSE para EOF (como hace feof()). feof Verifica si el apuntador a un archivo está al final del archivo (end-of-file) int feof(int fp) Devuelve TRUE si el apuntador del archivo está en EOF o si ocurre un error; en otro caso devuelve FALSE. fwrite Escribe archivos en formato binario int fwrite ( int fp, string cadena [, int largo]) fwrite() escribe el contenido de cadena al archivo apuntado por fp. Si se da el argumento largo, la escritura acaba antes de que largo bytes sean escritos o se alcance el final de cadena, lo que ocurra primero. fputs Escribe en el archivo apuntado int fputs(int fp, string str [, int length]) fputs() es un alias de fwrite(), y es idéntico a él en todo. Notar que el parámetro largo es opcional y si no se pone la cadena entera será escrita. file lee un archivo completo hacia un array 44 Universidad de Mendoza Teleinformática I – Funciones de Filesystem array file(string archivo_nombre [, int use_include_path]) Idéntica a readfile(), excepto que file() devuelve el archivo en un array. Cada elemento del array corresponde a una línea del archivo, con el caracter de nueva línea incluido. Se puede utilizar el segundo parámetro opcional y ponerle el valor "1", si también se quiere buscar el archivo en el include_path. 45 Universidad de Mendoza Teleinformática I – Acceso a base de datos MySQL Acceso a bases de datos MySQL Nociones básicas de bases de datos MySQL MySQL es un gestor de bases de datos SQL (Structured Query Language). Es una implementación Cliente-Servidor que consta de un servidor y diferentes clientes (programas/librerías). En el mundo GNU, una de las bases de datos que se reseña en cualquier referencia de aplicaciones de éste tipo bajo LINUX, es MySQL aunque no está incluida en ninguna distribución ya que no tiene licencia GNU como tal, para comercializarla a ella o a cualquier software que la utilice o se sirva de ésta habrá que adquirir una licencia. Esta base de datos es considerada (en su propia documentación así lo reseña) como la más rápida y robusta tanto para volúmenes de datos grandes como pequeños (siempre, claro está, comparada con las de su categoría), aunque como veremos más adelante está rapidez es a costa de no implementar ciertos aspectos del SQL. Principales Características · El principal objetivo de MySQL es velocidad y robustez. · Escrito en C y C++, testado con GCC 2.7.2.1. Usa GNU autoconf para potabilidad. · Clientes C, C++, JAVA, Perl, PHP, TCL. · Multiproceso, es decir puede usar varias CPU si éstas están disponibles. · Puede trabajar en distintas plataformas y S.O. distintos. · Sistema de contraseñas y privilegios muy flexible y segura. · Todas la palabras de paso viajan encriptadas en la red. · Registros de longitud fija y variable. · 16 índices por tabla, cada índice puede estar compuesto de 1 a 15 columnas o partes de ellas con una longitud máxima de 127 bytes. · Todas las columnas pueden tener valores por defecto. · Utilidad (Isamchk) para chequear, optimizar y reparar tablas. · Todos los datos están grabados en formato ISO8859_1. · Los clientes usan TCP o UNIX Socket para conectarse al servidor. · El servidor soporta mensajes de error en distintas lenguas. · Todos los comandos tienen -help o -? Para las ayudas. · Diversos tipos de columnas como enteros de 1, 2, 3, 4, y 8 bytes, coma flotante, doble precisión, carácter, fechas, enumerados, etc. 46 Universidad de Mendoza Teleinformática I – Acceso a base de datos MySQL · ODBC para Windows 95 (con fuentes), se puede utilizar ACCESS para conectar con el servidor. SQL y MySQL Como indicamos en la introducción, este servidor de bases de datos está considerada como las más rápida entres las de sus misma categoría tanto para volúmenes de datos grandes como pequeños, pero como también indicamos al principio es a base de no implementar ciertos aspectos de las especificación SQL éstos aspectos, que a mi entender, son importantes son por una lado los Triggers y por otro lado la Lógica Transaccional. Los triggers no es nada más que una porción de código almacenado que se "dispara" o se ejecuta cuando se realiza una operación ( actualización, borrado, etc.) con la base de datos. Naturalmente comprobar la propia existencia de disparador y ejecutarlo si existe consume recursos y tiempo y es como su propio manual indica, la única razón por la que los triggers no están soportados. Un aspecto muy importante en cualquier base de datos relacional es la consistencia de las diferentes tablas que la componen, para conseguir esto de una forma más o menos fácil es utilizando la "Lógica Transaccional" , será el propio gestor de base de datos el que proporcione mecanismos de bloqueo de ficheros y consolidación o retroceso en la operaciones con las tablas. Pues bien Mysql no soporta las transacciones en aras simplemente de la velocidad (o por lo menos así lo indican en sus comentarios) , sólo nos podemos ayudar con los comandos LOCK tables /UNLOCK tables que permiten bloquear tablas impidiendo que otros usuarios puedan acceder a ellas pero sin la posibilidad de deshacer las operaciones realizadas con los datos. Pasos para realizar una consulta 1- Establecer conexión 2- Ejecutar query (consulta) 3- Leer resultado 4- Cerrar conexión Establecer conexiones mysql_connect int mysql_connect ([string hostname [:puerto] [:/camino/al/socket] [, string usuario [, string password]]]) Devuelve: Un identificador de enlace positivo si tiene éxito, o falso si error. mysql_connect() establece una conexión a un servidor MySQL. Todos los argumentos son opcionales, y si no hay , se asumen los valores por defecto ('localhost', usuario propietario del proceso del servidor, password vacía). El hostname puede incluir tambien un número de puerto . ej. "hostname:puerto" o un camino al socket ej. ":/camino/al/socket" para localhost. El enlace al servidor se cerrará tan pronto como la ejecución del script finalice, a menos que se cierre antes explícitamente llamando a mysql_close(). Ejemplo: <? $host = "10.3.3.6"; $usuario = "root"; $passw = ""; $conexion = mysql_connect($host, $usuario, $passw); ?> mysql_pconnect 47 Universidad de Mendoza Teleinformática I – Acceso a base de datos MySQL mysql_pconnect() actúa como mysql_connect() con dos diferencias fundamentales. Primero, durante la conexión, la función intenta encontrar un enlace persistente abierto con el mismo host, usuario y password. Si lo encuentra, devuelve el identificador de enlace en lugar de abrir otra conexión. Segundo, la conexión no se cerrará cuando acabe la ejecución del script. El enlace permanecerá abierta para ser usado en el futuro (mysql_close() no cerrará el enlace establecido con mysql_pconnect()). Ejemplo: <? $host = "10.3.3.6"; $usuario = "root"; $passw = ""; $conexion = mysql_pconnect($host, $usuario, $passw); ?> Ejecutar consultas mysql_db_query Envia una sentencia MySQL al servidor int mysql_db_query (string base_de_datos, string sentencia [, int identificador_de_enlace]) Devuelve: Un identificador de resultado positivo o falso si ocurre un error. mysql_db_query() selecciona una base y ejecuta una sentencia en ella. Si el identificador de enlace no ha sido especificado, la función intenta encontrar un enlace abierto al servidor MySQL y si no lo encuentra, intentará crear uno como si fuera llamado mysql_connect() sin argumentos. Ejemplo: <? $sql_query = "select * from personas"; $baseDeDatos = "personal"; $consulta = mysql_db_query($baseDeDatos, $sql_query, $conexion); ?> mysql_query Envía una sentencia SQL a MySQL int mysql_query (string sentencia [, int identificador_de_enlace]) mysql_query() envía una sentencia a la base activa en el servidor asociado al identificador de enlace. Si no es especificado un identificador_de_enlace, se asumirá el ultimo enlace abierto. Si no hay ningún enlace abierto, la función intenta establecer un enlace como si se llamara función mysql_connect() sin argumentos, y lo utiliza. La sentencia no puede terminar por punto y coma. mysql_query() devuelve TRUE (no-cero) o FALSE para indicar si la sentencia se ha ejecutado correctamente o no. Un valor TRUE significa que la sentencia era correcta y pudo ser ejecutada en el servidor. No indica nada sobre el numero de fila devueltas. Es perfectamente posible que la sentencia se ejecute correctamente pero que no devuelve ninguna fila. Ejemplo: <? 48 Universidad de Mendoza Teleinformática I – Acceso a base de datos MySQL $baseDeDatos = "personal"; $sql_query = "select * from personas"; mysql_select_db($baseDeDatos); $consulta = mysql_query($sql_query, $conexion); ?> Mostrar consultas mysql_fetch_row Devuelve una fila de resultado como matriz array mysql_fetch_row (int id_resultado) Devuelve: Una matriz que corresponde a la fila seleccionada, o falso si no quedan más líneas. mysql_fetch_row() selecciona una fila de datos del resultado asociado al identificador de resultado especificado. La fila es devuelta como una matriz. Cada columna del resultado es guardada en un offset de la matriz, empezando por el offset 0. La llamada a mysql_fetch_row() debería devolver la próxima fila del resultado, o falso si no quedan más filas. Ejemplo: <? ... while ($row=mysql_fetch_row($consulta)) {echo "Campo 1: ".$row[0]; echo "Campo 2: ".$row[1]; } ... ?> mysql_fetch_array Extrae la fila de resultado como una matriz asociativa array mysql_fetch_array (int id_resultado [, int tipo_de_resultado]) Devuelve una matriz que corresponde a la sentencia extraída, o falso si no quedan más filas. mysql_fetch_array() es una versión extendida de mysql_fetch_row(). Además de guardar los datos en el índice numérico de la matriz, guarda también los datos en los índices asociativos, usando el nombre de campo como clave. Si dos o más columnas del resultado tienen el mismo nombre de campo, la última columna toma la prioridad. Para acceder a la(s) otra(s) columna(s) con el mismo nombre, se debe especificar el índice numérico o definir un alias para la columna. Ejemplo <? En este ejemplo se supone que la tabla "personas" tiene por lo menos dos campo de los cuales uno se llama "nombre" y otro "apellido" ... while ($row=mysql_fetch_array($consulta)) {echo "Nombre: ".$row['nombre']; echo "Apellido: ".$row['apellido']; } ... ?> Funciones más comunes de MySQL mysql_select_db 49 Universidad de Mendoza Teleinformática I – Acceso a base de datos MySQL Selecciona un base de datos MySQL int mysql_select_db (string base_de_datos [, int identificador_de_enlace]) Devuelve : true si se ejecutó con éxito, false si dio error. mysql_select_db() establece la base activa que estará asociada con el identificador de enlace especificado. Si no se especifica un identificador de enlace, se asume el ultimo enlace abierto. Si no hay ningun enlace abierto, la función intentara establecer un enlace como si se llamara a mysql_connect(). Toda llamada posterior a mysql_query() utilizará la base activa. Ejemplo: <? $baseDeDatos = "personal"; mysql_select_db($baseDeDatos); ?> mysql_fetch_field Extrae la información de una columna y la devuelve como un objeto. object mysql_fetch_field (int id_resultado [, int salto]) Devuelve un objeto que contiene la información del campo. Puede usarse mysql_fetch_field() para obtener información sobre campos en un resultado. Si no se especifica el salto, se extrae el siguiente campo que todavía no ha sido extraído. con mysql_fetch_field(). Las propiedades del objeto son: name - nombre de la columna table - name de la tabla a la que pertenece la columna max_length - longitud máxima de la columna not_null - 1 si la columna no puede contener un valor nulo primary_key - 1 si la columna es clave primaria unique_key - 1 si la columna es clave única multiple_key - 1 si la columna es clave no única numeric - 1 si la columna es numérica blob - 1 si la columna es un BLOB type - el tipo de la columna unsigned - 1 si la columna es unsigned zerofill - 1 si la columna es zero-filled mysql_num_fields Devuelve el numero de campos de un resultado int mysql_num_fields(int id_resultado) Por razones de compatibilidad puede usarse también mysql_numfields(). mysql_num_rows Devuelve el numero de filas de un resultado 50 Universidad de Mendoza Teleinformática I – Acceso a base de datos MySQL int mysql_num_rows(int id_resultado) Por razones de compatibilidad puede usarse también mysql_numrows(). 51 Universidad de Mendoza Teleinformática I – Acceso a base de datos MySQL Como guardar y recuperar una imagen desde una base de datos Para poder guardar y recuperar imágenes en una base de datos, debemos tener preparada una tabla para almacenar las imágenes. La tabla debe contener un campo del tipo texto largo, o BLOB (que nos va a dar espacio suficiente como para guardar imágenes grandes). Pasos para almacenar una imagen: Página que pide los datos Dentro de esa página debemos agregar un control del tipo archivo, que será el que nos permitirá seleccionar el archivo para enviarlo. Además debemos cambiarle la forma de envío de datos al formulario que contiene el control de archivo. La forma de hacerlo es agregar como atributo del tag <form> lo siguiente: ENCTYPE="multipart/form-data" Quedando el tag <form> de la siguiente forma: <FORM METHOD=POST ENCTYPE="multipart/form-data" ACTION="imagen_agregar.php"> Generalmente se trabaja sin este atributo, pero en este caso debemos hacerlo ya que si no especificamos, no lograremos nuestro objetivo. Al no colocar el atributo el comportamiento será el siguiente: al enviar los datos del formulario pasará de una página a otra la dirección del archivo en la máquina cliente; si quisiéramos por ejemplo enviar el archivo imagen.jpeg ubicada en el directorio raíz del disco C de nuestra máquina pasará el path del archivo (pasará c:\imagen.jpeg). En cambio si agregamos el atributo el navegador enviará el archivo al servidor, el servidor lo almacena en un lugar temporal (que está configurado en Apache) y el valor que tendremos en la variable será el path del archivo dentro del servidor, por ejemplo podría ser algo así c:\temp\temp0034.tmp Página que recibe los datos. En esta página tenemos el dato de cual fue el archivo que se le envió, para poder acceder a los datos que contiene el archivo debemos abrirlo y leerlo con fopen() y fread(). Los datos que leemos del archivo puede ser de formato texto o binario, en el caso de ser binario es recomendable que se los trasforme o codifique por que no todas las bases de datos soportan grabar datos binarios directamente en sus campos (como por ejemplo en la base de datos Access). PHP nos brinda dos funciones para codificar la información en base64, tales funciones son base64_encode() y base64_decode(). Ejemplo: <? $dsn="php"; $user=""; $password=""; $conexion=odbc_connect($dsn,$user,$password); $arch=fopen($archivo,'rb'); $lectura=fread($arch,2000000); $imagen64=base64_encode($lectura); $query="insert into imagen (imagen) values ('".$imagen64."')"; $lectura=odbc_exec($conexion,$query); odbc_close($conexion); ?> En el ejemplo podemos ver tres etapas bien diferenciadas, la primera abre la conexión a la base de datos (en nuestro caso una base de datos ODBC), la segunda parte lee el archivo temporal y codificamos su contenido para pasar a la tercera parte donde armamos el query y lo almacenamos en el 52 Universidad de Mendoza Teleinformática I – Acceso a base de datos MySQL campo imagen la tabla imagen. Pasos para recuperar una imagen: En este caso debemos contar con dos scripts: Script que pide la imagen Este script será el encargado de seleccionar la imagen que queremos mostrar y hará el llamado al segundo script, que es el que se encarga de mostrar los datos. El llamado a la imagen se hará de la misma forma con la trabajamos las imágenes a lo largo de este capítulo. <img src="imagen.php"> Podemos pasar los datos de dos formas: la primera es pasar como parámetro el registro de la tabla que contiene la imagen al script que muestra los datos, una vez dentro del script buscamos los datos en la base y después los mostramos por pantalla. La segunda consiste en pasar como parámetro el campo que contiene los datos y luego simplemente mostrarlos. La segunda forma puede causar que Netscape no muestre los datos y en Internet Explorer si, por lo tanto es recomendable leer y mostrar los datos dentro del segundo script. La diferencia entre este script y el script que veíamos con los gráficos dinámicos es que en gráficos dinámicos hacemos los llamados a funciones gráficas y en la imagen recuperadas desde base de datos solamente mostramos el contenido del archivo. Script que muestra los datos Este script puede recibir como parámetro un Id de registro o los datos a mostrar. Para ambos casos lo que tenemos que tener en cuenta es que la primer salida por pantalla que se haga debe ser el siguiente comando: Header("Content-type: Image/jpeg"); Después de hacer esta salida podemos sacar por pantalla los datos de la imagen (si fueron enviados como parámetro) o leer los datos desde la base y luego enviar por pantalla los datos leídos. Hay que aclarar que se pueden ejecutar líneas de código anteriores a la línea de header(), pero siempre y cuando no saquen cosas por pantalla y que de esa forma cambien el tipo mime del archivo. Hay que recordar que comentábamos mas temprano que había que codificar el contenido del archivo para evitar posibles inconvenientes, pues bien antes de sacar por pantalla los datos debemos decodificarlos utilizando la función base64_decode(). Ejemplo: <? $dsn="php"; $user=""; $password=""; $conexion=odbc_connect($dsn,$user,$password); $query="select imagen from imagen where Id=$datos"; $lectura=odbc_exec($conexion,$query); odbc_fetch_into($lectura,&$row); Header("Content-type: Image/jpeg"); echo base64_decode($row[0]); ?> En este ejemplo podemos ver que en la variable $datos recibo el Id del registro de la tabla imagen, lo leo y luego envío por pantalla a través de la función echo (previamente decodificado). El ejemplo los hago sobre una base de datos ODBC. 53 Universidad de Mendoza Teleinformática I – Acceso a base de datos MySQL Finalmente podemos comentar que el documento hace referencia en algunos puntos al formato JPEG, pero en realidad se puede hacer perfectamente con otros formatos gráficos, incluso se pueden guardar archivos de texto o binarios de cualquier formato, indudablemente que el tipo de tratamiento que le hagamos al archivo dependerá del formato. 54 Universidad de Mendoza Teleinformática I – Sesiones Sesiones Una sesión en PHP permite mantener información dentro de un sitio sin necesidad de tener que moverla forzadamente de una página a otra. Esto nos permite diseñar sitios con menos código fuente, de una forma más ordenada, además permite configurar ciertos aspectos del sitio tales como apariencia, funcionalidades, etc. que de otra forma sería muy complicado. El manejo de sesiones en PHP fue agregado en la versión 4 de PHP, y es similar al que se hacía con las PHPLIB en la versión 3. Una sesión se crea cuando ingresamos al sitio y finaliza cuando se especifique explícitamente, cuando se abandona el sitio, o cuando cerramos el navegador. Mientras la sesión esté activa podremos visitar una y otra vez las páginas y las variables de sesión mantendrán sus valores. A cada usuario que ingresa a nuestro sitio se le asigna un número de sesión único. Existen dos formas de propagar las variables de sesión con PHP, la primera es a través de cookies, la segunda es embeber las variables en la URL. El primer método es más efectivo y transparente, pero el hecho de trasladarse como cookie genera desconfianza en un sector de usuarios que no están dispuestos a aceptar cookies en sus navegadores. Existen dos parámetros de configuración de PHP que me harán determinar como se propagan las variables de sesión. Estos parámetros son track_vars y register_globals. Si se activó el parámetro track_vars y desactivó el parámetro register_globals se podrá escribir y leer datos en el arreglo asociativo $HTTP_SESSION_VARS. Ejemplo: <? session_register(“dato”); $HTTP_SESSION_VARS[‘dato’]++; ?> Si el parámetro register_globals está habilitado y track_vars desabilitado entonces las variables se podrán acceder directamente como lo hacemos con variables comunes. Ejemplo: <? session_register(“dato”); $dato++; ?> En el caso que estén los dos parámetros se hayan activado entonces se podrá acceder indistintamente de una forma u otra. Funciones session_start Inicia una nueva sesión, o continua una sesión basada en el número de sesión que fue pasado como parámetro desde una página anterior. 55 Universidad de Mendoza Teleinformática I – Sesiones bool session_start () Esta función devuelve siempre verdadero. Hay que tener cuidado cuando se ejecuta esta función ya que hay que hacerlo antes de enviar algún dato al navegador (incluso antes de enviar el tag <HTML>). Por lo general se recomienda ejecutar la función en primer lugar. Ejemplo <?session_start();?> <HTML> <BODY> … session_destroy Destruye todos los datos asociados a una sesión. bool session_destroy () session_name Recupera o asigna el nombre a una sesión. string session_name ([string nombre]) Si quisiéramos recuperar cuál es el nombre de la sesión actual entonces debemos llamar a la función session_name sin pasarle parámetros. En caso de querer asignar un nuevo nombre de sesión a la sesión actual debemos especificarlo como parámetro de la función. El nombre de sesión referencia al id de sesión que viaja como cookie o como parte de la URL. Debe contener solamente caracteres alfanuméricos. Ejemplo: <? $viejoNombre=session_name(“sesionprueba”); echo $viejoNombre; ?> En este ejemplo se almacena en la variable $viejoNombre el nombre original de la sesión y a continuación le asigna un nuevo nombre. session_save_path Recupera o asigna el directorio de trabajo de la sesión. string session_save_path ([string ruta]) Los datos de sesión se almacenan en el servidor en un directorio predeterminado, de esta forma podemos asignarle a cada sesión o grupo de sesiones un directorio de trabajo en particular. Si quisiéramos recuperar cuál es el directorio de trabajo de la sesión actual entonces debemos llamar a la función session_save_path sin pasarle parámetros. En caso de querer asignar un nuevo directorio de trabajo a la sesión actual debemos especificarlo como parámetro de la función. session_id Recupera o asigna el id de la sesión. string session_id ([string id]) 56 Universidad de Mendoza Teleinformática I – Sesiones Si quisiéramos recuperar cuál es el id de la sesión actual entonces debemos llamar a la función session_id sin pasarle parámetros. En caso de querer asignar un nuevo id a la sesión actual entonces debemos especificarlo como parámetro de la función. session_register Registra una o más variables en la sesión actual. bool session_register (mixed name [, mixed ...]) El parámetro que recibe es un string conteniendo el nombre de la variable, o puede ser un arreglo, si el parámetro es un arreglo registrara los nombres de cada un de los elementos del arreglo. session_unregister Elimina una variable de la sesión (deja de estar registrada). bool session_unregister (string name) Esta función retorna verdadero si se ejecuta bien la función session_unset Elimina todas las variables de sesión que fueron previamente registradas. void session_unset () session_is_registered Verifica si hay una variable de sesión registrada. bool session_is_registered (string nombre) Esta función permite averiguar si ya hay una variable nombre registrada en la sesión. Devolverá verdadero si ya fue registrada y falso si no esta registrada. 57 Universidad de Mendoza Teleinformática I – Indice 58