Mini biografía

Alfredo Limongi trabaja actualmente como desarrollador para ForenSys Caribbean (anteriormente Vision Interconnect). Líder mundial en software para el mercado de recopilación forense para compañías de seguros.

Su trayectoria incluye más de veinticinco años de programación de los cuales al menos diez han estado dedicados a la programación en PHP.

Paralelamente a su actividad profesional, ha dictado diferentes cursos de programación Web para no iniciados, producto de los cuales ha recopilado y preparado una serie de libros didácticos sobre programación de los cuales forma parte el presente material.

Cursó sus estudios de computación en la prestigiosa Universidad Central de Venezuela, en Caracas.

Introducción general

El mundo que vivimos en la actualidad no se parece al que existía hace diez o quince años. Repentinamente nos hemos encontrado con que todos estamos interconectados. Cada día es más difícil imaginar el que una persona pueda ejercer su profesión –cualquiera que ella sea- sin que utilice un computador personal o algún otro tipo de dispositivo para realizar u organizar sus tareas.

Adicionalmente, las redes sociales han venido a reinventar el modo en que nos relacionamos con los demás. Las noticias dan la vuelta al mundo en minutos sin necesidad de reporteros ni medios de comunicación tradicionales.

Este nuevo mundo que se está desarrollando, necesita renovar completamente su base tecnológica a una velocidad desconocida hasta ahora. Las nuevas tecnologías aparecen y desaparecen a una gran velocidad. Hay un mundo pidiendo programas allá afuera. Está hambriento. Es una gran oportunidad para todos los que se preparen para alimentarlo.

El mundo Web ha pasado de ser un ambiente donde las grandes empresas se mostraban a uno donde todos mostramos y todos consumimos. Ya el mercado de los programadores en general, y el de los programadores Web en particular, no es solo un conjunto determinado de empresas poderosas. El mercado está en todas partes, y las necesidades son de todos los tamaños.

Aprender a hacer páginas Web en el mundo de hoy es colocarse en el centro del molino por donde está pasando toda la producción de estos tiempos.

Por otra parte, al contrario de lo que muchos pudieran pensar, no se requiere ser un genio para poder programar. Ese mito lo hemos creado nosotros mismos con la idea de mantener nuestro club tan pequeño como sea posible y así poder disfrutar en exclusiva de este vasto mercado.

La programación de hoy en día, y en particular la programación Web, requiere de más perseverancia que sabiduría, de más sentido común que conceptos avanzados, de más ganas que de talento.

Este libro pretende ser la puerta para que muchos de ustedes entren en el fascinante mundo de la programación. Un mundo lleno de oportunidades y de buenas recompensas, donde no solo el mejor se queda con la presa. Hay bastantes presas para todos, y están allá afuera esperando por gente como nosotros.

¿Cómo usar este libro?

Este libro está dividido en once capítulos que de manera progresiva van adentrando al lector menos experimentado en el mundo de la programación.

Al principio de cada capítulo se muestra un pequeño resumen de los temas que se van a abordar a lo largo del mismo. Adicionalmente, para facilitar la lectura de aquellos con experiencia previa en otros lenguajes, hemos decidido incluir notas que ayudan a éstos a saber cuándo una sección pudiera ser saltada sin perder información relevante.

El primer capítulo comienza con una breve explicación de lo que es el lenguaje PHP, e inmediatamente pasa a explicar uno por uno los conceptos que pudieran ser necesarios para abordar los siguientes capítulos.

El segundo capítulo está dedicado por completo al lenguaje HTML. Aquellos lectores que posean conocimiento previo de este lenguaje, bien podrían avanzar directamente al  capítulo siguiente sin perder la secuencia de la narración del libro.

A partir del tercer capítulo comienza en sí el trabajo en PHP. La secuencia ha sido trabajada cuidadosamente para permitir a los no versados en la programación obtener el máximo provecho.

Hemos incluido una buena cantidad de ejemplos cortos a lo largo del libro con la idea de que el lector pueda comprender lo que se explica sin necesidad de adentrarse a revisar decenas de líneas de programación para ello. El énfasis del texto lo hemos puesto en la pedagogía de lo que ofrece el lenguaje y como utilizarlo. Los ejemplos están colocados cuidadosamente al servicio de ese objetivo.

Nomenclatura utilizada

A lo largo del libro vas a encontrar dos tipos de íconos que pretenden resaltar los conceptos importantes así como las recomendaciones que consideramos pudieran ser de interés.

Siempre que veas este símbolo en la margen izquierda del texto es porque en ese punto se está abordando un concepto. La idea es que el lector preste su máxima atención en estos puntos.

Cuando ves este otro símbolo del lado izquierdo, es porque queremos hacer alguna recomendación, alguna sugerencia, o quizás queremos advertirte de la relevancia de un tema en particular.

Introducción

En este capítulo te presentamos una definición, y algunas de las características y ventajas competitivas de PHP respecto a otras opciones similares. Además te mostramos algunos conceptos básicos relacionados a la arquitectura de Internet, una breve explicación de lo que es una página Web y los lenguajes usados para realizar las mismas.

Al finalizar este capítulo podrás manejar la terminología básica que habrá de ser usada a lo largo del libro.

Si ya tienes un conocimiento básico del mundo de Internet y sabes lo que es un Servidor y lo que es un lenguaje Servidor, entonces podrías pasar directamente al segundo capítulo.

Temas desarrollados en este capítulo:

¿Qué es una página Web?

¿Qué lenguajes se usan para escribir una página Web?

¿Qué es un lenguaje Web del lado del servidor?

¿Qué es PHP?

¿Por qué usar PHP?

¿Cómo viaja una página Web hasta nuestro computador?

¿Qué es un servidor DNS?

¿Qué es una dirección IP?

¿Qué es un Servidor Web?

¿Qué es un Servidor http?

¿Cuáles son las partes de una dirección Web o URL?

¿Qué es PHP?

Aunque en los últimos años se ha hecho un verdadero esfuerzo para hacer de él un lenguaje multipropósito, puede decirse que PHP es fundamentalmente un lenguaje de programación Web del lado del servidor, es decir, uno que permite escribir o alterar páginas de Internet cuando estas no han abandonado aún el equipo desde el que son despachadas. Veamos cómo es eso.

Una página Web es fundamentalmente una serie de comandos escritos en un lenguaje llamado HTML, acompañados de archivos multimedia (fotografías, videos, audio, etc.) que puede ser desplegada a través de un programa navegador (o browser). Además, la misma página puede o no contener comandos escritos en otros lenguajes más específicos como JavaScript, VBScript o CSS, los cuales se encargan de alterar el estilo y el comportamiento general de la página.

Al escribir una página Web en HTML, estamos de algún modo organizando una serie de contenidos para que sean vistos de una cierta manera. Esos contenidos, que pueden ser fotos, textos, enlaces, entre otros, habrán de ser mostrados de la misma manera a todo el que cargue en su navegador nuestra página. Siempre el mismo contenido y siempre de una misma manera.

Si queremos hacer que la página muestre contenidos distintos, y no queremos reescribirla cada vez, podríamos hacer que los comandos HTML o los archivos de la página se modifiquen antes de salir del servidor donde tenemos alojada. Para eso debemos usar uno de estos lenguajes Web de los que se ejecutan en el servidor.

En pocas palabras, PHP es un lenguaje de programación de uso general, con énfasis en el desarrollo de páginas Web, que funciona en un servidor Web, y que puede ayudarnos a generar o modificar páginas HTML.

¿Por qué usar PHP?

Ya sabemos lo que es una página Web (seguramente ya lo sabías), y sabemos lo que es un lenguaje que funciona del lado del servidor, ahora bien, debes saber que PHP no es la única opción disponible para manipular contenidos. Existen otras opciones, y quizás hayas oído hablar de alguna de ellas:

ASP.NET es la propuesta de Microsoft. Está basado en sintaxis tipo Basic, funciona solo sobre ambientes Windows y es igual de poderoso que PHP.

Pearl es una de las primeras opciones que aparecieron en el mercado para este fin. Es un poco más complicado de aprender y su uso esta menos extendido.

Python es un lenguaje orientado a objetos multipropósito. Su uso está muy poco extendido.

Java Servlets y JSP son las propuestas JAVA. Su sintaxis es similar a la de PHP, aunque más compleja y poderosa. Su uso esta menos extendido que PHP y ASP.

PHP no le pertenece a ninguna compañía en particular, es un producto de código abierto (Open Source) lo que quiere decir que cientos de personas alrededor del mundo colaboran para garantizar su estabilidad y para adaptarlo rápidamente a los cambios tecnológicos.

Otra de sus características es que funciona tanto en ambientes Windows, Linux o Mac, lo que te garantiza poder cambiar el Sistema operativo del equipo donde este alojada tu sitio Web si fuese necesario.

PHP es a la vez simple y poderoso. Su sintaxis basada en lenguaje C le proporciona una gran flexibilidad. Además te permite programar usando una sintaxis básica o hacer complejos sistemas basados en objetos.

Si has trabajado antes con el lenguaje C, o algún lenguaje basado en esta sintaxis, vas a aprender más fácilmente. Si no lo has hecho aún, no te asustes. Verás como luego de leer unas pocas páginas, estarás hablando un C básico. Hacerlo fluidamente va a depender de ti. Al igual que con cualquier idioma.

¿Cómo funciona una página Web?

Una página Web no es muy distinta a un documento escrito en Word o un PDF. En el fondo, es una serie de instrucciones y contenidos armados para que un tipo de programa específico pueda leerlo y mostrarlo adecuadamente. En el caso de un documento del tipo DOC, el programa que lo lee es Microsoft Word (entre otros), si hablamos de un PDF, lo abrimos usando Acrobat Reader, pero en el caso de una página Web, usamos un navegador como Firefox, Internet Explorer, Opera, Chrome, Safari entre otros.

La página Web puede estar guardada en un CD o en el disco duro de tu propio computador, o más comúnmente, llega hasta nosotros a través de Internet luego de escribir en el navegador una cierta dirección.

¿Cómo funciona el direccionamiento de páginas en Internet?

La manera como Internet se las arregla para servirle a millones de personas, millones de páginas simultáneamente es fascinante. No es algo que tengas que saber para poder publicar tus propios contenidos, pero te lo podemos explicar fácilmente.

Internet está compuesto por millones de computadores distribuidos alrededor del mundo interconectados a través de los protocolos TCP/IP. En pocas palabras puede decirse que TCP/IP permite comunicar dos dispositivos a través del envío de paquetes de información sin importar el tipo de sistema operativo de las partes.

Ahora bien, el direccionamiento de los dispositivos a través de TCP/IP se hace a través de una serie de números, las famosas direcciones IP, que son cuatro grupos cifras entre 0 y 255 (llamadas octetos) separadas por puntos. Ese mecanismo funciona a través de la red muy eficientemente, es decir, permite localizar muy velozmente un equipo sin importar en que parte del planeta esté, pero es terriblemente engorroso para que un usuario se valga de él para acceder a contenidos. Solo tendríamos que imaginarnos lo que fuese navegar por Internet si en vez de escribir www.google.com o www.yahoo.es en nuestros navegadores, nos viéramos forzados a escribir 74.125.299.48 o 77.238.178.122.

Para ello existen una serie de servidores distribuidos en todo el planeta que hacen las veces de diccionarios de direcciones. Son los llamados servidores DNS. Ellos se encargan de traducir una dirección solicitada por un usuario en una dirección IP.

Para que el sistema de direccionamiento DNS funcione, se requiere que todos los dominios registrados tengan una dirección IP fija en la cual ubicarlos. Sin embargo, los usuarios de Internet, es decir los clientes, no necesitan ser ubicados, así que sus direcciones IP bien podrían cambiar constantemente lo que se conoce como IPs dinámicas.

¿Qué es un Servidor de Internet?

La comunicación dentro de Internet está basada en lo que llamamos Cliente/Servidor, es decir, siempre que accedemos a una página o a un servicio, nos comportamos como clientes en una ventanilla de atención al público. Nosotros pedimos contenidos y de la ventanilla obtenemos respuestas. Eso sí, hay que aclarar que en Internet frecuentemente somos mejor tratados que en ciertas ventanillas, pero eso está fuera del tema de este texto.

Cuando hacemos referencia a un servidor Web, nos referimos a un computador, el cual puede despachar ciertas páginas Web utilizando para ello un programa especial que atienda los requerimientos.

Un programa servidor http, es un programa que recibe las solicitudes que han sido dirigidas hacia el computador donde está instalado y es capaz de devolver lo solicitado en formato de hipertexto.

De estos programas servidores existen diversas opciones, sin embargo, la inmensa mayoría del mercado está copada por dos de ellos: Apache y IIS.

IIS es el programa servidor desarrollado por la gente de Microsoft. Funciona, como debes imaginar, sobre el Sistema Operativo Windows y es fácil de administrar.

Apache por su parte es de código abierto como lo es PHP. Eso quiere decir que es gratis y que cientos de personas se encargan de garantizar su estabilidad y promover nuevas versiones. Además, Apache está disponible para diversos sistemas operativos.

Si deseas programar en PHP, te recomiendo ampliamente que uses Apache.

¿Qué es un URL?

Cuando escribimos una dirección en un navegador, por ejemplo para abrir el portal de KLM (la aerolínea holandesa), escribimos algo como lo siguiente: http://www.klm.com. Luego de pasar de una página a otra dentro de ese sitio, podemos ver que la dirección ha cambiado a algo como http://www.klm.com/travel/us_en/index.htm. A ese tipo de direcciones de Internet se les conoce genéricamente como URL. Veamos que quiere decir una dirección como esa:

http es el protocolo de hipertexto. Esto quiere decir que lo que estamos buscando es una página Web y no un email u otra cosa. Esta parte de la dirección es opcional.

www.klm.com se refiere a un nombre de dominio. Es decir, un nombre reservado por una compañía (en este caso la línea aérea KLM).

Travel y us_en son subdominios. Internamente son carpetas dentro del sitio donde están guardadas las páginas del sitio Web.

Index.htm es el nombre del archivo que podemos ver en el navegador. Es decir, la página en sí.

Este sencillo ejemplo nos sirve para ilustrar el direccionamiento de las páginas Web en Internet. El nombre del dominio es manejado por los servidores DNS para obtener la dirección IP real del equipo que sirve esas páginas. El protocolo IP ayuda a ubicar el computador que tiene tal dirección. Una vez llegado el requerimiento al computador, el servidor (Apache o IIS) se encarga de ubicar la página en base a los subdominios (carpetas) y nombre de la página.

En resumen, un URL (Uniform Resource Locator) es una dirección escrita en un formato específico, que ayuda a localizar un elemento de red en Internet. Estos elementos podrían ser páginas Web, o elementos gráficos e inclusive programas.

Introducción

En este capítulo aprenderás a escribir páginas Web básicas con usando el lenguaje de hipertextos HTML.

Al finalizar este capítulo podrás entender y escribir una página Web simple, desarrollar un formulario de captura de datos y mostrar enlaces e imágenes.

Si ya tienes un conocimiento básico de HTML, entonces podrías pasar directamente al tercer capítulo.

Temas desarrollados en este capítulo:

¿Qué es HTML?

Estructura de una página básica en HTML

Etiquetas básicas

Atributos en las etiquetas

Trabajando con tablas

Otras maneras de organizar la información

Manejo de formularios

La etiqueta input y sus múltiples formas

¿Qué es HTML?

Para poder explicar lo que es HTML debemos primero hablar de lo que significa hipertexto.

Desde hace siglos el hombre ha venido produciendo contenidos en forma de libros, revistas, periódicos, volantes o avisos publicitarios, sin embargo, no es sino hasta el arribo de las computadoras a nuestra cotidianidad, que hemos tenido la oportunidad de dar un paso adelante en cuanto a nuestra relación con tales textos.

El hipertexto no es otra cosa que textos enlazados entre si de manera que nos permite ir más allá de la simple lectura lineal a la que estamos obligados, por ejemplo, en un libro físico. Aparte de esa funcionalidad, el hipertexto es la combinación de distintos tipos de información como las imágenes, los sonidos y los videos entrelazados con las palabras.

Existen varios lenguajes que permiten escribir hipertexto. Uno de ellos, el que nos ocupa en este capítulo, es HTML.

El lenguaje de marcas para manejo de hipertexto, o HTML por sus siglas en inglés (Hipertext Markup Language), es en esencia un conjunto de comandos de marca que se utiliza incrustado dentro de un texto para ordenarlo, darle formato y relacionarlo con otros textos. Así mismo permite intercalar elementos de distinta naturaleza como imágenes, elementos de audio o videos.

Cuando hablamos de una marca o etiqueta en HTML nos referimos a un comando encerrado entre los signos “<” y “>”. Un ejemplo de comando de etiqueta es <center>.

Algunos comandos HTML sirven para indicar el comienzo de algo, en cuyo caso debe escribirse otro comando o etiqueta que indique el final. La forma de indicar que un comando de inicio ha finalizado es escribiendo una barra oblicua o “slash” antes del comando. Por ejemplo, </center>. Como te podrás imaginar, si colocas un texto entre las etiquetas <center> y </center> debe salir centrado.

Hay otro tipo de etiquetas HTML que son declarativas, es decir cumplen su objetivo en un solo comando sin ser necesario el utilizar una etiqueta de cierre. En esos casos es recomendable colocar una barra oblicua antes de cerrar la etiqueta. Un ejemplo es <hr /> que sirve para mostrar una línea horizontal.

Estructura de una página básica en HTML

Aunque en teoría todos los navegadores existentes están diseñados para procesar el HTML de la misma manera, esto en la práctica no es del todo cierto. Existen algunas pequeñas diferencias en la presentación de ciertos elementos y también en la “permisividad” de los mismos respecto a las páginas mal construidas. Esto hace que por ejemplo, una página mal construida, pueda ser vista en un navegador y no en otro, así que te recomiendo ser cuidadoso en el uso correcto del HTML y probar los resultados en varios navegadores distintos.

Una página HTML básica comienza con la etiqueta <html> y termina con la etiqueta de cierre </html> e internamente tiene dos secciones, el encabezado (header) y el cuerpo (body). Más o menos así:

<html>

  <head>

  </head>

  <body>

  </body>

</html>

Evidentemente el ejemplo anterior no muestra absolutamente nada al cargarlo en un navegador, sin embargo, es nuestro punto de inicio para ir incluyendo otros comandos y ver los resultados.

El encabezado es un área general de cuyo uso hablaremos más adelante, sin embargo el cuerpo es donde debemos colocar todo aquello que deba ser mostrado.

Etiquetas básicas

Empecemos nuestro pequeño paseo por el mundo de HTML ejercitando algunas de las etiquetas básicas.

La etiqueta <title>

Para colocar el título de la página, es decir, lo que el navegador va a mostrar en la parte superior cuando tu página sea cargada usamos la etiqueta <title>. Esta etiqueta suele ponerse en el área del encabezado.

<html>

  <head>

    <title>Primer ejemplo</title>

  </head>

  <body>

    Esta es mi primera página en HTML

  </body>

</html>

Etiquetas de centrado, manejo de párrafos y títulos

Existen un conjunto de etiquetas que sirven para darle formato al texto, veamos algunas de ellas:

Las etiquetas <center> y </center> permiten mostrar en el centro del navegador todos los elementos –textos o no- que pongamos en medio de ellas.

Las etiquetas <p> y </p> permiten definir un texto que debe ser mostrado como un párrafo.

Los pares de etiquetas <h1> </h1>, <h2> </h2>, hasta <h6> </h6> permiten definir desde títulos grandes (h1), hasta pequeños (h6).

Veamos un ejemplo de todo lo anterior:

<html>

  <head>

    <title>Segundo ejemplo</title>

  </head>

  <body>

    <h1>Este es un título tipo 1</h1>

    <h2> Este es un subtítulo tipo 2</h2>

    <h5> Este es un subtítulo tipo 5</h5>

    <p>

      Este es un texto escrito dentro de un documento HTML para demostrar el uso

      de los comandos básicos

    </p>

  </body>

</html>

Etiquetas para alterar los fonts

La etiqueta <b>, junto con su respectiva etiqueta de cierre, permite escribir texto en negritas. Otro modo de obtener el mismo resultado es a través de la etiqueta <strong>.

Las etiquetas <i> y </i>, permiten escribir texto en itálicas.

La etiqueta <u>, junto con su respectiva contrapartida </u>, permite escribir texto en modo subrayado.

<html>

  <head>

    <title>Tercer ejemplo</title>

  </head>

  <body>

    <p>

      Algunas palabras en este ejemplo aparecen en <b>negritas</b>, otras

      en <i>itálicas</i> y una <u>subrayada</u>.

    </p>

  </body>

</html>

Etiquetas para salto de página y línea horizontal

La etiqueta <hr /> dibuja una línea horizontal a lo ancho de la ventana.

La etiqueta <br /> por su parte se usa para indicar un salto de línea.

<html>

  <head>

    <title>Cuarto ejemplo</title>

  </head>

  <body>

    Texto inicial <br /><br /><br /><br />continuación

    <hr />

  </body>

</html>

Etiquetas para mostrar listas

Las etiquetas <ul> y </ul> se utilizan para indicar que lo contenido dentro de ellas debe ser mostrado como una lista. Estas etiquetas se usan en combinación con otras que son <li> y </li>, las cuales contienen cada uno de los elementos de la lista.

En otras palabras, siempre que deseemos escribir una lista de ítems, debemos poner un par de etiquetas <ul> y </ul> para indicar que todo lo contenido internamente habrá de ser desplegado como si fuese una lista.

Adicionalmente, para cada porción de texto que deseamos que sea mostrada como un elemento independiente de la lista, debemos encerrarlo entre las etiquetas <li> y </li>.

Veamos un ejemplo:

<html>

  <head>

    <title>Quinto ejemplo</title>

  </head>

  <body>

    <ul>

      <li>Este es el primer elemento de la lista</li>

      <li>Este es el segundo elemento de la lista</li>

      <li>Este es el tercer y último elemento de la lista</li>

    </ul>

    Este elemento aparecerá despegado<br /><br /> de este otro por dos saltos de línea.

    <hr />Este otro texto aparecerá luego de una línea horizontal.

  </body>

</html>

Atributos en las etiquetas

Hasta ahora hemos utilizado las etiquetas solo para indicar dónde empieza y dónde termina una característica, o donde ejecutar una acción como un salto de línea, pero en general, las etiquetas son un poco más complejas y no solo indican que hacer sino como hacerlo. Para ello debemos explicar lo que es un atributo dentro de una etiqueta.

Tomemos por ejemplo el comando que sirve para mostrar una imagen: <img>. Esta etiqueta no tendría ninguna utilidad si no pudiésemos decirle cual imagen mostrar. Para ello, se incluye un atributo especial llamado src. El modo de usarla es el siguiente:

<img src=’mi_imagen.jpg’ />

En general, para asignarle un valor a un atributo dentro de una etiqueta debemos usar el signo igual y colocar el valor entre comillas. Aunque el uso de las comillas simples y dobles es permitido en HTML siempre que se en cada caso se abra y se cierre usando una sola de ellas, yo recomiendo usar siempre comillas simples en HTML, ya que al comenzar a trabajar con PHP, veremos que las comillas dobles son de más utilidad allá que en HTML.

Veamos algunos ejemplos:

La etiqueta <img>

La etiqueta <img /> sirve, como ya mencionáramos, para mostrar una imagen. Dos de sus atributos son importantes de destacar:

src: indica el nombre (y directorio si hace falta) de la imagen.

border: indica el grosor del borde a ser mostrado alrededor de la imagen.

<html>

  <head>

    <title>Sexto ejemplo</title>

  </head>

  <body>

    <img src=’mi_imagen.jpg’ border=’1’/>

  </body>

</html>

Etiquetas para realizar enlaces

Las etiquetas <a> y </a> sirven para definir un enlace. El texto o elemento colocado entre ambas etiquetas, hará las veces de enlace visible y, por defecto, se mostrará subrayado. El principal atributo es el siguiente:

href: indica la página o segmento de ella a donde el navegador debe saltar si el usuario selecciona el enlace.

<html>

  <head>

    <title>Séptimo ejemplo</title>

  </head>

  <body>

    <a href=’pagina2.htm’>Ir a la página 2</a>

    <br />

    <a href=’pagina3.htm’>

      <img src=’mi_imagen.jpg’ border=’1’/>

    </a>

  </body>

</html>

La etiqueta <font>

Las etiquetas <font> y </font> sirven para cambiar localmente el tipo, tamaño y el color de la fuente utilizada para mostrar el texto escrito en medio de ambas. Los principales atributos son:

face: indica el nombre de la fuente, por ejemplo Arial, o Courier, o Tahoma.

size: indica el tamaño de los caracteres.

color: indica el color que tendrá el texto.

Existe una mejor manera de manipular los tipos de letra utilizando CSS. El comando <font> de HTML, además de complicar tremendamente el código de la página, puede ser afectado fácilmente por las preferencias seleccionadas en el navegador.

Veamos un ejemplo más utilizando todas estas nuevas etiquetas:

<html>

  <head>

    <title>Octavo ejemplo</title>

  </head>

  <body>

    <font face=’Arial’ size=’4’>

      Texto en Arial 4

    </font>

    <font face=’Courier’ size=’2’>

      Texto en Courier 2

    </font>

    <font face=’Arial’ size=’4’>

      Otro texto en Arial 4

    </font>

  </body>

</html>

Trabajando con tablas

Una de las maneras –no necesariamente la mejor- de organizar la información en el espacio de la página es usando tablas. Una tabla HTML en su versión más simple, es básicamente una cuadrícula tipo Excel en la que podemos colocar información distribuidas en filas y columnas.

El comienzo de una tabla se debe indicar con la etiqueta <table> y el final con su contrapartida </table>. Internamente, debemos colocar un comando <tr> para indicar el comienzo de cada nueva fila y dentro de cada fila un comando <td> para cada columna. Es importante controlar que cada <tr> y cada <td> tengan su correspondiente cierre.

Una de las principales complejidades de trabajar con tablas es el hecho de que cualquier error en el cierre de una etiqueta, o el hecho de poner erróneamente más columnas en una fila que en otra, pueden llevar a resultados impredecibles. Así que si deseas trabajar con tablas debes ser muy cuidadoso y paciente.

Veamos un ejemplo simple, para poder ver la tabla en pantalla vamos a usar el atributo border con un valor de 1.

<html>

  <head>

    <title>Noveno ejemplo</title>

  </head>

  <body>

    <table border=’1’>

      <tr>

        <td>Arriba izquierda</td>

        <td>Arriba centro</td>

        <td>Arriba derecha</td>

      </tr>

      <tr>

        <td>Medio izquierda</td>

        <td>Medio centro</td>

        <td>Medio derecha</td>

      </tr>

      <tr>

        <td>Abajo izquierda</td>

        <td>Abajo centro</td>

        <td>Abajo derecha</td>

      </tr>

    </table>

  </body>

</html>

Existen un par de atributos que pueden darle más poder a nuestras tablas, se usan para poder unir dos o más filas o dos o más columnas. Se llaman rowspan y colspan. Veamos su efecto alterando un poco el anterior ejemplo:

<html>

  <head>

    <title>Décimo ejemplo</title>

  </head>

  <body>

    <table border=’1’>

      <tr>

        <td rowspan=’2’>Izquierda</td>

        <td>Arriba centro</td>

        <td>Arriba derecha</td>

      </tr>

      <tr>

        <td>Medio centro</td>

        <td>Medio derecha</td>

      </tr>

      <tr>

        <td colspan=’3’>Abajo</td>

      </tr>

    </table>

  </body>

</html>

Con rowspan podemos hacer que una celda en particular se propague a la siguiente fila, por lo que debemos cuidar de poner una celda menos en la siguiente fila para que la tabla mantenga su coherencia. Colspan por su parte, permite unir dos o más columnas en una sola.

Otras maneras de organizar la información

Para poder organizar la información en la página sin utilizar tablas existen diversos mecanismos. A continuación exploraremos superficialmente los principales:

La etiqueta <div>

Es quizás el método más recomendado para organizar la información. Consta de dos etiquetas <div> y </div> que en combinación con ciertos atributos de estilo (usando CSS) pueden lograr prácticamente cualquier resultado que desees.

Al colocar parte de la información dentro de un bloque tipo <div>, el navegador usualmente parecerá insertar un salto de línea antes y después del contenido. Así que en su forma más simple, un div no es más que una sección horizontal de la página. Sin embargo, existen maneras de decirle a una sección div la cantidad de exacta espacio vertical y horizontal que deseamos que abarque, así como el color de fondo y hasta darle un estilo único a todo lo contenido dentro de ellos. Todo esto, como ya hemos mencionado, se hace a través de CSS.

Las zonas definidas por div, pueden colocarse unas dentro de otras, así que podríamos usar un div que abarque toda la página, dentro de él uno para encabezado y otro para el cuerpo y dentro del cuerpo definir dos o tres secciones cada uno con sus características independientes.

Una opción adicional, y quizás la que lo hace más funcional, es poder organizar los bloques horizontalmente utilizando, una vez más, CSS. De esta manera podemos pensar toda nuestra página como una serie de cuadros invisibles de distintos tamaños dentro de los cuales poner nuestros contenidos.

La etiqueta <span>

Esta etiqueta permite agrupar una cierta cantidad de información para darle un estilo común. A diferencia del comando div, un span no establece un área cuadrada, al contrario, podemos iniciar un bloque <span> a mitad de un párrafo y terminarlo unas líneas más abajo y nos permitirá darle un trato especial a esa porción de texto sin alterar la estructura del párrafo en sí.

Las etiquetas <frameset>, <frame> y <noframe>

Dentro de una página cualquiera podemos hacer una serie de divisiones verticales u horizontales y cargar en cada una de esas partes una página independiente. Esto lo podemos hacer utilizando el concepto de frames (marcos).

Una página formada por marcos no debe tener las etiquetas <body> y </body> en su posición original, ya que no se supone que maneje contenidos. El único propósito de una página compuesta por marcos es indicar la cantidad y disposición de cada una de las páginas internas que han de ser cargadas.

Sin embargo, ciertos navegadores muy antiguos, y algunos modernos en dispositivos móviles, no soportan el concepto de marcos, por lo que debe incluirse una sección para que en esos casos funcione como página alternativa. En ese caso, las etiquetas de <body> y </body> deben ser nuevamente incluidas.

Una estructura de marcos básica tiene la siguiente forma:

<html>

  <head>

    <title>Undécimo ejemplo</title>

  </head>

  <frameset cols=’100,*’>

    <frame src=’Izquierda.html’ />

    <frame src=’Derecha.html’ />

    <noframes>

      <body>

        Lo lamento.<br />

        El navegador que estas usando no soporta marcos.

      </body>

    </noframes>

  </frameset>

</html>

En el ejemplo anterior estamos indicando que deseamos partir la ventana en dos columnas, la primera de ellas va a ocupar 100 pixeles y la segunda el resto del área disponible.

Seguidamente estamos indicando que página cargar en cada marco, y finalmente estamos colocando una pequeña página Web alternativa que deberá aparecer solo si nuestro navegador no soporta marcos.

El comando frameset puede ser anidado, es decir, puede colocarse uno dentro de otro para obtener estructuras más complejas. Imaginemos un escenario donde necesitemos una página con un encabezado que ocupe toda la parte superior (de unos 300 pixeles de altura),una parte media dividida en dos columnas, y un pié de página de 100 pixeles de altura. Supongamos además que la columna izquierda de la parte media tenga un ancho de 200 pixeles y la columna derecha ocupa el resto del espacio.

Para ello deberíamos escribir algo como lo siguiente:

<html>

  <head>

    <title>Décimo segundo ejemplo</title>

  </head>

  <frameset rows=’80,*,50’>

    <frame src=’Encabezado.html’ />

    <frameset cols=’40,*’>

      <frame src=’Izquierda.html’ />

      <frame src=’Derecha.html’ />

    </frameset>

    <frame src=’Pie.html’ />

    <noframes>

      <body>

        Lo lamento.<br />

        El navegador que estas usando no soporta marcos.

      </body>

    </noframes>

  </frameset>

</html>

En el anterior ejemplo hemos puesto uno dentro de otro dos estructuras de frameset, el primero divide la página en tres secciones horizontales gracias al atributo rows. El marco que va a ocupar la primera sección, tendrá una altura de 80 pixeles, el último tendrá 50 pixeles y el del centro todo el espacio restante.

Ahora bien, si observamos lo que hemos puesto dentro de este frameset podemos ver que en lugar de una etiqueta <frame> para definir la página central, hemos colocado una segunda estructura frameset, esta vez para dividir esa área en dos columnas, una de 40 pixeles y la otra con el espacio sobrante.

El resultado será una página formada por cuatro páginas independientes conviviendo en la misma ventana. Suena tentador, sin embargo nuestra recomendación es que no utilices marcos en tus aplicaciones.

Hace unos años la estructura de frames estaba justificada por la necesidad de recargar solo una porción de la pantalla y así poder acelerar el funcionamiento del sitio Web. En la actualidad, la tecnología de Internet ha venido haciendo grandes progresos y el tiempo de carga de una página es cada vez menos relevante. Además, la aparición de nuevas tecnologías como Ajax permite recargar pedazos completos de tu página sin necesidad de usar marcos.

Otra desventaja de usar marcos es que frecuentemente es difícil controlar la coherencia de las páginas cargadas. Muchas aplicaciones usan marcos para tener en un lado un menú y en otro los contenidos, pero suele perderse mucho tiempo tratando de evitar situaciones donde ambos lados muestren contenidos no relacionados. Esto suele pasar, mayormente, cuando se presiona el botón “Atrás” o “Back” del navegador, quien usualmente recarga la página anterior del último marco recargado.

Manejo de formularios

Hasta ahora hemos mostrado algunos de los comandos HTML que ayudan a mostrar información. Sin embargo, no hemos mencionado por ninguna parte como podemos hacer que nuestras páginas pidan información al usuario.

Así como en el mundo físico existen los libros, revistas y todos los tipos de impresiones pasivas, existen también los formatos pre impresos en los que se le pide a una persona completar cierta información para luego ser procesada. Son los llamados formularios.

De la misma manera, un formulario en HTML es un conjunto de comandos que permiten solicitar información al usuario para ser enviada a un servidor donde deberá ser procesada.

Veamos una a una las etiquetas que componen un formulario estándar.

La etiqueta <form>:

Sirve para agrupar el conjunto de ítems que van a ser procesados simultáneamente al ser transmitidos. Visualmente, esta etiqueta no tiene ningún efecto en la pantalla.

Los atributos principales de la etiqueta form son los siguientes:

name: nombre del formulario, el cual es muy importante si deseas manipular el comportamiento de la pantalla usando JavaScript.

action: Nombre de la página a la que se le habrán de enviar los datos contenidos en el formulario para ser procesados.

method: Atributo opcional que sirve para indicar si el método usado en la llamada habrá de ser GET o POST.

La etiqueta <input>:

La etiqueta input puede tomar diversas formas. Puede utilizarse para generar una entrada de texto, un botón, un selector tipo radio, una opción de chequeo, entre otras posibilidades.

Dada la variedad de formas y la importancia de las mismas, desarrollaremos este comando en la siguiente sección con más detalle.

Las etiquetas <select> y <option>:

Este par de etiquetas (y sus correspondientes etiquetas de cierre) sirven para mostrar en pantalla un cuadro combinado, mejor conocido como combo box.

Los atributos principales de la etiqueta la etiqueta select son los siguientes:

name: nombre del elemento. Este atributo es fundamental ya que al ser enviado el formulario, este es el nombre mediante el cual se podrá recuperar la opción seleccionada por el usuario.

disabled: Si este atributo aparece dentro de la etiqueta del select, entonces el elemento aparecerá como deshabilitado. Este atributo no necesita ser igualado a ningún valor.

Multiple: si esta opción aparece en la etiqueta, el comportamiento del elemento cambia significativamente, ya que el usuario tendrá la opción de seleccionar más de una opción a la vez.

Size: permite determinar el número de elementos que podrán ser mostrados simultáneamente cuando el usuario esté haciendo una selección.

Los atributos principales de las etiquetas option son:

Value: indica el valor que habrá de tomar el select en caso de que esta opción sea seleccionada.

Selected: indica que la opción debe estar seleccionada inicialmente al mostrarse la página.

<html>

  <head>

    <title>Décimo tercer ejemplo</title>

  </head>

  <body>

    Profesión:

    <select>

      <option value=’0’ selected>Ninguna</option>

      <option value=’1’>Abogado</option>

      <option value=’2’>Bombero</option>

      <option value=’3’>Electricista</option>

      <option value=’4’>Reportero</option>

    </select>

  </body>

</html>

La etiqueta <textarea>:

Esta etiqueta, en conjunto con su respectiva etiqueta de cierre, muestra en pantalla un área de texto multilínea para que el usuario escriba un contenido potencialmente largo. Todo lo que el programador escriba entre los tags de inicio y fin del textarea aparecerán como contenido inicial.

Los atributos principales de un textarea son los siguientes:

name: nombre del elemento.

disabled: indica si el elemento aparecerá como deshabilitado. Este atributo no necesita ser igualado a ningún valor.

Rows: número de filas visibles.

Cols: número de columnas visibles (caracteres).

Readonly: si este atributo aparece escrito indica que el usuario no podrá alterar el contenido del elemento.

<html>

  <head>

    <title>Décimo cuarto ejemplo</title>

  </head>

  <body>

    Descripción:

    <textarea rows=’5’ cols=’40’>

      Este es un ejemplo de texto dentro de un textarea

    </textarea>

  </body>

</html>

La etiqueta input y sus múltiples formas

Como ya mencionamos anteriormente, la etiqueta input sirve para solicitar información del usuario de diversas maneras. La forma que habrá de tomar este control, está relacionada con el valor que coloquemos en el atributo type.

Comencemos por mencionar algunos atributos que son comunes a todas las  formas para luego desarrollar cada forma en particular:

Type: como ya mencionamos, indica el tipo de comportamiento.

Name: al igual que en los casos anteriores, name es el atributo principal ya que establece el nombre con el que se recibirá su contenido en la página que procese el formulario. Además permite identificarlo si deseamos manipular su contenido usando JavaScript.

Id: al igual que en el caso anterior permite identificarlo para manipular su contenido usando JavaScript.

disabled: indica si el elemento aparecerá como deshabilitado. Este atributo no necesita ser igualado a ningún valor.

Pasemos ahora a estudiar separadamente cada una de las formas.

<input type=’text’>

Muestra en pantalla un campo para escribir texto de una sola línea. Su atributo más importante, aparte de los mencionados es:

Value: permite prefijarle al elemento un cierto contenido.

Un ejemplo típico de uso para este tipo de etiqueta es para preguntar el nombre o el apellido de una persona.

<html>

  <head>

    <title>Décimo quinto ejemplo</title>

  </head>

  <body>

    Nombre:

    <input type=’text’ name=’nombre’ />

    <br />

    Apellido:

    <input type=’text’ name=’apellido’ />

  </body>

</html>

<input type=’password’>

Funciona exactamente igual que en el caso anterior (text), pero permite ocultar el contenido de lo escrito por el usuario.

El ejemplo típico de uso para este tipo de etiqueta es para preguntar claves personales o passwords.

<html>

  <head>

    <title>Décimo sexto ejemplo</title>

  </head>

  <body>

    Usuario:

    <input type=’text’ name=’usuario’ />

    <br />

    Clave:

    <input type=’password’ name=’clave’ />

  </body>

</html>

<input type=’hidden’>

Este tipo de campos no son mostrados en pantalla. Al igual que en los dos casos anteriores permite contener un valor de texto, solo que en este caso su manipulación no depende directamente del usuario sino de código en JavaScript o para contener valores enviados desde el servidor.

El ejemplo típico de uso para este tipo de etiqueta es para propagar de una página a otra un cierto valor. Hablaremos más de esto cuando lleguemos comencemos a hablar de PHP.

<input type=’radio’>

Muestra en pantalla un elemento tipo radio, el cual cuando es combinado con más opciones del mismo tipo, le permite al usuario hacer una selección única entre varias opciones.

Los elementos de radio actúan en conjunto como uno solo, es decir, cuando más de uno de ellos comparten el mismo nombre, entonces se comportan como opciones excluyentes, o sea que seleccionando uno de ellos se deseleccionan todos los demás.

Los atributos principales de los elementos de radio, además de los generales name y id son:

Checked: indica que la opción debe aparecer seleccionada. Este atributo, al igual que algunos otros que aparecerán más adelante, no tiene valor. Su uso es meramente declarativo. Por ejemplo: <input type=’radio’ checked>

Value: permite asignarle a cada opción un valor invisible para que una vez enviado, pueda determinarse cual opción fue la seleccionada.

Como ejemplo típico de botones de radio en un formulario podemos poner la selección de estado civil, el cual es un valor único entre un conjunto reducido de opciones.

<html>

  <head>

    <title>Décimo séptimo ejemplo</title>

  </head>

  <body>

    Género:

    <input type=’radio’ name=’gen’ value=’M’ />Masculino

    <input type=’radio’ name=’gen’ value=’F’ />Femenino

    <br />

    Empleado:

    <input type=’radio’ name=’ocu’ value=’S’ />Si

    <input type=’radio’ name=’ocu’ value=’N’ />No

  </body>

</html>

<input type=’checkbox’>

Muestra en pantalla un elemento tipo check, es decir, un recuadro para seleccionar o no una cierta opción.

El atributo principal de los elementos de checkbox es:

Checked: indica que la opción debe aparecer seleccionada o no

<html>

  <head>

    <title>Décimo octavo ejemplo</title>

  </head>

  <body>

    Experiencia: <br />

    <input type=’checkbox’ name=’ex0’ />Sabe conducir<br />

    <input type=’checkbox’ name=’ex1’ />Sabe inglés<br />

    <input type=’checkbox’ name=’ex2’ />Sabe karate<br />

  </body>

</html>

<input type=’button’>

Muestra en pantalla un botón.

El atributo principal de los elementos tipo botón son:

Value: indica el nombre que debe aparecer sobre el botón.

Para poder darle utilidad a un botón debemos programar su comportamiento a través de JavaScript. Sin embargo, si deseas que un botón sirva para enviar un formulario o devolver el mismo a sus valores iniciales, entonces puedes usar directamente una de las opciones siguientes.

<html>

  <head>

    <title>Décimo noveno ejemplo</title>

  </head>

  <body>

    <input type=’button’ value=’Imprimir’ />

  </body>

</html>

<input type=’submit’>

Un elemento tipo submit no es otra cosa que un botón que al ser presionado envía el formulario del cual forma parte.

<input type=’cancel’>

Un elemento tipo cancel es un botón que al ser presionado restaura los valores iniciales de el formulario del cual forma parte.

Consideraciones finales

El desarrollo de páginas Web en la actualidad, en lo que al diseño externo se refiere, se realiza usualmente a través de editores visuales, así que no es extraño encontrar personas que han desarrollado al menos una página Web sin tener el menor conocimiento de HTML. Sin embargo, si vas a trabajar en PHP, tu trabajo habrá de consistir en modificar dinámicamente el funcionamiento de la misma, y para ello, necesitas una base de HTML.

Introducción

En este capítulo nos adentraremos por primera vez en el lenguaje PHP, comenzando por los aspectos generales y los comandos y estructuras más básicos. Podría decirse que este capítulo es el más importante de todo el libro, por lo que recomendamos su lectura minuciosa, sobre todo en el caso de aquellos lectores menos experimentados en el mundo de la programación.

Al finalizar este capítulo deberías ser capaz de escribir una página básica usando tus primeros comandos en PHP.

Temas desarrollados en este capítulo:

Estructura general de un programa en PHP

Comentarios de una línea o múltiples líneas

Variables, definición, sintaxis y alcance

Tipos de dato usados en PHP

Constantes, definición y uso

Expresiones, definición y ejemplos.

Operadores más comunes

Antes de comenzar

En los capítulos anteriores hicimos un recorrido superficial por la arquitectura de Internet, a fin de manejar los términos que habrán de aparecer una y otra vez en tu trabajo de programador. También nos sumergimos, sin bajar demasiado, en el mundo del HTML, el cual debes conocer íntimamente si pretendes tener algo de éxito en el competido mundo del desarrollo Web.

Finalmente ha llegado el momento de hablar PHP. Antes de comenzar, quisiéramos hacerte un par de recomendaciones.

La primera es que practiques los ejemplos que se te proponen. Una cosa es ver el ejercicio en el libro y comprenderlo y otra muy distinta es hacerlo para aprender de los errores. Si lees mucho sobre PHP vas a terminar comprendiéndolo muy bien, pero no sobrevivirás a una aplicación real si no aprendes a pensar en PHP.

La segunda recomendación es que te diviertas. Hay muchas maneras de resolver el mismo problema en este lenguaje. Buscar mejores soluciones a lo que ya has resuelto te ayudará a avanzar más rápidamente y te harás más productivo.

Hasta aquí los consejos. ¡Hablemos PHP!

Estructura general de un programa en PHP

Existen diversas maneras de trabajar con PHP. Una de ellas, la más sencilla, es hacer una página normal HTML que sirva de estructura y luego “invadir” el código HTML con etiquetas PHP que realicen las tareas necesarias.

Extensión de los archivos

Debes tener en cuenta que para que Apache le envíe tu página al intérprete de PHP, la extensión del archivo debe ser “.php”.

Etiquetas de inicio y fin de una sección de código PHP

Toda sección de la página que contenga etiquetas PHP debe comenzar con <?php y terminar con ?>. Otra posibilidad válida es usar <script language="php"> y </script>, también existen otras alternativas menos recomendables como <? Y ?>.

Separación de los comandos

Una sección de código PHP es una secuencia de uno o más comandos o llamadas a funciones separados por punto y coma.

Además, dos o más comandos PHP pueden ser agrupados en un bloque usando los caracteres { y }. Más adelante explicaremos la utilidad de estos bloques.

Comentarios

Existen dos maneras de escribir comentarios.

Para escribir un comentario de una sola línea solo hay que escribir dos barras oblicuas consecutivas (//), a continuación de las cuales, todo lo que se escriba hasta finalizar la línea se considerará un comentario.

Para escribir comentarios de más de una línea hay que utilizar el delimitador /*, el cual hará que todas las líneas escritas a partir de él sean consideradas comentarios hasta la aparición del delimitador de cierre: */.

<?php

  // Esto es un comentario

  $i = 5; // Estos comentarios no afectan

  $j = 8; // la instrucción de la izquierda

  /*

   Esto es un comentario multilinea

   Nada de esto se ejecuta

  */

  $k = 9;

?>

Los comentarios en el ejemplo anterior son invisibles para el intérprete de PHP, por lo que, desde el punto de vista del programa, lo anterior equivale a:

<?php

  $i = 5;

  $j = 8;

  $k = 9;

?>

Variables

En cualquier lenguaje de programación, una variable es un nombre usado dentro del lenguaje para referenciar un cierto contenido. Este llamado contenido de la variable puede ser un valor simple o puede tener una cierta estructura. Las variables, de nuevo dependiendo de las especificaciones del lenguaje, podrían requerir de una declaración antes de ser usadas y por lo general, están preparadas para recibir solo un cierto tipo de información.

PHP ofrece un manejo de variables muy flexible y a la vez muy poderoso. Los tipos de dato son fácilmente intercambiables y la declaración de variables no es necesaria. Además, algunos operadores han sido añadidos al lenguaje para que el usuario pueda decidir por sí mismo cuando tomar en cuenta el tipo de los datos y cuando no.

Reglas que debe cumplir el nombre de una variable

Toda variable debe comenzar con el símbolo de dólar ($).

El primer carácter del nombre de una variable puede ser cualquier letra o el llamado guión bajo (o underscore character).

El resto de los caracteres del nombre pueden ser letras, números o guiones bajos.

Los nombres de las variables en PHP son sensibles a mayúsculas y minúsculas, es decir que las variables $sueldo y $Sueldo son distintas. Hay que ser muy cuidadoso con respecto a esto.

Tipos de dato

Cualquier variable en PHP puede ser asignada con datos de cualquier tipo. Más aún, una variable de un tipo puede cambiar a otro sin ningún problema. Esta flexibilidad trae consigo muchas ventajas pero también podría inducir a errores si no somos cuidadosos.

Los principales tipos de dato son:

Entero (o integer), permite almacenar números enteros positivos o negativos.

Texto (o string), permite almacenar palabras, frases o cualquier secuencia de caracteres.

Lógico (o boolean) permite almacenar solo dos tipos de valores: verdadero y falso.

Punto flotante (o float) permite guardar números con decimales.

Arreglos (o arrays), que actúan como colecciones de variables de cualquier tipo.

Objetos, que son tipos estructurados que pueden contener incluso sus propios programas.

Null, que es el contenido de cualquier variable si no se le ha asignado ningún valor.

Si ya has trabajado en otros lenguajes de programación, seguramente reconocerás la mayoría de los tipos mencionados. Si no es así, no te preocupes que vayamos hablando de ellos a medida que los vayamos necesitando.

Alcance de variables

Este es otro concepto que iremos aclarando a medida que vayamos adentrándonos en otras partes del lenguaje. Sin embargo podemos mencionar que las variables definidas en una página, existen solo en esa página. Para ser más específicos, pueden ser usadas a partir del punto en el que son asignadas por primera vez en adelante.

Más adelante veremos que esta afirmación tiene algunas excepciones.

Asignándole contenido a una variable

Para darle valor a una variable debemos usar el llamado operador de asignación, que en PHP es el signo de igual. Por ejemplo:

<?php

  // Como asignar un valor numérico

  $valor_numerico = 25;

  // Como asignar un texto

  $valor_textual = ”Esto es un ejemplo”;

?>

Variables de variables

Una de las características del lenguaje que le aporta una tremenda flexibilidad es la posibilidad de expandir “macros”. Es decir, la posibilidad de poder armar el nombre de una variable dentro de otra variable para luego inspeccionar su contenido.

Existen ocasiones en las que debemos usar una u otra variable dependiendo de una cierta condición. Para este tipo de casos PHP ofrece la posibilidad de armar el nombre de la variable que deseamos utilizar dentro de una tercera, para luego acceder al contenido de la variable seleccionada prefijando el nombre de la variable contenedora por un signo de dólar adicional.

Veamos si podemos aclarar el concepto a través de un ejemplo. Supongamos que tenemos tres variables que contienen tres tipos de precio de un cierto producto. Los nombres de las variables son $normal, $oferta y $devaluado. Ahora supongamos que dependiendo de ciertas condiciones queremos decidir cuál de esos precios debemos usar. Una posible solución sería la siguiente:

<?php

  $normal = 22;

  $oferta = 20;

  $devaluado = 15;

  if ($finDeMes)

    $precio = “oferta”;

  else {

    if ($articuloDeteriorado)

      $precio = “devaluado”;

    else

      $precio = “normal”;

  }

  echo “El precio seleccionado es: “ . $$precio;

?>

En el ejemplo anterior podemos observar que hemos preparado una variable ($precio) con el nombre de la variable que contiene el valor a usar. Luego, para saber el contenido de esa variable cuyo nombre tenemos almacenado, hemos usado el doble signo de dólar. De esa manera hemos accedido no al texto “oferta” (por ejemplo) sino al valor de la variable $oferta.

Constantes

Una constante es una especie de variable que posee un valor fijo. Las constantes en PHP suelen ser declaradas al principio de cada página y sirven para darle claridad al código. Son especialmente útiles cuando necesitamos repetir el uso de un cierto valor una y otra vez.

Para declarar (asignar el valor) de una constante, debemos usar la función define, la cual tiene dos parámetros, el primero de ellos sirve para poner el nombre que deseamos darle a la constante y el segundo para asignarle un valor.

Los nombres de las constantes siguen las mismas reglas que los nombres de las variables, excepto que ellas no deben comenzar con el signo de dólar.

Es una práctica recomendable el usar siempre los nombres de constantes en mayúsculas para poder identificarlos como tales a primera vista.

Las constantes se usan del mismo modo que las variables, pero teniendo en cuenta que nunca podemos asignar nuevos valores sobre ellas.

Ejemplo:

<?php

  define(”PI”, 3.14159265);

  // La constante PI tendrá un valor de 3.14159265

  $radio = 25;

  $area = PI * $radio * $radio;

?>

Simbología utilizada para explicar la sintaxis

Durante nuestro paseo por los siguientes elementos del lenguaje, iremos mostrando la forma correcta de usar cada uno de ellos a través de lo que se llama una descripción sintáctica, que no es otra cosa que un diagrama que muestra la forma válida en que una instrucción cualquiera deba ser construida.

Pongamos un ejemplo sencillo para explicar la metodología:

<variable> = <nombre_de_función>([<parámetros>]);

En la línea anterior estamos indicando lo siguiente:

Un nombre de una variable (cualquiera).

Operador de asignación.

Un nombre de función (cualquiera).

Paréntesis de apertura.

Opcionalmente pueden haber parámetros.

Paréntesis de cierre.

Punto y coma.

Un ejemplo de lo descrito en la regla anterior sería:

$precio = calcular_precio();

O también:

$salario = calcular($neto, $bonos, $deuda);

En ambos casos se está cumpliendo con las siete mini reglas enumeradas anteriormente.

En general, las reglas de sintaxis que usaremos serán las siguientes:

¿Qué es una expresión?

Muchos de los ejemplos que verás en las siguientes páginas hacen referencia a la palabra “expresión”. Una expresión puede ser desde algo tan simple como un valor (digamos 5) o un texto (por ejemplo “edificio”) o una operación entre dos o más valores (5 + 8 – 2) o operaciones entre valores y variables ($sueldo + $bonos - $descuentos).

Por ejemplo, para describir como se asigna un valor a una variable, podríamos decir que puede ser de una de las siguientes maneras:

<variable> = <numero>;

<variable> = <cadena de caracteres>;

<variable> = <variable>;

<variable> = <variable> + <numero>;

<variable> = <variable> + <variable>;

O por el contrario podríamos decir simplemente que una asignación tiene la siguiente forma:

<variable> = <expresión>;

Operadores

Los operadores son símbolos que ofrece el lenguaje para permitir efectuar acciones simples sobre variables o valores individuales, como asignar un valor, comparar contenidos, incrementar variables, redondear, etc.

Existen distintos tipos de operadores según la tarea que ayudan a realizar. De hecho, ya hemos mencionado el operador de asignación, que es el más importante de todos. Pasemos ahora a revisar algunos de los más usados:

Operador básico de asignación

Así como ya mencionáramos anteriormente, el operador de asignación permite otorgarle un contenido a una variable.

Operador de asignación

Sintaxis:

              <variable> = <expresión>;

              Ejemplos:

              $i = 5;

              $nombre = “Andrea”;

              $total = 5 + 4;

Operador de concatenación

Permite unir dos cadenas de caracteres en una sola.

Operador de concatenación

              Sintaxis:

              <variable> = <expresión> . <expresión>;

              Ejemplos:

              $nombre = “Felipe” . “ Meza”;

              $letras = “A” . “B” . “C”;

              $cadena = $nombre . $letras;

Operadores aritméticos básicos

Usados para realizar operaciones aritméticas sencillas como la suma, la resta, la multiplicación y la división.

Suma

              Sintaxis:

              <variable> = <expresión> + <expresión>;

              Ejemplos:

              $total = 20 + 1;

              $total2 = $total1 + 5;

Resta

              Sintaxis:

              <variable> = <expresión> - <expresión>;

              Ejemplos:

              $precio = $precio – 5;

              $largo = $total - $cortado;

Multiplicación

              Sintaxis:

              <variable> = <expresión> * <expresión>;

              Ejemplo:

              $distancia = $distancia * 3;

División

              Sintaxis:

              <variable> = <expresión> / <expresión>;

              Ejemplo:

              $porcion = $total / 4;

Resto de la división

Sintaxis:

              <variable> = <expresión> % <expresión>;

              Ejemplo:

              $sobrante = $total % $porciones;

Operadores de incremento y decremento

Las operaciones aritméticas donde debemos incrementar o decrementar en uno el contenido de una variable son muy frecuentes. Para esos casos PHP ha adoptado los operadores unitarios del lenguaje C. Veamos cuales son.

Incremento

              Sintaxis:

              <variable>++

              Ejemplos:

              $total++;

              // El ejemplo anterior es equivalente a escribir

              $total = $total + 1;

Decremento

              Sintaxis:

              <variable>--

              Ejemplos:

              $total--;

              // El ejemplo anterior es equivalente a escribir

              $total = $total - 1;

Una variable puede ser usada dentro de una expresión conteniendo un operador de incremento o decremento. Veamos los ejemplos siguientes para comprender esta poderosa característica.

<?php

  $a = 5;

  $b = 3;

  $c = $a + $b;

  // El valor asignado a $c es 8

  // $a y $b mantienen sus valores

?>

Ahora veamos que sucede si, por ejemplo, decidimos incrementar el valor de $a dentro de la tercera asignación.

<?php

  $a = 5;

  $b = 3;

  $c = $a++  +  $b;

  // El valor asignado a $c sigue siendo 8

  // $a ha sido incrementado y ahora vale 6

  // $b sigue valiendo 3

?>

Es decir, en una sola instrucción sucedieron dos cosas. La variable $c ha tomado el valor de la suma de $a y $b, y luego, el valor de la variable $a ha sido incrementado en uno, pasando a tener un valor de 6.

Existe otra manera de hacer el incremento. Consiste en poner el operador antes del nombre de la variable, en cuyo caso la variable sería afectada antes de aportar su valor para la asignación. Veamos cómo funciona:

<?php

  $a = 5;

  $b = 3;

  $c = ++$a + $b;

  // $a ha sido incrementado y ahora vale 6

  // El valor asignado a $c es ahora 9

  // $b sigue valiendo 3

?>

En el caso anterior, el incremento de la variable $a sucede antes de usar su valor para el cálculo de la suma. Es decir, primero se incrementó $a para que su valor sea 6, y luego se calculó la suma, la cual ahora da 9.

Todo lo explicado anteriormente en cuanto al uso del operador de incremento ++ vale también para el operador de decremento.

Operadores lógicos

Estos operadores permiten efectuar operaciones entre dos valores o expresiones lógicas, es decir, aquellas que representan valores de verdadero o falso.

Negación

              Sintaxis:

              !<expresión>

              Ejemplo:

              $dia = true;

              $noche = !$dia

              // Equivale a decir que $noche va a tomar el valor

              // lógico contrario al que tome $dia

“Y” lógico

Sintaxis:

              <variable> = <expresión> && <expresión>;

              Ejemplo:

              $comprendo = true;

              $practico = true;

              $voy_a_aprender = $comprendo && $practico;

              // En el ejemplo anterior, la variable $voy_a_aprender

              // va a tener el valor true solo si las

              // variables $comprendo y $practico son a su vez trae

“O” lógico

Sintaxis:

              <variable> = <expresión> || <expresión>;

              Ejemplo:

              $ha_llovido = false;

              $lave_el_auto = true;

              $acera_mojada = $ha_llovido || $lave_el_auto;

              // En el ejemplo anterior, la variable $acera_mojada

              // será true si al menos una de las dos variables

              // es cierta.

“Y” lógico de evaluación completa

              Sintaxis:

              <variable> = <expresión> and <expresión>;

              Nota:

Funciona en forma similar al operador && excepto porque este último no evalúa la segunda expresión si la primera resulta falsa.

En la práctica, los operadores and y && retornan el mismo resultado, pero podrías querer usar uno u otro si necesitas que la parte derecha se ejecute o no.

“O” lógico de evaluación completa

              Sintaxis:

              <variable> = <expresión> or <expresión>;

              Nota:

Al igual que en el caso anterior, el operador or funciona en forma similar al operador ||, pero con evaluación completa de ambas expresiones.

“O” exclusivo

Sintaxis:

              <variable> = <expresión> xor <expresión>;

              Ejemplo:

              $tiene_azucar = true;

              $tiene_sacarina = false;

              $bien_endulzado = $tiene_azucar xor $tiene_sacarina;

              // Solo puede estar $bien_endulzado si $tiene_azucar

              // o si $tiene_sacarina. Nunca si tiene ambas cosas.

Más operadores de asignación

Además del operador de asignación, existen otras maneras de asignar un valor a una variable basado en el contenido que ella tenga. Es decir, hay un conjunto de operadores que permiten hacer una operación donde a una variable se le asigne un nuevo valor que sea el que ya tiene alterado por un operador. Veamos de qué estamos hablando:

<?php

  $a = 5;

  $a = $a + 3;

  // La instrucción anterior puede ser escrita de la siguiente manera

  $a += 3;

?>

Veamos los operadores uno a uno.

Asignación con suma

              Sintaxis:

              <variable> += <expresión>;

              Ejemplo:

              $total += 20;

              // Equivale a $total = $total + 20;

Asignación con resta

              Sintaxis:

              <variable> -= <expresión>;

              Ejemplo:

              $precio -= $descuento;

              // Equivale a $precio = $precio - $descuento;

Asignación con multiplicación

              Sintaxis:

              <variable> *= <expresión>;

              Ejemplo:

              $riesgo *= 2;

              // Equivale a $riesgo = $riesgo * 2;

Asignación con división

              Sintaxis:

              <variable> /= <expresión>;

              Ejemplo:

              $ganancia /= $personas;

              // Equivale a $ganancia = $ganancia / $personas;

Asignación con resto

              Sintaxis:

              <variable> %= <expresión>;

              Ejemplo:

              $personas = 9;

              $grupos = 2;

              $personas %= $grupos;

              // $personas contendrá el resto de 9 / 2, es decir 1

Asignación con concatenación

              Sintaxis:

              <variable> .= <expresión>;

              Ejemplo:

              $alfabeto = “abcd”;

              $alfabeto .= “efghi“;

              // $alfabeto contendrá la cadena "abcdefghi"

Asignación con "Y" lógico

              Sintaxis:

              <variable> &= <expresión>;

              Ejemplo:

              $tiene_licencia = true;

              $esta_asegurado = false;

              $puede_conducir = $tiene_licencia;

              $puede_conducir &= $esta_asegurado;

              // La ultima instrucción equivale a haber escrito

              $puede_conducir = $puede_conducir && $esta_asegurado;

Asignación con "O" lógico

              Sintaxis:

              <variable> |= <expresión>;

              Ejemplo:

              $es_animal = false;

              $es_vegetal = true;

              $es_un_ser_vivo = $es_animal;

              $es_un_ser_vivo |= $es_vegetal;

              // La ultima instrucción equivale a haber escrito

              // $ es_un_ser_vivo = $ es_un_ser_vivo || $ es_vegetal;

Operadores condicionales

Este tipo de operadores permiten comparar dos valores y retornar un valor de verdadero o falso. Veamos cada uno de ellos:

Es igual a (sin importar el tipo)

              Sintaxis:

              <expresión> == <expresión>

              Ejemplos:

              $numero_1 = 20;

              $numero_2 = 5 * 4;

              $son_iguales = $numero_1 == $numero_2;

              // En el ejemplo anterior, la variable $son_iguales va

              // a tener el valor true, ya que ambas variables

              // tienen el mismo valor.

              $numero_1 = 20;

              $numero_3 = "20";

              $son_iguales = $numero_1 == $numero_3;

              // En este otro ejemplo, la variable $son_iguales va

              // a tener de nuevo el valor true, ya que ambas

              // variables tienen el mismo valor aunque sean de

              // tipos diferentes.

Es idéntico a (mismo valor y mismo tipo)

              Sintaxis:

              <expresión> === <expresión>

              Ejemplo:

              $numero_1 = 20;

              $numero_3 = "20";

              $son_iguales = $numero_1 == $numero_3;

              // Si bien ambas variables contienen un número 20, la

              // comparación resulta falsa ya que los tipos de dato

              // son diferentes.

Es distinto a (sin importar el tipo)

              Sintaxis:

              <expresión> != <expresión>

              Ejemplos:

              $numero_1 = 20;

              $numero_2 = 5 * 4;

              $son_distintos = $numero_1 != $numero_2;

              // En el ejemplo anterior, la variable $son_distintos va

              // a tener el valor false, ya que ambas variables

              // tienen el mismo valor.

              $numero_1 = 20;

              $numero_3 = "20";

              $son_distintos = $numero_1 != $numero_3;

              // En este otro ejemplo, de nuevo la variable

              // $son_distintos va a tener el valor false,

              // ya que ambas variables tienen el mismo valor (no

              // importa si los tipos son iguales o no).

No idéntico a (distinto valor o distinto tipo)

              Sintaxis:

              <expresión> !== <expresión>

              Ejemplo:

              $numero_1 = 20;

              $numero_3 = "20";

              $son_distintos = $numero_1 !== $numero_3;

              // En este ejemplo, la variable $son_distintos va a

              // tener el valor true, ya que, aunque ambas variables

              // tienen el mismo valor, son de tipos distintos.

Menor que

              Sintaxis:

              <expresión> < <expresión>

              Ejemplo:

              $numero_1 = 20;

              $numero_2 = 25;

              $es_menor = $numero_1 < $numero_2;

              // En este ejemplo, la variable $es_menor va a

              // tener el valor true, ya que el valor de la

              // primera variable es menor que el de la segunda.

Mayor que

              Sintaxis:

              <expresión> > <expresión>

              Ejemplo:

              $numero_1 = 20;

              $numero_2 = 25;

              $es_mayor = $numero_1 > $numero_2;

              // En este ejemplo, la variable $es_mayor va a tener

              // el valor false, ya que el valor de la primera variable

              // no es mayor que el de la segunda.

Menor o igual que

              Sintaxis:

              <expresión> <= <expresión>

              Ejemplos:

              $numero_1 = 20;

              $numero_2 = 25;

              $es_menor_o_igual = $numero_1 <= $numero_2;

              // En este ejemplo, la variable $es_menor_o_igual

              // va a tener el valor true, ya que el valor de la

              // primera variable es menor que el de la segunda.

              $numero_1 = 20;

              $numero_3 = "20";

              $es_menor_o_igual = $numero_1 <= $numero_3;

              // En este ejemplo, la variable $es_menor_o_igual

              // va a tener el valor true, ya que el valor de la

              // primera variable es igual al de la segunda.

Mayor o igual que

              Sintaxis:

              <expresión> >= <expresión>

              Ejemplos:

              $numero_1 = 20;

              $numero_2 = 25;

              $es_mayor_o_igual = $numero_1 >= $numero_2;

              // En este ejemplo, la variable $es_mayor_o_igual

              // va a tener el valor false, ya que el valor de la

              // primera variable no es mayor que el de la segunda.

              $numero_1 = 20;

              $numero_3 = "20";

              $es_mayor_o_igual = $numero_1 >= $numero_3;

              // En este ejemplo, la variable $es_mayor_o_igual

              // va a tener el valor true, ya que el valor de la

              // primera variable es igual al de la segunda.

Es distinto a

              Sintaxis:

              <expresión> <> <expresión>

              Nota:

              Este operador es equivalente al operador !=.

Introducción

Este capítulo, aunque es un poco más avanzado, podría considerarse como una continuación del anterior en cuanto a que ambos presentan la estructura básica de todo programa en PHP.

Al igual que hicimos en la introducción del capítulo precedente, queremos hacer énfasis en la importancia de comprender los conceptos básicos y estructuras en las que se soporta todo el andamiaje del lenguaje que estamos presentando. En la medida en que estos aspectos estén claros en la mente del programador, mayores serán las oportunidades de desarrollar aplicaciones de mediana y gran envergadura.

Particularmente en esta sección, te presentamos el concepto y clasificación de las estructuras de control y nos adentramos en la descripción de algunas de ellas.

Al finalizar este capítulo podrás construir aplicaciones básicas que involucren condiciones y repeticiones, lo cual unido a lo aprendido en el anterior, constituye la base conceptual necesaria para la construcción de cualquier estructura programática.

Temas desarrollados en este capítulo:

Concepto y clasificación de las estructuras de control.

Estructuras condicionales en PHP.

Estructuras iterativas básicas.

Inclusión de archivos.

¿Qué son las estructuras de control?

Las estructuras de control en un lenguaje de programación son las que permiten alterar el orden de ejecución de los comandos.

Una estructura de control puede permitir que ejecutemos un conjunto de instrucciones solo si se ha cumplido una cierta condición. Podemos adicionalmente indicar una o más instrucciones que deben ejecutarse si la condición no se cumple. También existen otros tipos de estructuras de control permiten repetir un cierto trozo del código por un cierto número de veces o hasta que se cumpla cierta condición.

En líneas generales podríamos decir que una estructura de control define una condición, que de cumplirse, habrá de ejecutarse un comando o un bloque definido a continuación de la misma.

Un bloque no es otra cosa que dos o más comandos separados por punto y coma y encerrados entre los símbolos de llave. Si no existe un bloque luego de una estructura de control, entonces se está condicionando solo la línea siguiente.

Estructuras condicionales

Las primeras estructuras que estudiaremos son aquellas que nos permiten condicionar la ejecución de una porción del código.

El comando if

Este comando sirve para que se ejecuten un cierto número de instrucciones solo si se cumple una determinada condición.

Una condición, no es otra cosa que una expresión que puede tomar el valor de verdadero o falso. Típicamente una condición es una comparación. También puede usarse como condición, una variable que contenga un valor lógico.

Veamos las distintas formas que puede tomar el comando if:

Comando if

Descripción

Ejecuta un comando o bloque si se cumple una condición.

              Sintaxis:

              if(<condición>)

                <comando o bloque>;

              Ejemplos:

              // Condicionando una solo línea

              $maximo = $b;

              if ($a > $b)

                $maximo = $a;

              // Condicionando un bloque

              $maximo = $b;

              $max_nombre = "b";

              if ($a > $b){

                $maximo = $a;

                $max_nombre = "a";

              }

Al comando if puede tomar una forma un poco más compleja para indicar un grupo de instrucciones alternativo que deberá ejecutarse solo si la condición del if no se cumple. Esto lo hacemos agregando la palabra else luego del bloque de comandos condicionados.

La estructura básica es la siguiente:

If con else

              Descripción

Igual que el anterior pero define un comando o bloque a ser ejecutado si la condición no se cumple.

              Sintaxis:

              if(<condición>)

                <comando o bloque>;

              else

                <comando o bloque>;

              Ejemplos:

              // Condicionando una solo línea

              if ($a > $b)

                $maximo = $a;

              else

                $maximo = $b;

              // Condicionando un bloque

              if ($a > $b){

                $maximo = $a;

                $max_nombre = "a";

              } else {

                $maximo = $b;

                $max_nombre = "b";

              }

Veamos un ejemplo sencillo:

<?php

  $var1 = ”Número ”;

  $var2 = 3;

  if ($var2 % 2 != 0)

    $var1 .= “impar”;

  else

    $var1 .= “par”;

  // Si el valor almacenado en la variable $var2 es par,

  // entonces la variable $var1 contendrá el texto “Número par”

  // de lo contrario contendrá “Número impar”

?>

Anidando comandos if

Como ya hemos dicho, un comando if afecta directamente al comando escrito directamente detrás de él (o detrás de la palabra else). Si en lugar de un comando, necesitamos afectar a una cantidad mayor de código, entonces definimos un bloque.

Ahora bien, un comando if –incluyendo su bloque de ejecución- puede ser visto en su totalidad como una sola instrucción del programa. Así que si dentro de in comando if, necesitamos poner –únicamente- otro comando if, no necesitamos poner un nuevo bloque.

Veamos algunos ejemplos para entender de qué estamos hablando.

Comando if con una sola instrucción condicionada: Si se cumple la condición <cond>, entonces se ejecutan los comandos 1, 2 y 3. Si la condición no se cumple, entonces solo los comandos 1 y 3 serán ejecutados.

<cmd1>;

if (<cond>)

  <cmd2>;

<cmd3>;

Comando if con un bloque condicionado: Si se cumple la condición <cond>, entonces se ejecutan los comandos 1, 2, 3, 4 y 5. Si la condición no se cumple, entonces solo los comandos 1 y 5 serán ejecutados.

<cmd1>;

if (<cond>){

  <cmd2>;

  <cmd3>;

  <cmd4>;

}

<cmd5>;

If y else de una sola instrucción: Si se cumple la condición, entonces se ejecutan los comandos 1, 2 y 4. Si la condición <cond> no se cumple, entonces se ejecutan 1, 3 y 4.

<cmd1>;

if (<cond>)

  <cmd2>;

else

  <cmd3>;

<cmd4>;

if y else en bloques: Si se cumple <cond> se ejecutan 1, 2, 3, 4 y 9 de lo contrario se ejecutan 1, 6, 7, 8 y 9.

<cmd1>;

if (<cond>){

  <cmd2>;

  <cmd3>;

  <cmd4>;

} else {

  <cmd6>;

  <cmd7>;

  <cmd8>;

}

<cmd9>;

En los ejemplos anteriores podríamos imaginarnos que cualquiera de esos comandos es a su vez otro comando if, así que veamos cómo queda el primero de los ejemplos mencionados, cuando la instrucción interna es un bloque if.

<cmd1>;

if (<cond1>)

  if (<cond2>){

    <cmd2>;

    <cmd3>;

    <cmd4>;

}

<cmd5>;

En el ejemplo anterior tenemos un comando if con la condición <cond1> que de cumplirse, habrá de ejecutarse una única instrucción dentro de él: otro comando if.

Debes tener en cuenta que la idea de usar llaves para definir un bloque tiene sentido cuando existen dos o más comandos, sin embargo, no es un error definir un bloque para una sola instrucción. Así que si te sientes más cómodo poniendo bloques alrededor de un comando if de un solo comando puedes hacerlo.

Un ejemplo donde es recomendable usar las llaves aún cuando la condición aplique sobre un solo comando es si vas a definir un comando else luego de dos if anidados. En general, si pones un if dentro de otro y seguidamente pones un else, este aplicará sobre el if más interno. Si deseas darle claridad a tu programa, o si no quieres situaciones imprevistas, usa llaves siempre que pongas if anidados.

El comando switch:

Este comando es una especie de extensión del comando anterior. Se utiliza para poner dos o más condiciones sobre el resultado de una expresión. Veamos una situación de este tipo para explicar mejor su estructura.

Supongamos que hemos desarrollado una evaluación en línea y al momento de mostrar la calificación obtenida por el usuario, queremos mostrar un mensaje distinto para distintos rangos de notas.

Supongamos que las calificaciones son del 1 al 4 y que queremos mostrar los siguientes mensajes:

1: Muy deficiente.

2: Deficiente.

3: Buen trabajo

4: Excelente

Supongamos además que queremos actualizar una variable con un valor lógico que indique si el usuario aprobó el examen o no. Consideraremos aprobado una calificación por encima o igual a 3.

Si deseamos desarrollar este ejemplo usando comandos if, se vería de la siguiente manera:

<?php

  $nota = 3; // Calificación del alumno

  if ($nota == 1){

    $mensaje = “Muy deficiente”;

    $aprobado = false;

  } else {

    if ($nota == 2){

      $mensaje = “Deficiente”;

      $aprobado = false;

    } else {

      if ($nota == 3){

        $mensaje = “Buen trabajo”;

        $aprobado = true;

      } else {

        $mensaje = “Excelente”;

        $aprobado = true;

      }

    }

  }

?>

Ahora bien, el comando switch permite poner una sola vez la expresión (o variable) a evaluar, y definir distintos bloques a ser ejecutados dependiendo del valor obtenido.

Los bloques dentro de un comando switch no se definen del modo tradicional (usando llaves) sino que se delimitan usando el comando break. Veamos la sintaxis:

El comando switch

Descripción:

              Permite evaluar una expresión y definir distintos

              bloques de ejecución.

              Sintaxis:

              switch(<expresión>){

                case <valor1>:

                  <comandos>;

                  break;

                case <valor2>:

                  <comandos>;

                  break;

                …

                default:

                  <comandos>;

              }

              Ejemplo:

              $valor = 5;

              switch($valor){

                case 0:

                  $resultado = "cero";

                  break;

                case 1:

                  $resultado = "uno";

                  break;

                case 2:

                  $resultado = "dos";

                  break;

                default:

                  $resultado = "más de dos";

                  break;

              }

Para ilustrar el uso del comando switch, veamos cómo podríamos reescribir el ejemplo de la evaluación en línea.

<?php

  $nota = 3; // Calificación del alumno

  switch ($nota){

    case 1:

      $mensaje = “Muy deficiente”;

      $aprobado = false;

      break;

    case 2:

      $mensaje = “Deficiente”;

      $aprobado = false;

      break;

    case 3:

      $mensaje = “Buen trabajo”;

      $aprobado = true;

      break;

    case 4:

      $mensaje = “Excelente”;

      $aprobado = true;

      break;

  }

?>

En general, el comando switch evalúa la expresión y "salta" hasta el case correspondiente. Desde allí ejecuta todos los comandos que consigue hasta que llega a un break, momento en el que salta fuera de la estructura.

Sabiendo esto, podemos poner más de un case en el mismo sitio para indicar que uno de los bloques se debe ejecutar por cualquiera de esos valores. Para ilustrar esto, simplifiquemos el ejemplo anterior haciendo que las notas 1 y 2 obtengan el mensaje "No aprobado" y 3 y 4 obtengan "Aprobado".

<?php

  $nota = 3; // Calificación del alumno

  switch ($nota){

    case 1:

    case 2:

      $mensaje = “No aprobado”;

      $aprobado = false;

      break;

    case 3:

    case 4:

      $mensaje = “Aprobado”;

      $aprobado = true;

      break;

  }

?>

Una última consideración es que podemos incluir el caso especial default, el cual habrá de ejecutarse si el valor no se corresponde con ninguna de las categorías.

Estructuras iterativas

Las estructuras iterativas permiten ejecutar uno o más comandos en forma repetida. Existen dos tipos de estas estructuras, las que permiten hacer repeticiones un número predeterminado de veces, y las que ayudan a repetir hasta cumplirse una cierta condición.

El comando for:

Este es uno de los comandos más poderosos y versátiles de la sintaxis tipo "C", de la cual proviene el lenguaje PHP. Básicamente hace las veces de tres comandos distintos en una sola -y muy simple- estructura.

En su forma más básica, el comando for permite hacer las siguientes acciones:

Inicializar una variable en un cierto valor.

Ejecutar una o más instrucciones localizadas dentro de él.

Incrementar el valor de la variable en cuestión.

Comparar el nuevo valor de la variable con un cierto límite superior para detectar si se debe o no repetir el ciclo.

La estructura del comando for es la siguiente:

Comando for

              Descripción:

              Ejecuta un comando o bloque una determinada cantidad de veces.

              Sintaxis:

              for(<inicialización>; <condición>; <incremento>)

                <comando o bloque>;

              Ejemplos:

              // Condicionando una solo línea

              $total = 0;

              for ($i = 1; $i < 12; $i++)

                $total += 1;

              // Condicionando un bloque

              $suma = 0;

              $producto = 1;

              for ($i = 1; $i < 12; $i++){

                $suma += $i;

                $producto *= $i;

              }

Veámoslo con un ejemplo. Supongamos que necesitamos calcular el cubo de un número, es decir, queremos saber el resultado de multiplicar al número por si mismo tres veces. Para ello necesitamos usar tres variables. Una que contenga el número al que tenemos que calcularle el cubo, otra que nos permita calcular el resultado y una más que nos permita llevar la cuenta de las tres multiplicaciones que hay que realizar.

El algoritmo para resolver ese sencillo problema, es más o menos como sigue:

Asignamos un valor a la variable $numero (valor al que le queremos calcular el cubo).

Asignamos un valor inicial a la variable $resultado (como vamos a multiplicar, el valor inicial debe ser 1).

Asignamos un valor inicial a la variable $contador (digamos que empieza en cero y que lo vamos a incrementar luego de cada multiplicación).

Asignamos a la variable $resultado el producto de multiplicar su propio contenido por el $numero.

Incrementamos en 1 el valor de $contador.

Si $contador es menor que 3, entonces repetimos desde el paso 4.

Veamos cómo podemos escribir esto en PHP utilizando el comando for.

<?php

  $numero = 7;

  $resultado = 1;

  for ($contador = 0; $contador < 3; $contador++)

    $resultado *= $numero;

?>

En general, el comando for define en una sola línea, el valor inicial de la cuenta, en cuanto deseamos incrementar ese valor en cada ciclo y cuál es la condición de parada. El primer parámetro, el de la inicialización, se ejecuta de primero, luego se ejecuta el bloque de comandos, después de lo cual se ejecuta el último parámetro para incrementar el valor de la variable de control y por último, se evalúa la condición. Si la condición se cumple, entonces se vuelve a ejecutar el bloque y el incremento. Así funciona.

El comando for es en realidad más poderoso de lo mencionado hasta ahora, ya que al conocer su funcionamiento, podemos utilizar sus tres parámetros para distintos tipos de repeticiones y no solo cuentas, pero por ahora pasemos a revisar otros de los comandos iterativos.

El comando while:

No todas las veces que necesitamos repetir un bloque de código sabemos el número de repeticiones que debemos realizar. De hecho, en la práctica, son muchas las veces que debemos ejecutar una cierta secuencia y evaluar si la misma debe ser repetida o no. Para ello existe el comando while.

La estructura del comando while es como sigue:

El comando while

              Descripción:

              Ejecuta un comando o bloque hasta cumplirse cierta condición.

              Sintaxis:

              while(<condición>)

                <comando o bloque>;

              Ejemplos:

              // Condicionando una solo línea

              $total = 0;

              for ($i = 1; $i < 12; $i++)

                $total += 1;

              // Condicionando un bloque

              $suma = 0;

              $producto = 1;

              for ($i = 1; $i < 12; $i++){

                $suma += $i;

                $producto *= $i;

              }

<?php

  $num = 0;

  $pares = 0;

  $impares = 0;

  while ($num < 100){

    if ($num % 2 == 0)

      $pares++;

    else

      $impares++;

    $num++;

  }

?>

El ejemplo anterior calcula la cantidad de números pares e impares que existen entre 0 y 99.

El comando do while:

Existe una variante del comando anterior que permite hacer siempre una primera iteración, para luego evaluar si es necesario o no repetir el proceso. Es el comando do…while.

Veamos cual es su sintaxis:

La variante “do while”

              Descripción:

              Ejecuta un comando o bloque y repite hasta cumplirse

              cierta condición.

              Sintaxis:

              do

                <comando o bloque>;

              while(<condición>);

              Ejemplos:

              // Condicionando una solo línea

              $total = 0;

              do

              $total++;

              while ($total < 20);

              // Condicionando un bloque

              $n = 0;

              $res = 1;

              do{

              $res += $res * $n;

              $n++;

              } while ($n < 10);

<?php

  $reintentos = 0;

  do{

    // La función hipotética abre_archivo()

    // intenta abrir un cierto archivo y retorna

    // un valor lógico que indica si lo logró

    $exito = abre_archivo();

    if ($exito)

      $reintentos++;

  } while ($reintentos < 3);

?>

Otros tipos de estructuras iterativas

Existen otros tipos de estructuras iterativas más especializadas las cuales facilitan el trabajo con arreglos. Hablaremos de ellas más adelante.

Incluyendo programas en otros programas

PHP ofrece la posibilidad de aislar parte del código en un archivo independiente para luego incluirlo donde y cuando sea necesario. Esta utilidad permite escribir programas mes legibles a la vez hace posible reutilizar las funciones.

Haciendo uso de esta característica, que es una característica de casi cualquier lenguaje de programación, el programador puede agrupar ciertas funciones en librerías, es decir, en grupos que tengan una utilidad común y así incluirlas en todos aquellos archivos donde tales funciones deban ser llamadas.

Los comandos que permiten incluir un archivo dentro de otro son los siguientes:

El comando require

Este comando expande el archivo mencionado como parámetro en la posición donde él se encuentre. Su utilización es de la siguiente manera:

<?php

  require(”Funciones.php”);

?>

El comando require se resuelve al momento de cargar la página, por lo tanto no puede ser condicionado de ninguna manera. Todo lo que incluyamos utilizando require se expande dentro del archivo como si fuese parte de él.

El comando include

Existen ocasiones en las que deseamos incluir parte del código solo si se cumple alguna condición, o tal vez necesitamos incluir una misma secuencia varias veces, o tal vez deseamos armar dinámicamente el nombre del archivo a ser incluido.

Para poder resolver cualquiera de las situaciones anteriores, debemos evitar que el interpretador cargue el archivo automáticamente. Necesitamos primero ejecutar ciertas instrucciones para poder decidir si cargar el archivo, o no cargarlo, o cargarlo repetidas veces. Para eso existe el comando include.

El comando include es similar al anterior, pero se diferencia de éste en cuanto al momento en que es ejecutado. Es decir, el comando require, carga un archivo a ciegas, y lo hace al momento de cargar el archivo principal. El comando include por su parte, espera hasta que el interpretador PHP llegue a la línea donde él se encuentra para incluir el archivo.

La sintaxis de este comando es similar a la del anterior:

<?php

  include(”Funciones.php”);

?>

Las variantes require_once e include_once

Para cualquiera de las dos formas de inclusión de archivos mencionadas, existe un variante que permite evitar la expansión de un mismo archivo más de una vez. Esto podría ser deseable en situaciones en las que se desea cargar una librería que a su vez carga a otras librerías.

Es necesario tener presente que el interpretador generará un error y detendrá la ejecución de un archivo si, por ejemplo, existen dos funciones con el mismo nombre. Cosa que seguramente habrá de ocurrir si se carga dos veces un mismo archivo que contiene funciones.

El uso de las variantes mencionadas es como sigue:

<?php

  include_once(”Funciones1.php”);

  require_once(”Funciones2.php”);

?>

Introducción

En este capítulo te mostramos como escribir tus propias funciones de usuario, las cuales te permitirán hacer programas más compactos y fáciles de mantener.

Al finalizar este capítulo deberías ser capaz de entender parte de la terminología asociada al concepto de programación estructurada, y lo más importante, deberías ser capaz de escribir tus propias funciones de usuario.

Temas desarrollados en este capítulo:

Concepto y utilidad de las funciones de usuario

Uso y sintaxis de una función

Alcance de las variables y parámetros de una función

Tipos de pases de parámetros

Funciones de usuario

En esencia, una función no es más que un fragmento de programa al que, por razones de reusabilidad o de estructura, le asignamos un nombre.

Las funciones de un lenguaje nos permiten simplificar grandemente los problemas complejos, y gracias a ello, podemos escribir soluciones a problemas muy complicados.

En capítulos anteriores hemos visto una cierta cantidad de funciones que el lenguaje trae preparadas para distintos fines. Sin embargo, aún no hemos mencionado la manera en que el usuario puede definir sus propias funciones.

¿Para qué usar funciones?

Uno de los objetivos fundamentales de una función es la reutilización, es decir, la posibilidad de no tener que escribir una secuencia de instrucciones similares una y otra vez.

Una segunda razón –no menos importante- es la llamada “estructuración”. Es decir que mediante la implementación de funciones, podemos dividir la resolución de un problema complejo en partes más simples, de modo que podemos programar, probar y eventualmente integrar esas partes y lograr nuestros objetivos.

Cuando un programa está desarrollado en modo estructurado, es decir, debidamente clasificado y dividido en segmentos básicos, el resultado es mucho más fácil de mantener, ya que dependiendo del tipo de errores que pudiéramos tener, nos será siempre más fácil encontrar el segmento causante de la falla y repararlo.

A medida que desarrollamos aplicaciones más grandes y complejas, la necesidad de estructuración se hace mayor.

Podríamos comparar esto último con la tarea de preparar una comida en una cocina. Si el tamaño de los platos a ser preparados diariamente es pequeño, digamos que para una o dos personas, podrían organizarse todos los utensilios en una simple repisa sin que ello conlleve mayores dificultades. Además, toda la comida puede ser hecha de una sola vez y por una sola persona.

Sin embargo, en una cocina donde se preparen cientos de platos al día, el volumen de utensilios necesarios es de tal magnitud que no pueden ser simplemente apilados en una repisa gigante. Hace falta poder predecir fácilmente donde encontrar cada cosa. Además, al abordar cientos de platos distintos, debemos poder producir –y reutilizar- los componentes básicos como por ejemplo las salsas.

Trabajar estructuradamente no es solamente una buena costumbre. Si lo que se desea producir es de grandes dimensiones, la estructuración es absolutamente una necesidad.

Sintaxis de una función

Toda función de usuario comienza con la palabra function y el nombre de la función. A continuación de esto, encerrados entre paréntesis, aparece la lista de parámetros separados por coma. Luego viene la secuencia de comandos que conforma la función en sí encerrados entre llaves.

Una función puede o no retornar un valor al ser ejecutada. De ser así, debemos asegurarnos de colocar al menos un comando return antes del final de la función. Este comando indica el valor a ser retornado.

Veamos un ejemplo de todo lo anterior.

Supongamos que en uno de nuestros programas necesitamos saber si un número se encuentra incluido o no en un rango dado. Para ello podríamos desarrollar la función en_rango, la cual recibirá tres parámetros, el número a evaluar, el límite mínimo del rango y el límite máximo.

Nuestra función deberá comparar el número pasado como primer parámetro contra los otros dos y determinar si está o no incluido en el rango. Hecho esto, debemos incluir un comando return para devolver el valor lógico correspondiente.

<?php

  function en_rango($val1, $min, $max){

    $res = true;

    if ($val < $min)

      $res = false;

    if ($val > $max)

      $res = false;

    return $res;

  }

?>

Uso de una función

Para llamar a una función debemos simplemente escribir su nombre y poner entre paréntesis los valores con los que deseamos que trabaje, Además, si la función está hecha para retornar un resultado y queremos hacer uso del mismo, sería conveniente almacenar el mismo en una variable o usarlo directamente como condición de algún comando.

Veamos un ejemplo basado en la función definida anteriormente:

<?php

  function en_rango($val1, $min, $max){

    $res = true;

    if ($val < $min)

      $res = false;

    if ($val > $max)

      $res = false;

    return $res;

  }

$calificacion = 8;

  if (en_rango($calificacion, 0, 4))

    echo “Deficiente”;

  else if (en_rango($calificacion, 5, 7))

    echo “Suficiente”;

  else if (en_rango($calificacion, 8, 9))

    echo “Sobresaliente”;

  else

    echo “Excelente”;

?>

Del ejemplo anterior podemos resaltar algunos aspectos:

Aunque la definición de la función está al principio del código, la misma es ignorada por el procesador hasta que se produce una llamada. Es decir que la primera instrucción ejecutable de nuestro ejemplo es la asignación de la variable $calificacion.

Las llamadas a la función en_rango son usadas como condición del comando if. Es decir que dependiendo del valor retornado por la función en cada caso, se ejecutarán o no los comandos correspondientes.

Los parámetros usados en cada llamada pueden ser bien variables, valores explícitos o incluso expresiones más complejas.

Alcance de las variables y parámetros de una función

Los parámetros usados dentro de la definición de una función, llamados también parámetros formales, no existen fuera de la función, es decir: son locales a la misma.

Así mismo, cualquier variable que usemos dentro de una función será también una variable local. Eso quiere decir que si fuera de la función tenemos otra variable con el mismo nombre, PHP considerará a ambas como variables distintas.

Si deseamos hacer uso dentro de una función de una variable que existe en el programa principal, debemos declararla como global dentro de la función. De esta manera el interpretador de PHP podrá saber que nos referimos a la variable externa. Veamos un ejemplo:

<?php

  function saludo($nombreDeUsuario, $titulo){

    global $idioma;

    if ($idioma == ”Español”)

      echo “Buenos días $titulo. $nombreDeUsuario”;

    else

      echo “Good morning $titulo. $nombreDeUsuario”;

  }

$idioma = ”Español”;

  saludo(”Johnny Taylor”, ”Mr”);

?>

Tipos de pases de parámetros

Normalmente los parámetros se usan solo para comunicar valores de inicio a una función, así que las variables que pudieran ser colocadas en la llamada copian sus contenidos en las variables de la función, llamadas parámetros formales.

Si durante el cuerpo de la función el contenido de una de esas variables es cambiado, la variable original que colocamos en la llamada permanecerá inalterada. Es decir, que bajo condiciones normales, la función habrá de trabajar con una copia de los valores que les pasemos. A esto se le llama pase de parámetros por valor.

Sin embargo, ocasionalmente puede ser que necesitemos llamar a una función y nos convenga obtener de vuelta no solo el valor retornado, sino que también queramos que alguno de los parámetros vuelva alterado de una u otra manera. Esto se logra a través del llamado pase de parámetros por referencia.

Hagamos un pequeño cambio sobre nuestra función en_rango para ilustrar el concepto. Supongamos que deseamos que la función no solo retorne un valor lógico como lo hace hasta ahora, sino que deseamos obtener un mensaje que indique la relación del primer parámetro respecto al rango, es decir, si es menor, mayor o está en medio.

<?php

  function en_rango($val1, $min, $max, &$mensaje){

    $res = true;

    $mensaje = ”en rango”;

    if ($val < $min){

      $res = false;

      $mensaje = ”por debajo”;

    } else if ($val > $max){

      $res = false;

      $mensaje = ”por encima”;

    }

    return $res;

  }

$edad = 16;

  if (en_rango($edad, 13, 19, $relacion))

    echo “La edad indicada pertenece al rango de la adolescencia”;

  else

    echo ”La edad indicada está ” . $relacion . ” del rango de la adolescencia”;

?>

En el ejemplo anterior hemos alterado la función para agregar un nuevo parámetro, el cual está precedido por el signo &. Al hacer esto estamos indicando que ese parámetro está pasado por referencia, es decir, que cualquier cambio que se haga internamente sobre el parámetro $mensaje, va a afectar también a la variable $relación. Esto es así porque en este tipo de pase de parámetros no se copia internamente el contenido de una variable sobre una nueva sino que se está usando la misma variable de la llamada.

Si observamos el programa principal, podemos ver que en el texto que se muestra cuando la función retorna FALSE, se utiliza el contenido de la variable $relación, la cual habrá de contener las frases “por encima” o “por debajo”.

Omitiendo parámetros

Hay ocasiones en las que al llamar a una función, usamos casi siempre un cierto valor en alguno de los parámetros. Para estos casos, PHP ofrece la posibilidad de asignar a ese parámetro un valor por defecto.

Cuando una función tiene un valor por defecto en uno de sus parámetros, el usuario tiene la posibilidad de ignorar ese parámetro en la llamada, con lo que la función usará el valor pre asignado. Veamos un ejemplo:

<?php

  function saludo($nombreDeUsuario, $titulo = ”Mr”){

    echo “Buenos días $titulo. $nombreDeUsuario”;

  }

  saludo(”Johnny Taylor”);

  saludo(”Joan Parker”, ”Mss”);

?>

En el ejemplo anterior hemos agregado al parámetro título un valor por defecto: “Mr.”. De esta manera, siempre que llamemos a la función saludo omitiendo el segundo parámetro, la función usará el título por defecto, de lo contrario usará el que le sea enviado.

Es importante resaltar que los parámetros que sean susceptibles a ser omitidos deben estar al final de la función.

Introducción

Aunque todos los lenguajes de programación ofrecen alternativas para manejar arreglos o colecciones de variables, puede decirse sin temor a equivocaciones que el enfoque que PHP hace de los mismos es a la vez uno de los más avanzados y sencillos de usar.

En este capítulo abordamos todo lo relacionado con la definición y manipulación de arreglos, lo cual constituye uno de los puntos fuertes de este versátil lenguaje.

Al finalizar este capítulo esperamos que seas capaz de aprovechar las herramientas que PHP ofrece para facilitar la resolución de problemas utilizando arreglos.

Temas desarrollados en este capítulo:

Concepto de arreglos.

Uso y sintaxis de los arreglos en PHP.

Inicialización de arreglos.

Distintas formas de recorrer arreglos.

Arreglos en PHP

Tal como mencionáramos anteriormente, un arreglo no es más que una colección de variables guardadas bajo un mismo nombre y diferenciadas entre si por un índice. Para hacer una comparación con el mundo físico, podemos pensar que una variable es como una hoja de papel en la que podemos escribir un texto, y un arreglo es un cuaderno donde podemos tener, digamos, sesenta hojas de papel cada una de ellas con su propio texto. Así que todas las operaciones que podemos hacer con nuestra hoja de papel, podemos también hacerlas con –digamos- la página 27 del cuaderno.

Cada casilla –o posición- dentro del arreglo es en sí una variable, y eso quiere decir que puede tener los mismos tipos de contenido que éstas. Eso incluye otros arreglos.

El nombre de un arreglo en PHP es exactamente igual que el nombre de una variable, solamente que para trabajar con una de sus posiciones, debemos indicar el índice usando corchetes.

Pongamos un ejemplo:

Supongamos que tenemos las evaluaciones de tres alumnos y queremos calcular el promedio de notas. Podemos hacerlo con variables normales de la siguiente manera.

<?php

  $alumno1 = 5.3;

  $alumno2 = 8.1;

  $alumno3 = 7.8;

  $suma = $alumno1 + $alumno2 + $alumno3;

  $promedio = ($suma / 3);

?>

El ejemplo anterior es bastante sencillo y fácil de leer, sin embargo no es una buena solución cuando el número de alumnos es alto, o peor aún, cuando no se conoce de antemano el número de alumnos.

Veamos cómo podemos escribir el mismo algoritmo usando arreglos.

<?php

  $alumno[1] = 5.3;

  $alumno[2] = 8.1;

  $alumno[3] = 7.8;

  $suma = 0;

  for ($i = 1; $i <= 3; $i++)

    $suma += $alumno[$i];

  $promedio = ($suma / 3);

?>

Existen muchas funciones que ayudan a trabajar con arreglos. Iremos mencionando muchas de ellas durante este capítulo, sin embargo en este momento conviene mencionar la primera de ellas. La función count(), la cual permite conocer la cantidad de elementos contenidos en un arreglo.

Función count

              Descripción:

Si el parámetro es un arreglo, retornará el número de elementos contenidos en él. De lo contrario retornará 1.

              Sintaxis:

              count(<variable>)

              Retorna:

Número entero que indica el número de elementos contenidos en el arreglo o 1 so el parámetro no es un arreglo.

              Ejemplos:

              $edades[0] = 25;

              $edades[1] = 33;

              $edades[2] = 57;

              $cantidad = count($edades);

              // En el ejemplo anterior, $cantidad tomará el valor

              // de 3.

              $vehiculos[2005] = 820;

              $vehiculos[2006] = 923;

              $vehiculos[2009] = 1320;

              $vehiculos[2011] = 1043;

              $cantidad = count($vehiculos);

              // En el ejemplo anterior, $cantidad tomará el valor

              // de 4.

Tal como se puede ver en los ejemplos anteriores, en PHP un arreglo no tiene un número predefinido de elementos. Es decir, los índices no tienen que comenzar por cero ni por uno, y las posiciones ocupadas no tienen porque ser contiguas.

Más aún, en PHP los índices no tienen porque ser números. Podemos usar textos como índice para nuestros arreglos, cosa que le da un tremendo poder a estas estructuras. Veamos una variación de uno de los ejemplos anteriores para ilustrar esto:

<?php

  $alumno[”Carlos”] = 5.3;

  $alumno[”Pedro”] = 8.1;

  $alumno[”Marcos”] = 7.8;

  $suma = $alumno[”Carlos”] + $alumno[”Pedro”] + $alumno[”Marcos”];

  $promedio = ($suma / 3);

?>

Una facilidad adicional que ofrece PHP para trabajar con arreglos es la posibilidad de omitir los índices a la hora de asignar una nueva posición dentro del arreglo. De esta manera PHP asignará como índice del nuevo valor almacenado, el siguiente al índice más alto existente (o cero si es el primer elemento agregado al arreglo). Veamos un ejemplo:

<?php

  $alumno[] = 5.3; // Equivale a $alumno[0] = 5.3;

  $alumno[] = 8.1; // Equivale a $alumno[1] = 8.1;

  $alumno[] = 7.8; // Equivale a $alumno[2] = 7.8;

?>

Inicializando arreglos

Ya hemos visto como asignar uno a uno los contenidos de un arreglo en PHP, sin embargo existe una alternativa mucho más eficiente, y es asignar todos los elementos simultáneamente, esto lo podemos hacer usando la función array().

Veamos un ejemplo:

<?php

  $alumno = array(5.3, 8.1, 7.8);

?>

La función array también permite definir índices personalizados, es decir que podemos forzar el índice de cualquiera de las posiciones (o de todas ellas) escribiendo los parámetros de la siguiente manera:

<?php

  $alumno = array(”Carlos” => 5.3, ”Pedro” => 8.1, ”Marcos” => 7.8);

?>

En el ejemplo anterior tenemos igualmente tres parámetros separados por comas, sin embargo, en cada parámetro estamos indicando el índice y luego el contenido. El resultado es nuevamente un arreglo de tres posiciones, que contiene los mismos tres valores que en el ejemplo previo, pero en lugar de tener los índices 0, 1 y 2, ahora tiene los índices “Carlos”, “Pedro” y “Marcos”.

Función array

              Descripción:

              Retorna un arreglo que contiene tantos elementos

              como parámetros tenga la función.

              Sintaxis:

              array([<indice> => ]<valor>, [<indice> => ]<valor>, …)

              Retorna:

              Arreglo conformado por los elementos indicados como

              parámetros.

              Ejemplos:

              $precios = array(25, 33, 57);

              $personas = array(“México”, “Colombia”, “Chile”);

              $edades = array(“Juan” => 24, “Andrea” => 31);

Recorriendo arreglos

Los arreglos en PHP son sumamente flexibles, pueden tener múltiples dimensiones, pueden tener distintos tipos de contenido, los índices pueden ser secuenciales y generados automáticamente o pueden ser textos seleccionados a nuestra conveniencia.

Para poder manejar toda esa variedad de arreglos, PHP ofrece una amplia variedad de estructuras de control. No existe una estructura de control en PHP que sea la mejor opción para recorrer cualquier tipo de arreglos. Dependiendo del tipo de problema y de la estructura del arreglo en sí mismo, podrías necesitar una u otra. Así que estar familiarizado con varias es sin dudas la mejor decisión.

Recorriendo arreglos secuenciales

a) Usando un comando tipo while

Supongamos que tenemos una lista de calificaciones por alumno y deseamos calcular la calificación promedio. Para ello necesitamos recorrer cada posición del arreglo e ir sumando cada calificación para al final dividir esa suma entre el número de alumnos.

El arreglo que vamos a utilizar es el siguiente:

<?php

  $notas[] = 7.8;

  $notas[] = 5.0;

  $notas[] = 8.1;

  $notas[] = 6.6;

  $notas[] = 9.3;

  $notas[] = 3.8;

?>

Necesitamos una variable en la cual guardar la suma total y otra para saber en cada paso en que índice estamos. Para conocer el total de elementos guardados en el arreglo, podemos usar la función count.

<?php

  $suma = 0;

  $promedio = 0;

  $i = 0;

  while ($i++ < count($notas))

    $suma += $notas[$i];

  if (count($notas))

    $promedio = $suma / count($notas);

?>

Debemos tener siempre presente que una división por cero genera un error. Por lo tanto es conveniente que antes de una división, si el denominador es sensible de ser cero, preguntemos por su contenido y efectuemos la operación solo si no lo es.

b) Usando un comando tipo for

El mismo ejemplo anterior puede ser escrito más fácilmente con ayuda de un comando for, el cual ya hemos estudiado anteriormente.

<?php

  $suma = 0;

  $promedio = 0;

  $i = 0;

  for ($i = 0; $i < count($notas); $i++)

    $suma += $notas[$i];

  if (count($notas))

    $promedio = $suma / count($notas);

?>

Recorriendo arreglos no secuenciales

En general, las estructuras de control que mencionaremos para recorrer arreglos no secuenciales, pueden ser usadas en cualquier tipo de arreglos. Sin embargo el caso contrario no siempre es cierto. Es decir, los comandos while y for no siempre pueden ser usados por si solos si no se conocen de antemano los índices o si los mismos no son secuenciales.

a)      Usando un comando tipo foreach

Este tipo de comando permite recorrer todos los elementos de un arreglo, almacenando en cada iteración el valor corriente y el índice corriente en un par de variables. Veamos cómo es su sintaxis.

Función foreach

Descripción:

Recorre cada uno de los elementos que conforman un arreglo.

              Sintaxis:

              -- obteniendo solo el contenido

foreach(<arreglo> as <contenido>)

  <comando o bloque>;

              -- obteniendo el índice y el contenido

foreach(<arreglo> as <indice> => <contenido>)

  <comando o bloque>;

Ejemplos:

$notas = array(“Juan” => 6, “Leo” => 7, “Jose” => 8);

foreach($notas as $nota){

$acumulado += $nota;

}

$notas = array(“Juan” => 6, “Leo” => 7, “Jose” => 8);

$maximo = 0;

$mejor = “”;

foreach($notas as $alumno => $nota)

b)      Usando las funciones list(), each() y reset()

Existe una característica especial de los arreglos en PHP que permite utilizarlos como si se tratara de bases de datos. Esto es posible porque el lenguaje guarda dentro del arreglo la posición corriente.

Este concepto de posición corriente dentro de un arreglo no tiene ninguna relación con acceder a los contenidos a través de índices. Siempre podemos asignar o ir directamente a cualquier posición de un arreglo si indicamos la posición exacta usando un índice. Pero existen ciertas funciones en PHP que “recuerdan” el último elemento visitado y nos permiten conocer un contenido a la vez, e incluso avisarnos cuando llegamos al final del arreglo.

Una de esas alternativas es la que presentamos a continuación. Consiste de tres funciones que, combinadas con el comando while, permiten recorrer un elemento a la vez. Tales funciones son:

Función each

              Descripción

              Cada vez que esta función es llamada con el mismo arreglo como parámetro retorna un par de valores: el índice corriente y el contenido corriente. Si el arreglo en cuestión ya ha sido recorrido en su totalidad, la función retorna falso.

              Sintaxis:

              each(<arreglo>)

Función list

              Descripción

              Expone una serie de variables para ser asignadas de una sola vez a partir de un arreglo.

              Sintaxis:

              list(<var1>, <var2>, …) = array(<val1>, <val2>, …);

Función reset

              Descripción

              Prepara un arreglo para ser recorrido desde el primer elemento.

              Sintaxis:

              reset(<arreglo>);

Veamos como recorrer un arreglo usando estas funciones usando el mismo ejemplo de los casos anteriores:

<?php

  $notas[] = 7.8;

  $notas[] = 5.0;

  $notas[] = 8.1;

  $notas[] = 6.6;

  $notas[] = 9.3;

  $notas[] = 3.8;

  $suma = 0;

  $promedio = 0;

  reset($notas);

  while (list($indice, $valor) = each($notas))

    $suma += $valor;

  if (count($notas))

    $promedio = $suma / count($notas);

?>

Veamos cómo funciona:

El comando reset aplicado sobre el arreglo $notas prepara este último para ser recorrido desde el principio. Si bien en este caso no es necesario aplicarlo ya que todo arreglo que no ha sido  movido se encuentra posicionado en el principio de sí mismo, su utilización permite prevenir que el programa deje de funcionar en caso de que un recorrido similar sea aplicado anteriormente.

En la primera iteración, el comando each retorna un arreglo de dos posiciones que contienen el primer índice y el primer contenido del arreglo $notas. Es decir que retorna un arreglo con dos valores, cero y 7.8.

Estos dos valores son asignados a las variables $indice y $valor gracias a la función list(). Ambas variables serán usadas dentro del ciclo.

Como la función each retornó algo distinto de falso, entonces el comando while procede a ejecutar el cálculo correspondiente.

En la segunda iteración, la función each retornará nuevamente un arreglo de dos posiciones, esta vez formado por un uno y un 5.0.

Estos dos valores son nuevamente asignados a las variables $indice y $valor.

De nuevo, como la función each retornó algo distinto de falso, entonces el comando while procede a ejecutar el cálculo.

La secuencia anterior habrá de repetirse hasta llegar al último elemento, luego del cual la función each retornará falso y el comando while se detendrá.

c)       Usando las funciones next() o prev() y current()

Al igual que en el caso anterior, estas funciones se basan en el manejo de arreglos como si fuesen bases de datos. Veamos que hace cada una de ellas.

Función next

              Descripción

Avanza la posición corriente del arreglo que es pasado como parámetro. Retorna verdadero en caso de que la operación sea exitosa y falso en caso de no existir más elementos.

              Sintaxis:

              next(<arreglo>)

Función prev

              Descripción

Retrocede la posición corriente del arreglo que es pasado como parámetro. Retorna verdadero en caso de que la operación sea exitosa y falso en caso de no haber ningún elemento anterior.

              Sintaxis:

              prev(<arreglo>)

Función current

              Descripción

Retorna el elemento corriente dentro del arreglo pasado como parámetro.

              Sintaxis:

              $elemento = current(<arreglo>);

Volvamos al ejemplo anterior y veamos cómo podemos escribirlo usando next() y current().

<?php

  $notas[] = 7.8;

  $notas[] = 5.0;

  $notas[] = 8.1;

  $notas[] = 6.6;

  $notas[] = 9.3;

  $notas[] = 3.8;

  $suma = 0;

  $promedio = 0;

  reset($notas);

  do{

    $suma += current($notas);

  } while (next($notas));

  if (count($notas))

    $promedio = $suma / count($notas);

?>

Dado que el comando next() avanza a la siguiente posición, no podemos usar un ciclo while normal, ya que si ponemos next() en la condición, habremos avanzado a la segunda posición antes de haber pasado por el ciclo la primera vez. Por ello hemos usado un ciclo del tipo “do…while”, que nos permite avanzar luego del cálculo del primer elemento.

El problema que tenemos con una solución como esta es que debemos estar seguros de que existe al menos un elemento que procesar, ya que el “do while” nos deja pasar libremente la primera vez y solo verifica al final si existe o no un nuevo elemento.

Modifiquemos entonces el ejemplo para evitar que falle si el arreglo está vacío:

<?php

  $notas[] = 7.8;

  $notas[] = 5.0;

  $notas[] = 8.1;

  $notas[] = 6.6;

  $notas[] = 9.3;

  $notas[] = 3.8;

  $suma = 0;

  $promedio = 0;

  if (count($notas)){

    reset($notas);

    do{

      $suma += current($notas);

    } while (next($notas));

    $promedio = $suma / count($notas);

  }

?>

Introducción

En este capítulo te nos adentramos en el manejo de las cadenas de caracteres, también conocidas como strings, las cuales constituyen sin lugar a dudas el tipo de datos más utilizado en PHP, ya que el objetivo principal del lenguaje es la producción u alteración de textos en HTML.

Al finalizar este capítulo tendrás conocimiento de una amplia colección de nuevos operadores y funciones ofrecidos por el lenguaje para facilitar el trabajo con textos.

Temas desarrollados en este capítulo:

Concepto y utilización de las cadenas de caracteres en PHP.

Operadores de asignación, concatenación y comparación.

Funciones para el manejo de textos.

Formas simplificadas de concatenar textos.

Trabajando con textos

Uno de los principales tipos de dato en todo lenguaje de programación es el llamado tipo texto (o string), el cual puede ser encontrado en la literatura bajo el nombre de “cadenas de caracteres”, o también “cadenas de texto”.

Una cadena de caracteres, como su nombre lo indica, no es otra cosa que una secuencia de letras, números o caracteres especiales: una frase. Puede ser tan pequeña como para no contener carácter alguno, o tan simple como para contener una palabra cualquiera, o puede llegar a ser un largo texto conteniendo palabras, signos de puntuación y otros tipos de caracteres especiales.

Las cadenas de caracteres pueden ser asignadas directamente a variables PHP para realizar operaciones, o pueden ser escritas sobre el programa que se está generando. Ya veremos cómo hacer ambas cosas.

Las fronteras entre los tipos de dato en PHP no son del todo rígidas. Esto quiere decir que si una variable contiene un número –por ejemplo- y se desea tratar ese valor como si fuese un texto, el lenguaje permitirá hacerlo. Es decir, que el lenguaje permite hacer un cierto cálculo con números y luego incluir el resultado dentro de una cadena de caracteres para presentarlo por pantalla sin necesidad de estar haciendo conversiones de tipo.

Operadores de asignación y concatenación

Para trabajar con textos, PHP ofrece algunos operadores comunes y una gran cantidad de funciones. Los operadores más básicos, y a la vez los más usados, son los que permiten las operaciones de asignación y concatenación. Veamos la sintaxis de cada uno de ellos:

Operador de asignación

              Descripción

              Usado para asignar un valor a una variable.

              Sintaxis:

              <variable> = <expresión>;

              Ejemplo:

              $nombre = “Andrea”;

Operador de concatenación

              Descripción

              Usado para pegar un valor a continuación de otro.

              Sintaxis:

              <variable> = <texto> . <texto>;

              Ejemplo:

              $nombre = “Andrea” . “ “ . “Martinez”;

El uso de los dos operadores anteriores es bastante evidente, sin embargo, veamos un pequeño ejemplo para ilustrar su uso:

<?php

  $a = ”Cadena”;

  $b = ”larga”;

  $c = $a . $b;

  echo $c; // Escribe el texto: CadenaLarga

  $c = $a . “Mas” . $b;

  echo $c; // Escribe el texto: CadenaMasLarga

?>

Los dos operadores anteriores pueden ser combinados en uno solo, el cual permite asignar sobre una variable su propio contenido, concatenado al final con otro texto. Veamos la ficha de este nuevo operador:

Operador de concatenación y asignación

              Descripción:

Asigna a una variable el resultado de asignar el valor de ella misma concatenado con otro valor.

              Sintaxis:

              <variable> .= <texto>;

              Ejemplo:

              $nombre = “Andrea”;

              $nombre .= “ “;

              $nombre .= “Martinez”;

Ahora veámoslo en acción:

<?php

  $a = ”Cadena”;

  $b = ”larga”;

  $c = $a;        // Inicializa la variable con el contenido de $a

  $c .= ”Mas”; // Asigna el propio contenido seguido del texto ”Mas”

  $c .= $b;       // Asigna el propio contenido seguido del contenido de $c

  echo $c;       // Escribe el texto: CadenaMasLarga

?>

En pocas palabras, el operador descrito anteriormente “acumula” información al final de la variable sobre la que se está asignando.

Comparando cadenas de caracteres

Una de las operaciones más simples y frecuentes en el manejo de textos es la comparación. Mediante ella podemos saber si una variable contiene un texto determinado o si dos variables, por ejemplo, contienen el mismo texto. Veamos los operadores de comparación que el lenguaje nos ofrece:

Operador de comparación de igualdad

Descripción:

Compara dos valores e indica si son iguales

Sintaxis:

<texto> == <texto>;

Ejemplos:

$nombre1 = “Andrea”;

$nombre2 = “Andreina“;

if ($nombre1 == $nombre2)

  echo “igual contenido”;

else

  echo “Distinto contenido”;

if ($nombre1 == “Andrea”)

  echo “Nombre1 es Andrea”;

else

  echo “Nombre1 no es Andrea”;

Operador de comparación de desigualdad

Descripción:

Compara dos valores e indica si son diferentes

Sintaxis:

<texto> != <texto>;

Ejemplo:

$nombre1 = “Andrea”;

$nombre2 = “Andreina“;

if ($nombre1 != $nombre2)

  echo “Distinto contenido”;

else

  echo “Igual contenido”;

Siempre que se usen los operadores anteriores, estaremos comparando contenidos de variables sin importar el tipo de dato. Esto quiere decir que si una variable contiene un número y la otra contiene el mismo número pero como texto, es decir, encerrado en comillas, ambos valores serán considerados como iguales.

Sin embargo, hay momentos en los que deseamos saber si dos variables –por ejemplo- contienen no solamente el mismo valor, sino además queremos saber si los tipos de las variables son iguales. Para ello se han creado un par de operadores adicionales. Veamos cuales son:

Operador de comparación de exactitud

Descripción:

Compara dos valores e indica si son iguales y del

mismo tipo

Sintaxis:

<texto> === <texto>;

Ejemplo:

$valor1 = “5”;

$valor2 = 5;

if ($valor1 === $valor2)

  echo “igual contenido e igual tipo”;

else

  echo “Distinto contenido o tipos distintos”;

Operador de comparación de no exactitud

Descripción:

Compara dos valores e indica si son distintos o de

distinto tipo

Sintaxis:

<texto> !== <texto>;

Ejemplo:

$valor1 = “5”;

$valor2 = 5;

if ($valor1 !== $valor2)

  echo “Distinto contenido o tipos distintos”;

else

  echo “igual contenido e igual tipo”;

Funciones para el manejo de textos

El trabajo con cadenas de texto suele ocupar un porcentaje importante de toda aplicación Web, y como podemos suponer, no mucho se puede lograr usando solo operadores de concatenación, asignación y comparación. Por eso PHP ha incluido un robusto número de funciones que permiten hacer una gran variedad de operaciones con textos con relativamente poco trabajo. Veamos algunas de estas funciones:

Función strlen

              Descripción:

              Retorna el largo de un texto.

              Sintaxis:

              strlen(<texto>)

              Retorna:

Retorna el largo del texto que le es pasado como parámetro. En caso de que el texto esté vacío retorna cero.

              Ejemplos:

$largo = strlen(“abcdefg”); // Retorna 7

$largo = strlen(“”);        // Retorna 0

Función substr

              Descripción:

Retorna una porción del texto colocado como primer parámetro de acuerdo a la posición y extensión indicadas en los siguientes parámetros.

              Sintaxis:

              substr(<texto>, <inicio>[, <largo>])

              Retorna:

Retorna la porción de <texto> que comienza a partir del carácter <inicio> y cuya extensión viene dada por el parámetro <largo>.

Si el tercer parámetro es omitido, entonces el substring retornado será igual a todos los caracteres de la cadena original a partir de la posición indicada en el segundo parámetro.

Si el primer parámetro es un arreglo, entonces la función retorna NULL.

              Ejemplos:

$hora = “10:25:37”;

$h = substr($hora, 0, 2);

$m = substr($hora, 3, 2);

$s = substr($hora, 6);

Función strpos

              Descripción:

              Retorna la posición de un texto dentro de otro texto.

              Sintaxis:

              strpos(<texto>, <subtexto>[, <comienzo>])

              Retorna:

Retorna la posición de la primera aparición de <subtexto> dentro de <texto>.

Si el tercer parámetro es especificado, entonces la búsqueda se realizará a partir del carácter que ocupe la posición indicada en él.

Si el subtexto no es encontrado dentro de texto, entonces el valor lógico FALSE será retornado.

Es conveniente tener en cuenta que en PHP el número 0 y el valor lógico FALSE pueden resultar iguales en una comparación simple. Así que si deseamos saber si un texto aparece dentro de otro, debemos preguntar si el resultado es “no identico” a falso (usando el operador !== en lugar de !=).

              Ejemplo:

$texto1 = “abcdefghijk”;

$texto2 = “123”;

if (strpos($texto1, $texto2) !== FALSE)

  echo “El texto1 contiene texto2”;

else

  echo “El texto1 NO contiene texto2”;

Función strtoupper

              Descripción:

Retorna un texto donde todos los caracteres alfabéticos han sido convertidos a mayúsculas.

              Sintaxis:

              strtoupper(<texto>)

              Retorna:

Retorna el mismo <texto> pasado como parámetro pero  con todos los caracteres alfabéticos convertidos a mayúsculas.

              Ejemplo:

$texto1 = “Abc123*def”;

echo strtoupper($texto1); // Escribe ABC123*DEF

Función strtolower

              Descripción:

Retorna un texto donde todos los caracteres alfabéticos han sido convertidos a minúsculas.

              Sintaxis:

              strtolower(<texto>)

              Retorna:

Retorna el mismo <texto> pasado como parámetro pero  con todos los caracteres alfabéticos convertidos a minúsculas.

              Ejemplo:

$texto1 = “ABC123*Def”;

echo strtolower($texto1); // Escribe abc123*def

Función trim

              Descripción:

Retorna el texto pasado como parámetro removiendo de él todos los espacios en blanco del principio y del final.

              Sintaxis:

              trim(<texto>)

              Retorna:

Retorna el mismo <texto> eliminando de él todos los espacios al principio y al final. Los espacios contenidos entre las palabras del texto son respetados.

              Ejemplo:

$texto1 = “   Esto es   un ejemplo   ”;

echo trim($texto1);// Escribe “Esto es   un ejemplo”

Función str_replace

              Descripción:

Busca dentro de un texto las apariciones de un subtexto y las reemplaza por otro subtexto.

              Sintaxis:

              str_replace(<texto>, <buscar>, <reemplazar>[,

              <cuenta>)

              Retorna:

Retorna el resultado de reemplazar dentro de <texto> todas las apariciones de <buscar> y reemplazarlas por <reemplazar>.

Si el último parámetro es especificado, entonces solo realizará el reemplazo esa cantidad de veces.

              Ejemplos:

$texto1 = “esto es un subtexto”;

echo str_replace($texto1, “sub”, “pre”);

// Retorna “Esto es un pretexto”

echo str_replace($texto1, “s”, “S”, 2);

// Retorna “ESto eS un Subtexto”

Variables auto expansivas

Cuando abordábamos el tema de los atributos de las etiquetas en HTML, mencionamos la conveniencia de utilizar las comillas simples en ese lenguaje ya que las comillas dobles presentaban ventajas al ser usadas en PHP. Es hora de volver sobre ese punto.

Uno de los atajos implementados por PHP para el trabajo con textos es la posibilidad de incrustar el contenido de una variable dentro de una cadena de caracteres. Veamos de que estamos hablando.

Supongamos que tenemos tres variables, una de ellas contiene el nombre completo del usuario, otra la fecha y una última la hora actual. Supongamos también que queremos mostrar al usuario una especie de  saludo que incluya todos esos valores. Podríamos hacerlo de la siguiente manera:

<?php

  $usuario = ”Carlos Tejera”;

  $fecha = ”Martes 15 de Agosto de 2011”;

  $hora = ”4:25pm”;

  $saludo = ”Hola <b>” . $usuario;

  $saludo .= ”</b>, hoy es ” . $fecha;

  $saludo .= ” y son las ” . $hora;

  echo $saludo;

?>

El anterior ejemplo produciría una cadena de caracteres como la siguiente:

Hola Carlos Tejera, hoy es martes 15 de agosto de 2011 y son las 4:25pm

Cuando un texto está encerrado entre comillas dobles en PHP, las variables colocadas en su interior se auto expanden. Eso quiere decir que podemos incluir variables completas dentro de los textos entrecomillados y las mismas habrán de expandirse. Este sencillo truco puede en ciertas ocasiones reducir muchas líneas de código.

Veamos cómo podríamos reescribir el ejemplo anterior teniendo en cuenta lo que acabamos de explicar:

<?php

  $usuario = ”Carlos Tejera”;

  $fecha = ”Martes 15 de Agosto de 2011”;

  $hora = ”4:25pm”;

  $saludo = ”Hola <b>$usuario</b>, hoy es $fecha y son las $hora”;

  echo $saludo;

?>

Es importante recalcar el hecho de que lo indicado anteriormente funciona solamente cuando se utilizan comillas dobles.

Introducción

En este capítulo abordamos uno de los aspectos más importantes de la programación Web del lado del servidor, el manejo de bases de datos.

Debido a que la audiencia para la que está dirigido este libro no necesariamente está familiarizada con el concepto y uso de bases de datos, nos hemos dado a la tarea de incluir una introducción bastante básica tanto del lenguaje SQL como del concepto y  aspectos generales de la programación con bases de datos.

Al finalizar este capítulo podrás hacer páginas Web en PHP que sean capaces de mostrar y manipular información contenida en bases de datos.

Si has trabajado antes con bases de datos, puedes ir directamente hasta la sección “Trabajando con bases de datos desde PHP”.

Temas desarrollados en este capítulo:

Definición y ejemplo práctico de base de datos

Criterios para seleccionar una buena base de datos

Arquitectura de una aplicación Web con base de datos

Introducción al lenguaje SQL

Aspectos generales del trabajo con bases de datos desde PHP

Funciones PHP para trabajar con MySQL

¿Qué es una base de datos?

Una base de datos es un conjunto de información, usualmente relacionada alrededor de un cierto tópico, almacenada de un modo tal que permite realizar distintas consultas sobre ella eficientemente.

La mejor manera de comprender lo que es una base de datos es a través de una alegoría.

Imaginemos por un momento una mesa en una oficina administrativa de una universidad donde se han dispuesto un conjunto de planillas con los datos de los estudiantes inscritos, otro conjunto de planillas con los datos de los profesores, uno más con los horarios de clase, las calificaciones de cada uno de los alumnos, la disposición de las aulas, en general, toda la información necesaria para controlar y administrar el funcionamiento de la universidad.

Imaginemos también diferentes grupos de personas queriendo hacer modificaciones o consultas sobre esa información. Profesores actualizando notas, alumnos consultando las mismas, personal directivo haciendo mediciones estadísticas y personal administrativo realizando nuevas inscripciones.

Si deseamos que todo funcione manualmente, necesitaríamos contratar a varias personas para administrar los datos de tales planillas. Estos funcionarios se encargarían  de buscar los datos solicitados, modificar datos cuando les sea solicitado, incluir información nueva, todo esto mientras resuelven problemas básicos como no escribir en una planilla que otro esté modificando, permitir consultas múltiples, garantizar que solo las personas autorizadas puedan acceder al nivel de información que le es permitido y todo esto de la manera más rápida y segura posible.

Una base de datos no es más que el conjunto de información dispuesta sobre nuestra hipotética mesa.

Un Sistema Manejador de Bases de Datos, sería equivalente al personal alrededor de la mesa, más el conjunto de protocolos, acuerdos y procedimientos que ellos tienen para trabajar de la mejor manera posible.

Cada vez que hablamos de algo como Oracle, MySQL, SQL Server, etcétera, estamos hablando de Sistemas Manejadores de Bases de Datos Relacionales, comúnmente llamados RDBMS. Cada uno de ellos, nos permite crear y administrar una o más bases de datos para trabajar distintos sistemas. Todos ellos tienen sus propias características, sus debilidades y sus fortalezas.

Cómo escoger una base de datos

En la actualidad existe una gran cantidad de bases de datos con diversas características, las hay desde las muy caras hasta las gratuitas, desde las que requieren un servidor para ellas solas hasta las que funcionan en cualquier computador personal, desde las que sirven para calcular estadísticas mundiales hasta las personales.

No existe tal cosa como “la mejor base de datos”. Cada problema tiene sus propias características y en base a ellas existirá una base de datos apropiada. Lo importante es evaluar correctamente las necesidades para llegar a una buena opción.

Entre los criterios que normalmente se evalúan a la hora de seleccionar una base de datos están los siguientes:

Sistema operativo: No todas las bases de datos funcionan sobre cualquier sistema operativo, así que a la hora de hacer tu selección, debes tomar en cuenta las opciones disponibles según el S.O. en el que deseas trabajar.

Cantidad de usuarios: si deseas desarrollar una aplicación que funcione en red con varios usuarios conectados simultáneamente, o si deseas hacer una aplicación Web en la que solo PHP acceda a la base de datos sin importar la cantidad de gente navegando en ella, o si solo deseas hacer una aplicación personal, deberás escoger un tipo distinto de base de datos.

Velocidad: Dependiendo del volumen de datos, de la cantidad de usuarios simultáneos e inclusive las características del equipo en el que funcione, existirán bases de datos más capacitadas que otras.

Facilidad de administración: Según el tipo de base de datos con el que desees trabajar, pudiera ser que necesites realizar frecuentemente labores de soporte, así que evalúa si cuentas con personal especializado para hacer el mantenimiento, o si puedes pagar a un tercero para que haga ese trabajo, o si deseas aprender y llevar esa carga por ti mismo.

Escalabilidad: Debes tener en cuenta que la base de datos que selecciones no solo sea capaz de manejar el volumen de información y el uso inicial de la aplicación, también sería bueno estimar el crecimiento esperado a corto y mediano plazo para determinar si la elección habrá de soportar la carga o no.

Precio: Normalmente este aspecto es el único evaluado por muchos usuarios a la hora de hacer su selección. Lo ideal es dejarlo para el final y elegir la opción más económica dentro de las que cumplan con todos los requerimientos anteriores y no al revés.

En general podemos decir que las bases de dato comerciales más usadas para grandes aplicaciones son Oracle y MS SQL Server, ambas son capaces de manejar grandes volúmenes de información, muchas conexiones simultaneas, son costosas y requieren mantenimiento especializado.

En cuanto a las bases de datos personales, es decir, para hacer aplicaciones sencillas de un solo usuario en un solo equipo, existen soluciones como Access.

Para aplicaciones basadas en Internet con volúmenes pequeños o moderados de información, la solución más usada en MySQL, entre otras cosas por ser gratuito.

Arquitectura de una aplicación Web con base de datos

En el diagrama mostrado a continuación podemos ver los tres niveles de ejecución de los que consta una aplicación Web que utilice bases de datos.

En el lado izquierdo está representado el usuario final, el cual utiliza un navegador para ver una página Web en HTML.

En el centro tenemos al servidor Web, Apache en nuestro caso, el cual se encarga de despachar al usuario las páginas solicitadas y de mandar a pre procesar cualquier código servidor (como PHP) que ellas pudieran tener.

Finalmente, en el lado derecho tenemos la base de datos, la cual funciona también como un servidor especializado capaz de responder a solicitudes hechas desde el código PHP.

El lenguaje SQL

Una de las características de la mayoría de las llamadas bases de datos relacionales, es la posibilidad de acceder a ellas utilizando un lenguaje de bases de datos llamado SQL. Mediante ese sencillo, pero poderoso lenguaje podemos insertar, eliminar, modificar o solicitar contenidos de una base de datos.

Aunque el lenguaje SQL pretende ser un estándar, en la práctica habremos de conseguir pequeñas variaciones en la implementación que cada base de datos hace de él.

El objetivo de este libro no es enseñar el uso del lenguaje SQL, sin embargo, haremos un pequeño recuento de los cuatro comandos principales del lenguaje para luego poder hablar del modo en que los mismos pueden ser ejecutados desde PHP.

Si ya estás familiarizado con el lenguaje SQL, tal vez desees ir directamente a la siguiente sección.

Para ilustrar el uso de los distintos comandos SQL, imaginemos una pequeña base de datos tipo inventario constituida por dos tablas:

Tabla de productos,  la cual incluye los siguientes campos:

Código: Indica el código único del producto.

Nombre: Indica el nombre completo del producto.

Descripción: Indica de un modo un tanto más amplio las características del producto.

Tabla de Inventario, incluye las cantidades existentes por producto, sus campos son:

Código de Producto: Contiene alguno de los valores de la tabla anterior.

Cantidad: Existencia del producto.

El comando INSERT:

Mediante el comando INSERT de SQL podemos agregar registros en una tabla. La sintaxis es la siguiente:

INSERT INTO <tabla> (<lista_de_campos>) VALUES (<lista_de_valores>);

Donde:

<tabla> es el nombre de la tabla sobre la cual deseamos insertar el registro.

<lista_de_campos> corresponde a una lista de los nombres físicos de los campos sobre los que se va a insertar información, separados por coma.

<lista_de_valores> es una lista con la misma cantidad de elementos que la lista anterior, en la que se colocan uno a uno todos los valores a insertar en cada campo de la otra lista.

Es importante mencionar que al insertar un registro en una tabla, no es necesario darle un valor a todos y cada uno de los campos de la tabla.

Tomando como referencia una de las tablas mencionadas anteriormente, podríamos escribir algunos ejemplos:

Insert into productos (codigo, nombre) values (1, ‘Azúcar refinada’);

Insert into productos (codigo, nombre) values (2, ‘Leche completa en polvo’);

Insert into productos (codigo, nombre) values (3, ‘Café molido’);

Nótese que los valores para el campo código están puestos directamente y los de nombre están entre comillas. Esto se debe a que el campo código es numérico y el otro alfabético.

El comando DELETE:

Tal como su nombre lo indica, el comando DELETE de SQL elimina uno o más registros de una base de datos según una condición. Su sintaxis es como sigue:

DELETE FROM <tabla> WHERE <condición>;

Donde:

<tabla> es el nombre de la tabla a la que se le va a eliminar uno o más registros.

<condición> es una característica que indica el tipo de elementos que debe ser borrado. En caso de omitirse por completo la condición, se procederá a eliminar todos los registros.

Volviendo al ejemplo de nuestra tabla de productos podríamos escribir algo como lo siguiente:

Delete from productos where codigo = 2;

El comando anterior elimina específicamente el registro cuyo código es igual a 2.

Delete from productos where codigo > 5 and codigo < 22;

El comando anterior elimina todos los registros cuyos códigos sean mayores a cinco y menores a 22.

El comando UPDATE:

Este comando permite modificar cualquier campo de cualquier registro, bien sea individualmente o en forma masiva mediante una condición. Su sintaxis es la siguiente:

UPDATE <tabla> SET <lista_de_asignaciones> WHERE <condición>;

Donde:

<tabla> es el nombre de la tabla sobre la que se desea hacer la modificación.

<lista_de_asignaciones> es, como cabe esperar, una lista de asignaciones de valores sobre campos de la tabla separados por coma.

<condición> es una característica que indica el tipo de elementos que debe ser modificado. En caso de omitirse por completo la condición, se procederá a modificar todos los registros.

Veamos un ejemplo:

update productos set nombre = “Azucar refinada iportada” where codigo = 1;

El comando anterior alterará el campo nombre de todos aquellos registros que cumplan la condición mencionada.

El comando SELECT:

Este comando es el utilizado para extraer información desde una base de datos. Es un comando simple y a la vez muy poderoso. Comenzaremos estudiándolo en su forma más simple e iremos haciendo ejemplos cada vez más complicados para familiarizarnos con su funcionalidad.

A diferencia de los comandos anteriores, los cuales ejecutaban órdenes sobre la base de datos, este último habrá de traer de vuelta un conjunto de registros para su manipulación. Por ahora solo hablaremos de las distintas maneras que el comando nos ofrece para traer esa información. No vamos a ocuparnos sobre como recibir, almacenar o manipular esos datos. Eso habremos de tratarlo más adelante.

Una vez más recordamos que el objetivo de este libro no es aprender SQL. Si deseas adquirir destreza en este lenguaje de bases de datos, deberás buscar información en bibliografía más especializada.

Comencemos viendo la sintaxis del uso más básico de un comando SELECT.

SELECT <lista_de_campos> FROM <tabla>;

Donde:

<lista_de_campos> es una serie de nombres de campos separados por coma. También podemos reemplazar la lista por un asterisco, en cuyo caso el comando traerá de vuelta todas las columnas de la tabla.

<tabla> es el nombre de la tabla de la que deseamos extraer información.

Para ver cómo funciona, veamos un par de ejemplos:

Select * from productos;

El comando anterior traerá todos los campos de todos registros de la tabla de productos, es decir que traerá la tabla completa. Si la tabla en cuestión posee mucha información, entonces usar el comando SELECT de esa manera quizás no sea una buena idea.

Select nombre from productos;

En este otro comando estamos solicitando únicamente todos los valores del campo nombre de la tabla de productos.

Usando SELECT con WHERE:

Utilizar el comando SELECT sin ninguna condición no es práctico cuando la tabla que se desea consultar tiene muchos registros. En esos casos podemos usar la cláusula WHERE de la siguiente manera:

SELECT <lista_de_campos> FROM <tabla> WHERE <condición>;

Donde:

<condición> se refiere al filtro que deben cumplir los registros que deseamos obtener.

Veamos un ejemplo sencillo:

Select nombre from productos where codigo < 5;

Como seguramente habrás adivinado, en el ejemplo anterior solo serán devueltos los registros cuyos códigos sean menores que cinco.

Usando SELECT con ORDER BY:

Al utilizar la cláusula ORDER BY dentro del comando SELECT estamos indicando el orden en que deseamos nos sean devueltos los datos. La sintaxis es como sigue:

SELECT <lista_de_campos> FROM <tabla> ORDER BY <lista_de_campos_2>;

Donde:

<lista_de_campos_2> se refiere a los campos sobre los que se aplicará el orden. Si se indica más de un campo, entonces el primero generará el orden principal, y en caso de que más de un registro tenga el mismo valor, se ordenarán por el segundo de la lista y así sucesivamente.

Ejemplos:

Select codigo, nombre from productos where codigo < 5 order by nombre;

Como podemos ver en el ejemplo anterior, hemos solicitado los campos código y nombre de la tabla de productos cuyos códigos sean menores que 5 y los resultados los hemos solicitado ordenados por nombre.

Select codigo, nombre from productos where codigo < 5 order by 2;

El ejemplo anterior es exactamente igual que el que lo precede. Solo hemos cambiado la forma de indicar el orden. En lugar de escribir explícitamente el nombre del campo, hemos puesto un número 2 para indicar que el segundo campo solicitado es el que va a determinar el orden del resultado.

Usos más avanzados del comando SELECT:

El comando SELECT tiene muchas más formas de las que hemos mencionado, por lo que recomendamos ampliar tus estudios en esta área y sobre todo, ejercitar todo lo que vayas aprendiendo.

Por ejemplo, la cláusula GROUP BY dentro del comando SELECT sirve para obtener subtotales. Es decir, permite agrupar cientos de registros que tengan un cierto campo con el mismo valor y traer, no los valores individuales, sino cálculos simples como cantidad de registros, sumas, promedios, etc.

La cláusula HAVING puede ser usada en conjunción con el GROUP BY para determinar cuáles subtotales mostrar y cuáles no. Un ejemplo podría ser, traer de una tabla de ventas los nombres de los productos y el total de unidades vendidas de cada uno de ellos, solo si las ventas superan las cien unidades.

Otro aspecto poderoso del comando SELECT es la posibilidad de combinar dos o más tablas dentro de una sola llamada. Esto se logra de distintas maneras, una de ellas es especificando más de un nombre de tabla luego del FROM y luego añadiendo alguna condición que permita determinar cómo se relaciona una tabla con la otra.

Al trabajar un comando SELECT con más de una tabla, conviene usar un alias para cada una de ellas y usarlo como prefijo de cada columna que se mencione en el comando completo.

Un ejemplo de un comando SELECT sobre más de una tabla podría verse de la siguiente manera:

SELECT

  al.nombre,

  al.apellido,

  nt.resultado

FROM

  alumnos al,

  notas nt

WHERE

  al.codigo = nt.codigo;

En el ejemplo anterior hemos combinado una hipotética tabla de alumnos, que contiene al menos los campos para el código del alumno, nombre y apellido del mismo, junto con otra tabla que contiene las notas obtenidas en una cierta evaluación. En esta última tabla podemos suponer que existen al menos los campos código del alumno y resultado de la evaluación.

Si prestamos atención a la cláusula FROM, vemos que hemos mencionado dos tablas separadas por coma, y que para cada una de ellas hemos especificado una alias.

En el área del WHERE, hemos puesto una condición que expresa el modo en que ambas tablas se relacionan, es decir, que siempre que el campo código tenga el mismo valor, podemos imaginarnos que los campos de ambas tablas podrían combinarse para formar una tabla “virtual” con los campos de ambas.

De esta tabla virtual combinada, hemos solicitado extraer los campos nombre y apellido de la tabla alumnos y el campo resultado de la tabla notas.

Trabajando con bases de datos desde PHP

El lenguaje PHP permite la utilización de una gran variedad de bases de datos, bien usando comandos directos (que funcionan para un tipo de base de datos específicamente) o a través de tecnologías abiertas como ODBC.

Las funciones que permiten realizar ciertas tareas con bases de datos en PHP han sido agrupadas en “familias”, de modo que todos los comandos que sirven para una cierta base de datos comparten un prefijo común.

Además de ello, la mayoría de los nombres de los comandos que tienen una misma funcionalidad son similares, por ejemplo, los comandos para establecer conexión a las distintas bases de datos en PHP tienen los siguientes nombres:

mysql_connect() -- Función de MySQL

ora_logon() -- Función de Oracle

sybase_connect() -- Función de Sybase

odbc_connect() -- Función de ODBC

pg_connect() -- Función de PostgreSQL

ifx_connect() -- Función de Informix

Dada la similitud entre la manera de usar el lenguaje en una base de datos y otra, podemos estar seguros de que, al menos en lo que se refiere a PHP, no hay mucho más que aprender al cambiar de manejador.

En líneas generales podemos decir que al trabajar con una base de datos desde PHP estaremos haciendo siempre las siguientes tareas básicas:

Conexión al manejador de la base de datos

Selección de la base de datos con la que se desea trabajar.

Envío de un comando a ser ejecutado en la base de datos.

Solicitud de uno de los registros obtenidos como resultado de una consulta SQL.

Desconexión de la base de datos.

Existen algunos tipos de tareas adicionales, sin embargo, las mencionadas anteriormente constituyen más del 95% del trabajo a realizar en la mayoría de los proyectos.

Trabajando con MySQL

MySQL es un Sistema Manejador de Bases de Datos Relacionales que funciona como un servidor para proveer conexión a múltiples usuarios sobre múltiples bases de datos individuales.

La primera versión de MySQL apareció en 1995, bajo la filosofía de Licencia Pública General de la mano de MySQL AB, la cual hoy en día es subsidiaria de Oracle.

Si existe una base de datos que podría llamarse natural para trabajar desde PHP, esta sería sin duda alguna MySQL. La razón principal podría estar en el hecho de que ambas se originaron en entornos de código abierto y bajo el sistema operativo Linux.

Hoy en día, MySQL es la escogencia preferida en la mayoría de los desarrollos Web de de tamaño pequeño y mediano. En parte se debe a su facilidad de instalación, a la disponibilidad en distintos sistemas operativos, a su velocidad o muy probablemente a su precio.

Conectando con el manejador de MySQL:

Para conectarse con un servidor de MySQL hay que especificar siempre tres parámetros distintos. El primero se refiere a la identificación del servidor en sí mismo. Cuando el servidor con el que deseamos conectarnos está en la misma máquina en la que trabajamos, podemos usar el texto “localhost”, de lo contrario, podemos poner una dirección por nombre o hasta un IP.

El segundo y tercer parámetros necesario para conectarnos corresponden al nombre del usuario y su clave. Ambos valores deberán coincidir con las credenciales de algún usuario debidamente autorizado en el servidor de bases de datos al que nos deseamos conectar.

PHP permite hacer múltiples conexiones al manejador de bases de datos, cosa que nos permitiría, por ejemplo, trabajar con más de una base de datos administrada por el mismo manejador o tal vez tener múltiples conexiones sobre la misma instancia.

En todo caso, dado que el lenguaje permite múltiples conexiones, el comando que realiza esa tarea retornará un identificador de la conexión, de manera que cualquier operación posterior pueda ser acompañada de este valor y así identificar cuál de ellas estamos usando.

Veamos la sintaxis del comando:

Función mysql_connect

Descripción:

Establece la conexión con un cierto servidor de bases de datos MySQL.

Sintaxis:

mysql_connect(<servidor>, <usuario>, <clave>)

Parámetros:

<servidor>: Puede ser una dirección IP, o un URL o la cadena “localhost”. Puede estar seguido de un número de puerto separados por “:”.

<usuario>: Nombre de un usuario debidamente autorizado para abrir el manejador de bases de datos.

<clave>: Clave del usuario especificado.

Retorna:

Identificador de la conexión (llamado también handler) en caso de que la conexión sea exitosa o FALSE en caso de error.

Ejemplos:

$db = mysql_connect(“localhost”, “admin”, “libra”);

$db = mysql_connect(“www.misitio.com”, “admin”, “venecia”);

Cerrando una conexión:

Una conexión a una base de datos MySQL hecha en PHP habrá de cerrarse automáticamente al terminar de procesarse la página donde fue abierta. Es decir, normalmente no es necesario cerrar este tipo de conexiones, sin embargo, en caso de ser necesario, el comando usado para tal fin es el siguiente:

Función mysql_close

Descripción:

Cierra una cierta conexión a un manejador de bases de datos MySQL.

Sintaxis:

              mysql_close(<conexión>)

Parámetros:

<conexión>: Número retornado por la función mysql_connect. Si no se especifica, se cerrará la última conexión abierta.

Retorna:

              Retorna TRUE si la operación fue exitosa o FALSE en

              caso de error.

Ejemplo:

$db = mysql_connect(“localhost”, “admin”, “libra”);

mysql_close($db);

Seleccionando una base de datos:

Los dos comandos anteriores se refieren a como abrir o cerrar una conexión con el manejador, sin embargo, ese manejador podría estar manejando dos o más bases de datos, así que es necesario especificar el nombre de la base de datos con la que se desea trabajar. Esto lo podemos hacer con el siguiente comando:

Función mysql_select_db

Descripción:

Selecciona una base de datos sobre la que actuarán

los sucesivos comandos.

Sintaxis:

              mysql_select_db(<base_de_datos>, <conexión>)

Parámetros:

<base_de_datos>: Nombre de la base de datos con la que deseamos trabajar.

<conexión>: Identificador retornado por la función mysql_connect. Si no se especifica, se usará la última conexión abierta.

Retorna:

              Retorna TRUE si la operación fue exitosa o FALSE en

              caso de error.

Ejemplo:

$db = mysql_connect(“localhost”, “admin”, “libra”);

mysql_select_db (“inventario”, $db);

Ejecutando un comando SQL:

Una vez establecida la conexión con el servidor y seleccionada la base de datos, estamos preparados para enviar un comando SQL, bien sea para insertar, modificar o eliminar información, o para realizar una consulta.

Para cualquiera de esos casos, podemos usar el siguiente comando:

Función mysql_query

Descripción:

Envía un comando SQL a una cierta base de datos y retorna un resultado.

Sintaxis:

              mysql_query(<comando>, <conexión>)

Parámetros:

<comando>: Texto que contiene un comando SQL válido para ser aplicado a la base de datos previamente seleccionada.

<conexión>: Identificador retornado por la función mysql_connect. Si no se especifica, se usará la última conexión abierta.

Retorna:

Si el comando enviado es un SELECT, entonces la función retorna un identificador si la operación fue exitosa o FALSE en caso de error. Si el comando es un INSERT, UPDATE o DELETE, se retornará TRUE o FALSE para indicar el éxito del comando.

El identificador retornado en caso de consultas, servirá para solicitar cada uno de los registros retornados por el comando SELECT.

Ejemplo:

$db = mysql_connect(“localhost”, “admin”, “libra”);

if ($db){

  if (mysql_select_db (“inventario”, $db)){

    $sql = “SELECT * FROM productos”;

    $res = mysql_query($sql, $db);

  }

}

Requiriendo un registro:

Tal como vimos en el ejemplo anterior, siempre que se hace una consulta del tipo SELECT a una base de datos, obtendremos como resultado un identificador, llamado también recurso, el cual no es más que el conjunto de valores retornados en modo –digamos- inutilizable.

Para poder acceder a cada uno de los registros almacenados en ese valor tipo recurso, existe una familia de funciones, todas ellas de la forma mysql_fetch.

Cada una de estas funciones extrae de forma secuencial cada uno de los registros seleccionados. Es decir, la primera vez que llamamos a una función del tipo mysql_fetch luego de una selección de datos, retornará el primer registro seleccionado o FALSE si no existe ningún registro. Las siguientes veces que llamemos a ese mismo comando, retornará el segundo, tercero, cuarto registro hasta llegar al final de la selección, momento en el que retornará FALSE.

Es importante destacar que, dado que en PHP los valores FALSE, el número 0 y un texto vacío son equivalentes, el mejor modo de saber si una de estas funciones ha llegado o no al final, es comparando el resultado de la función contra el valor FALSE usando operadores de exactitud (bien sea ===, o también  !==).

La diferencia principal entre las distintas funciones mysql_fetch está en la forma en que cada una de ellas retorna los registros. Por motivos de simplicidad, vamos a hacer énfasis en solo dos de ellas:

Función mysql_fetch_row

Descripción:

Retorna en forma de arreglo secuencial, uno de los  registros resultantes de la aplicación de un comando SELECT sobre una base de datos.

Sintaxis:

              mysql_fetch_row(<recurso>)

Parámetros:

              <recurso>: Identificador retornado por la función

              mysql_query.

Retorna:

Arreglo secuencial con los contenidos de los distintos campos especificados en el comando SELECT enviado a la función mysql_query.

Si no hay ningún registro que retornar, la función retorna el valor FALSE.

Ejemplo:

$db = mysql_connect(“localhost”, “usr”, “key”);

if ($db){

  if (mysql_select_db (“inventario”, $db)){

    $sql = “SELECT * FROM productos”;

    $res = mysql_query($sql, $db);

    $fila = mysql_fetch_row($res);

    while ($fila !== false){

      for ($i = 0; $i < count($fila); $i++)

        echo $i . “=“ . $fila[$i] . “<br>”;

      $fila = mysql_fetch_row($res);

    }

  }

}

Función mysql_fetch_assoc

Descripción:

Retorna en forma de arreglo asociativo, uno de los  registros resultantes de la aplicación de un comando SELECT sobre una base de datos.

Sintaxis:

              mysql_fetch_assoc(<recurso>)

Parámetros:

              <recurso>: Identificador retornado por la función

              mysql_query.

Retorna:

Arreglo asociativo con los contenidos de los distintos campos especificados en el comando SELECT enviado a la función mysql_query.

Los índices del arreglo retornado  contendrán los nombres de los campos según lo escrito en el comando SELECT.

Si no hay ningún registro que retornar, la función retorna el valor FALSE.

Ejemplo:

$db = mysql_connect(“localhost”, “usr”, “key”);

if ($db){

  if (mysql_select_db (“inventario”, $db)){

    $sql = “SELECT cod, nombre FROM productos”;

    $res = mysql_query($sql, $db);

    $fila = mysql_fetch_row($res);

    while ($fila !== false){

      echo “Código: “ . $fila[“cod”] . “<br>”;

      echo “Nombre: “ . $fila[“nombre”] . “<br>”;

      $registro = mysql_fetch_row($res);

    }

  }

}

Tal como indicamos al principio de este capítulo, el modo en que se trabaja en PHP con una base de datos, es bastante parecido a como se trabaja con las otras, así que poco hay que aprender cuando ya hemos hecho un primer proyecto conectando con alguna base de datos.

Introducción

En este capítulo te presentamos un par de conceptos introducidos en el lenguaje a partir de la versión 4 del mismo, las variables globales y súper globales.

Estos dos tipos de elementos le brindan al programador la posibilidad de acceder directamente, y desde cualquier parte del código, a cierto tipo de información, lo cual añade sencillez y legibilidad a los programas desarrollados.

Al finalizar este capítulo estarás capacitado para utilizar adecuadamente los arreglos globales y súper globales, los cuales constituyen la base de lo que habrás de aprender en el resto del libro.

Temas desarrollados en este capítulo:

Variables globales

Variables súper globales

Variables globales

El alcance natural de cualquier variable en PHP es el contexto en el cual está definida. Es decir que una variable definida dentro de una función, será válida solo dentro de esa función, mientras que una variable definida a nivel del script, tendrá valor a lo largo de todo el código del script no incluido dentro de funciones.

Ya hemos mencionado la posibilidad de utilizar una variable externa dentro de una función siempre que declaremos la misma como global. Sin embargo, la mejor manera de utilizar una variable dentro de un script (o en cualquiera de sus includes) sin importar si estamos dentro o fuera de una función es usando un arreglo asociativo especial llamado $GLOBALS.

Por ejemplo, si asignamos un valor a la variable $usuario al principio de un script, podremos hacer uso de ella posteriormente en cualquier parte del mismo script excepto dentro de las funciones.

Podemos poner en cada función donde deseemos utilizar esa variable, una pequeña declaración donde indiquemos que al referirnos a $usuario no queremos crear una variable interna a la función sino que queremos utilizar la que existe externamente.

Una alternativa más sencilla es reemplazar la variable $usuario por $GLOBALS[“usuario”], de este modo podemos hacer uso de ella dentro o fuera de las funciones sin tener que declararla.

En resumen, el arreglo especial $GLOBALS existe en todas partes, si queremos hacer que una variable pueda ser llamada en cualquier parte de un script, entonces podría convenirnos no usar una variable en sí, sino más bien definir una de las posiciones del arreglo $GLOBALS.

Variables súper globales

Así como el arreglo $GLOBALS existe en cualquier parte, existen una serie de arreglos asociativos con las mismas características. Se les conoce como Súper Globales.

Veamos algunos de ellos.

Información sobre el ambiente de ejecución - $_SERVER

Este arreglo asociativo contiene información relativa al servidor donde se está despachando la página, los directorios definidos, los encabezados HTML y la ubicación de los scripts. Algunos de índices utilizables son:

$_SERVER[“PHP_SELF”] Nombre físico del archivo que se está ejecutando.

$_SERVER[“argv”]: Arreglo con la lista de los parámetros pasados al script.

$_SERVER[“argc”]: Número de argumentos pasados al script.

$_SERVER[“SERVER_ADDR”]: Dirección IP del servidor donde se está ejecutando el script.

$_SERVER[“SERVER_NAME”]: Nombre del servidor donde se está ejecutando el script.

$_SERVER[“REQUEST_METHOD”]: Indica el método usado para accesar la página (‘GET’, ‘HEAD’, ‘POST’, ‘PUT’, etc.).

$_SERVER[“DOCUMENT_ROOT”]: Directorio raíz desde el que se está ejecutando el script.

$_SERVER[“HTTP_USER_AGENT”]: Texto que indica el navegador y Sistema Operativo utilizado por el usuario.

Variables de ambiente del Sistema Operativo - $_ENV:

A través de este arreglo asociativo podemos acceder a las llamadas variables de ambiente del Sistema Operativo. Por ejemplo, si PHP está siendo interpretado en un servidor Windows, entonces utilizando el arreglo asociativo $_ENV podemos acceder a todos los SETs definidos.

Debido a que la lista de las variables de ambiente varía dependiendo del Sistema Operativo, e incluso de la versión del mismo, resultaría inútil hacer una lista de opciones. Sin embargo, si deseas acceder a un valor de ambiente como el usuario Windows que está ejecutando PHP, podrás usar este arreglo.

Valores pasados de una página a otra usando el método GET - $_GET

Al enviar los valores de un conjunto de elementos HTML desde el formulario de una página a otra usando el método GET, podemos tener acceso a los valores enviados utilizando el arreglo asociativo $_GET. Pongamos un ejemplo para describir su uso:

Supongamos que tenemos una página A, la cual tiene un formulario que usa el método GET para llamar a la página B, y digamos que dentro de ese formulario están contenidos los elementos HTML <input type=’text’ name=’usuario’>  e <input type=’password’ name=’clave’>.

<html>

  <head>

    <title>Página A</title>

  </head>

  <body>

    <form name=’login’ action=’PaginaB.html’ method=’get’>

      Escriba su usuario:

      <input type=’text’ name=’usuario’ />

      <br />

      Escriba su clave:

      <input type=’password’ name=’clave’ />

      <br />

      <input type=’submit’ value=’Entrar’ />

    </form>

  </body>

</html>

Ahora supongamos que tenemos una PaginaB.html, la cual recibirá los valores escritos por el usuario. Algo como esto:

<html>

  <head>

    <title>Página B</title>

  </head>

  <body>

    Su usuario es: <?php echo $_GET[”usuario”]; ?>

    <br />

    Su clave es: <?php echo $_GET[”clave”]; ?>

  </body>

</html>

Como podemos ver, cualquier valor transmitido por un formulario usando el método GET, puede ser recibido del otro lado usando el arreglo superglobal $_GET.

Valores pasados de una página a otra usando el método POST - $_POST

El arreglo superglobal $_POST es exactamente igual al anterior. Ambos están diseñados para recibir los valores de los elementos HTML enviados desde una página a otra a través de un formulario. La única diferencia entre ambos es que el procesador de PHP hará uso de uno solo de ellos dependiendo del método usado en el formulario. Es decir, si el formulario que fue utilizado para llamar una página usó el método GET, entonces el arreglo superglobal $_GET contendrá los valores escritos por el usuario. Si por el contrario, el método usado fue POST, entonces será $_POST el que contenga tales valores.

Valores pasados de una página a otra usando cualquier método - $_REQUEST

En cualquiera de los dos casos anteriores, el procesador de PHP aparte de llenar un arreglo (bien sea $_GET o $_POST) con los valores enviados, también llenará otro arreglo llamado $_REQUEST con los mismos valores.

Ya que el uso de $_REQUEST es exactamente igual al de los dos arreglos antes mencionados, no es una mala idea hacer siempre uso de $_REQUEST y no de los otros arreglos.

Nombres de archivos subidos mediante el tag <input type=’file’> de HTML - $_FILES

Cuando se utiliza el elemento HTML <input type=’file’> para hacer un upload de un archivo, el procesador de PHP crea una entrada en el arreglo superglobal $_FILES con el nombre de los archivos subidos.

HTML es capaz de manejar por si solo la carga de archivos desde alguna locación del usuario hasta el servidor, sin embargo, conociendo el nombre del archivo recién subido, pueden hacerse distintas manipulaciones posteriores usando PHP.

Valores pasados de una página a otra mediante sesiones - $_COOKIE y $_SESSION

El arreglo superglobal $_COOKIE contiene los nombres y valores de todas las cookies usadas en el sitio, mientras que $_SESSION permite almacenar valores a los que necesitemos acceder una y otra vez en distintas páginas mientras el usuario este navegando por nuestro sitio Web.

Dada la importancia de estos dos arreglos en la construcción de sitios donde un contexto común pueda ser usado en cualquier página sin tener que transmitirlo todo el tiempo, hemos decidido dedicarles a ellos todo el capítulo siguiente.

Introducción

En este capítulo abordamos uno de los conceptos introducidos por Netscape Communications desde el año 1994, y que pasó prontamente a constituirse en un estándar de al programación Web, las llamadas cookies.

Al finalizar este capítulo deberías estar en capacidad de entender y utilizar cookies desde PHP para recordar datos de tus clientes.

Temas desarrollados en este capítulo:

Concepto y utilidad de las cookies

Uso de cookies en PHP

Operaciones básicas con cookies

¿Qué es una “cookie”?

Una “cookie” es un trozo de información relacionada con un dominio Web que se almacena en el disco duro del visitante, y que puede ser luego recuperada por el servidor del dominio en posteriores visitas.

Desde el punto de vista de un programador, podríamos decir que una cookie no es más que una variable que se guarda en el cliente. Técnicamente hablando, podemos decir que es un pequeñísimo archivo de texto que el navegador guarda en nuestro equipo cuando la página se lo solicita.

Los navegadores más conocidos están provistos con un mecanismo para guardar y reenviar al servidor ciertos valores almacenados en las llamadas cookies. Para poder hacer esto, ellos disponen de algún directorio oculto a los usuarios en los que guardan todas las cookies utilizadas por las páginas visitadas por los usuarios.

Una página Web programada para utilizar cookies, además de realizar sus funciones naturales, puede darle la orden al navegador de almacenar uno o más valores. Además, cada vez que una de las páginas del sitio hace una solicitud al servidor para navegar a otra de ellas, lleva consigo al servidor todos los valores de las cookies del sitio.

Toda cookie está limitada a un dominio específico, por ejemplo www.misitioconcookies.com. Además, están provistas de un mecanismo de caducidad que le permite al programador ponerle a cada una de ellas una fecha de vencimiento.

Desventajas asociadas al uso de cookies

Existen sitios Web que hacen uso intensivo de las cookies para guardar todo tipo de información como claves, números de tarjetas de crédito y otro tipo de cosas. Personalmente recomiendo ser muy cuidadoso a la hora de utilizar este tipo de elementos, ya que pone la información del usuario al alcance de programas maliciosos.

Otro aspecto por el que no siempre es recomendable hacer sitios Web que dependan exclusivamente del uso de cookies, es que el usuario tiene la opción de configurar su navegador para desactivarlas.

Estructura de una Cookie

Básicamente, una cookie contiene información acerca de lo siguiente:

Nombre de la variable: Indica el nombre con el que se va a guardar el valor, por ejemplo “cuenta”, o “fecha” o “teléfono”.

Valor: Contiene el valor real a ser guardado.

Fecha de expiración: Si no se especifica, o su valor es cero, indica que la cookie debe caducar tan pronto el usuario cierre el navegador. De lo contrario, indica la fecha y hora luego del cual el valor deberá ser descartado.

Dominio: Nombre del dominio dueño de la información (por ejemplo www.misitioconcookies.com)

Subdominio: Indica el directorio interno al dominio al que pertenece la cookie. Si se especifica, entonces la cookie tendrá valor solo dentro de él y sus directorios internos, si no se especifica, o tiene el valor “/”, la cookie es válida en todas las páginas del dominio.

Usando cookies en PHP

El manejo de cookies desde PHP es sumamente sencillo. El lenguaje provee una función poderosa y a la vez fácil de usar para enviar cookies al navegador del usuario y por otro lado provee un arreglo superglobal para tener a la mano todos los valores de las cookies que vienen en cada página procedentes del computador del usuario.

Guardar una cookie en el cliente.

Para enviar un valor al cliente a ser guardado como cookie, existe la siguiente función:

Función setcookie

Descripción:

Solicita al navegador guardar una cookie en el equipo

del cliente.

              Sintaxis:

setcookie(<nombre>[, <valor>[, <expira>[, <subdom>[, <dominio>[, <seguro>[, <solo_HTTP>]]]]]])

Parámetros:

<nombre>: Nombre de la variable.

<valor>: Contenido que se desea guardar. Si este parámetro es omitido, el navegador procederá a borrar la cookie que contenga el nombre indicado.

<expira>: Indica la fecha y hora de expiración.

<subdom>: Subdominio donde es válida.

<dominio>: Dominio donde es válida.

<seguro>: Indica si solo su usa en modo seguro (HTTPS)o no.

<solo_HTTP>: Indica si es inaccesible a lenguajes de script o no.

De los siete parámetros utilizables para la función, solo el primero es obligatorio.

Ejemplos:

setcookie(“nombre”, $nombre_usuario);

setcookie(“fecha”, date());

setcookie(“sexo”);

Leer los valores de las cookies

En todas las páginas de cualquier aplicación de PHP se puede tener acceso al arreglo superglobal $_COOKIE, el cual contiene los valores de todas las cookies válidas para el usuario que solicitó la página, según el dominio, subdominio, fecha de caducidad, etc.

En general, el programador PHP debe poner atención a los atributos que le asigna a una cookie al momento de enviarla al navegador del cliente. Sin embargo, para usar su contenido, solo debe consultar el arreglo correspondiente. Si una cookie no es accesible en cierto subdominio, o ha caducado, entonces PHP no la incluirá en el arreglo. Veamos un pequeño ejemplo:

Supongamos que en nuestra página principal tenemos  algo como lo siguiente:

<?php

  setcookie(”hora_de_entrada”, date());

?>

Al omitir el resto de los parámetros estamos asumiendo que la cookie es válida para todo el dominio y su fecha de caducidad está limitada al tiempo en que el navegador del usuario permanezca abierto.

En cada una de las páginas visitadas luego de ser ejecutado el comando anterior, podríamos recuperar el valor de la variable hora_de_entrada mediante la utilización de $_COOKIE.

<?php

  echo ”Usted entró a la página principal a las: “ . $_COOKIE[”hora_de_entrada”];

?>

Eliminar una cookie almacenada en el cliente

Existen momentos en los que una aplicación necesita eliminar una o más cookies guardadas en el computador del cliente. Por ejemplo, si una de las cookies utilizadas guarda el nombre de un usuario suscrito dentro de la aplicación, es deseable que ese valor esté vigente la siguiente vez que el usuario regrese dicho sitio, sin embargo, si el usuario presiona algún enlace para “des suscribirse” al sitio, es conveniente borrar la cookie correspondiente para así dejar de reconocerlo.

Para borrar una cookie se utiliza la misma función PHP que utilizamos para crearla, solo que enviamos únicamente el parámetro correspondiente al nombre de la cookie pero omitimos el parámetro del valor.

<?php

  setcookie(”usuario”);

?>

Introducción

En este capítulo te presentamos el concepto de sesiones en la programación Web, el cual constituye la base de uno de los aspectos que ha alcanzado mayor desarrollo en los últimos años como lo es el comercio electrónico.

Al finalizar este capítulo tendrás toda la información necesaria para desarrollar sitios Web capaces de manejar sesiones de usuario.

Temas desarrollados en este capítulo:

Concepto y ejemplos de sesiones

Características del manejo de sesiones en PHP

Funciones para el manejo de sesiones

Metodologías para la propagación del código de sesión

¿Qué es una sesión?

Como ya sabemos, el trabajo de un servidor Web es despachar las páginas que le son solicitadas por los usuarios. Estas solicitudes pueden provenir de muchos usuarios distintos, o en algunos casos, de un mismo usuario.

Desde el punto de vista del servidor, todas las solicitudes son atendidas como si proviniesen de usuarios distintos, es decir que el servidor http por sí mismo no tiene memoria de lo que un usuario ha hecho, de cual página viene ni puede identificar de forma precisa el computador usado por éste.

Uno podría imaginar, que la dirección IP de cada usuario podría ser el punto de partida para saber quien ha hecho cada requerimiento y así poder reconocer a cada uno de ellos. Sin embargo, debemos recordar que en ciertas condiciones, varios usuarios pueden compartir la misma dirección. Más aún, un usuario podría tener una dirección IP al momento de solicitar una página y otra distinta al pasar a la siguiente si reinicia su conexión.

Una sesión es el tiempo durante el cual un servicio “conoce” al usuario servido y le permite efectuar una o más operaciones. Normalmente una sesión comienza luego de que el usuario es identificado y termina, bien porque éste así lo desea o bien porque transcurre una cierta cantidad de tiempo de inactividad.

Las sesiones pueden utilizarse para cosas sencillas como mostrarle al usuario su nombre en pantalla o para operaciones más delicadas como pagos en línea.

Por lo general, durante el tiempo de existencia de una sesión, resulta de mucha utilidad guardar cierta información de estado, como por ejemplo identificación y nombre del usuario, número de tarjeta de crédito, ultima operación realizada y cosas por el estilo.

Sesiones en nuestra vida cotidiana: Los cajeros automáticos

Para comprender con claridad el concepto de sesión, podemos recurrir a un ejemplo bastante conocido, las transacciones en los cajeros automáticos bancarios.

La finalidad de un cajero automático es ofrecer a usuarios autorizados la posibilidad de realizar una o más transacciones sin tener que desplazarse hasta una agencia bancaria. Para ello debe garantizar la identidad del usuario, permitirle hacer sus transacciones y detectar momento en que el mismo se retira para evitar que otro pueda  hacer mal uso de sus recursos.

Especulemos un poco acerca del modo en que ambos lados de la red, los cajeros y el servidor están programados.

Desde el punto de vista del cajero

Para poder atender a los clientes no es necesario que cada cajero automático tenga almacenada Ningún tipo de información de los usuarios. Basta con que tengan la capacidad de enviar a su servidor una serie de requerimientos de operaciones sencillas y que este último le indique si puede realizarlas o no.

La primera de las operaciones que todo cajero realiza es identificar al usuario. Para ello procede a leer un código de identificación de una tarjeta y solicitar una clave de acceso. Ambas cosas, acompañadas probablemente con la identificación del cajero mismo son enviadas al servidor quien deberá decidir si el usuario es reconocido o no.

Si la identificación es válida, el cajero habrá de recibir probablemente cierta información personal del cliente como su nombre y quizás el tipo de cuentas que posee, momento en el cual el aparato procederá a ofrecerle al usuario una serie de servicios como retiros, solicitudes de saldo, cambios de clave, etc.

Cada una de estas operaciones, desde el punto de vista del cajero, no son otra cosa que pedir información al usuario, enviar el requerimiento al servidor y aguardar por una respuesta.

Una última funcionalidad del cajero, no por ello la menos importante, es detectar cuando el usuario ha concluido sus operaciones para así enviarle un mensaje al servidor de que ya no habrá de esperar más requerimientos asociados con éste. A este respecto, muchos de esos dispositivos exigen identificación por cada transacción individual, para así poder garantizar que el usuario no deje olvidada su tarjeta dentro del equipo. En estos casos, puede decirse que el fin de la sesión es automático.

Desde el punto de vista del servidor

El servidor de la red de cajeros deberá atender muchas operaciones simultáneas procedentes de distintos usuarios y distintos cajeros.

Podríamos pensar que un servidor –aparte de completar las transacciones bancarias- tiene la habilidad para guardar temporalmente –digamos que en distintos sacos- la información necesaria para atender a cada uno de los usuarios que se conectan y eliminar un saco una vez que cesa una conexión.

De esta manera, podemos pensar que una operación de identificar al usuario no es más que verificar sus credenciales y de ser válidas, preparar un espacio temporal donde guardar los datos necesarios.

Por cada operación adicional, el servidor solo necesitará saber que cajero está haciendo la solicitud, para identificar el “saco” temporal donde están los datos del usuario y hacer las operaciones requeridas.

Transcurrido cierto tiempo de inactividad, o si el cajero correspondiente enviase una orden de cierre de sesión, el servidor procederá a eliminar el saco en cuestión.

Como podemos ver, el programa del lado del servidor será mucho más sencillo si en cada saco guardamos –por ejemplo- el número de cuenta de cada cliente, así cualquier operación de retiro podrá realizarse mediante una única función a la cual le podríamos pasar como parámetro la cuenta de la sesión que se está atendiendo.

Diferencias respecto a una aplicación Web

A diferencia del ejemplo de los cajeros automáticos donde casi con total seguridad el servidor puede saber exactamente cuál de sus cajeros le hace cada solicitud, una aplicación Web no puede identificar por si sola el computador que le hace cada requerimiento, por lo que es necesario crear un número único para cada sesión de modo que el servidor pueda distinguir un requerimiento de otro.

Por otro lado, al realizar una aplicación Web, podemos olvidarnos del problema de comunicación, ya que los protocolos subyacentes y el programa servidor HTTP (Apache o IIS) se encargarán de escuchar las solicitudes y llamar a una de nuestras páginas. Todo lo que debemos cuidar entonces es que siempre nos llegue un número apropiado de sesión para poder saber que valores usar.

Sesiones en PHP

La implementación de sesiones en PHP se realiza básicamente a través de archivos de texto guardados por el intérprete en un cierto directorio del servidor. El nombre del archivo de texto correspondiente a cada sesión, no es otro que el código único de la sesión, e internamente, cada archivo contiene todos los valores de todas las variables de esa sesión en particular.  Todo esto lo realiza PHP sin necesidad de nuestra intervención. Sin embargo, hay otras tareas que nos toca realizar a nosotros y es allí donde debemos centrar nuestra atención.

En la medida que cumplamos con ciertas normas que garanticen que el código de una sesión esté siempre disponible, PHP habrá de resolver para nosotros el almacenamiento de las variables de esa sesión. De este modo, nosotros podremos dedicarnos simplemente guardar los datos necesarios en posiciones del arreglo $_SESSION que necesitemos crear. Así, cada vez que queramos guardar o saber el número de cuenta del usuario conectado, solo tendríamos que usar algo como $_SESSION[“cuenta”]. PHP se encargaría de guardar y recargar ese valor en todas nuestras páginas, siempre que el código de la sesión esté disponible.

De esta manera, bastará con que cada página Web de nuestra aplicación “recuerde” el número de la sesión, para poder retomar todos los valores personalizados. Este procedimiento de hacer que cada página conozca el número de sesión que se está usando se le conoce como “propagación del identificador de sesión”. Existen distintas formas de hacer esta propagación:

El código de sesión puede ser guardado del lado del cliente usando lo que se conoce como una “cookie”.

El código puede ser transmitido de una página a otra manualmente, bien como parámetro a través del URL de cada página llamada o usando elementos HTML escondidos –hidden- dentro de todos los formularios.

Finalmente, existe la posibilidad de delegar en PHP la propagación de las sesiones utilizando un setting especial para tal fin.

Funciones PHP para el manejo de sesiones

Existen muchas funciones en PHP para manejar sesiones, sin embargo, utilizando un reducido número de ellas es posible hacer todo lo necesario para proporcionar a un sitio Web un adecuado manejo de sesiones.

Todas las funciones para el manejo de sesiones comienzan con el prefijo “session_”. Veamos las más importantes:

Inicio de sesión: session_start

La función session_start() crea una nueva sesión o recupera una existente basado en el identificador de sesión que se este utilizando. En otras palabras, si la página en la que se está ejecutando esta función recibe vía GET, POST o vía cookies una variable llamada PHPSESSID (si es que el nombre no ha sido cambiado previamente usando la función session_name), entonces la página habrá de recuperar la sesión cuyo código venga dado por el contenido de esa variable, de lo contrario, habrá de crearse una nueva sesión. Veamos su sintaxis:

Función session_start

Descripción:

Crea una nueva sesión o recupera una existente.

Sintaxis:

session_start()

Ejemplo:

session_start();

La llamada a esta función debe colocarse al principio de toda página Web que utilice sesiones, antes de que se produzca cualquier escritura.

Borrando una sesión: session_destroy

Esta función destruye todas las variables guardadas dentro de una sesión.

La función session_destroy debe ser usada cuando se tenga la certeza de que el usuario no debe ser reconocido la siguiente vez que entre en la página, es decir que se le deberá requerir nuevamente su identificación.

La sintaxis de la función es como sigue:

Función session_destroy

Descripción:

Destruye una sesión.

Sintaxis:

session_destroy()

Ejemplo:

session_destroy();

Nombre de la variable de sesión: session_name

La función session_name tiene dos usos distintos. Cuando es usada sin parámetros retorna el nombre de la variable de sesión que se está utilizando. De no haber sido cambiada, ese nombre será PHPSESSID. Sin embargo, cuando se desea utilizar un nombre distinto para las variables de sesión, entonces se puede pasar el nuevo nombre como parámetro a esta función.

La sintaxis es muy sencilla:

Función session_name

Descripción:

Retorna el nombre de la variable de sesión utilizada o la cambia si se especifica como parámetro.

Sintaxis:

session_name([<nombre>])

Ejemplos:

// Retorna PHPSESSID

echo session_name();

// Cambia el nombre de las sesiones por ID

session_name(“ID”);

Identificador de sesión: session_id

Esta función retorna el código único de la sesión en curso, es decir, el contenido de la variable PHPSESSID.

Al igual que en el caso anterior, si se añade un parámetro a la función, se estaría asignando un valor a tal variable, es decir, se estaría asignando un código de sesión. Es importante que si se va a trabajar con códigos de sesión generados por el programador, la llamada a esta función debe colocarse antes de la llamada a session_start.

Por otro lado debe tomarse en cuenta que si no hay ninguna sesión en curso, esta función retornará una cadena de caracteres vacía.

Veamos la sintaxis:

Función session_id

Descripción:

Retorna el valor de la variable de sesión utilizada o cambia el mismo si se especifica como parámetro.

Sintaxis:

session_id([<valor>])

Ejemplos:

// Retorna el código de sesión

echo session_id();

// Cambia el código de sesión por el valor dado.

session_id(“402318”);

Propagando el código de sesión

Anteriormente mencionamos los tres métodos principales para la propagación del código de sesión. Veamos más detalladamente cada una de las alternativas.

Propagación a través de cookies

La propagación del código de sesiones usando cookies se establece en el archivo de configuración php.ini, modificando el valor de la variable session.use_cookie.

De estar activadas las cookies para el manejo de sesiones, la propia función session_start se encargará de buscar dentro de las cookies existentes el código de la sesión actual sin que se requiera mayor intervención por parte del programador.

La parte menos agradable de utilizar la propagación de sesiones a través de cookies es que el usuario podría desactivar el uso de éstas en el navegador, en cuyo caso todo el manejo de sesiones de nuestro sitio Web dejaría de funcionar.

Propagación manual:

Este método de propagación es el más laborioso pero el más seguro, ya que no todos los usuarios permiten el uso de cookies en sus navegadores.

El método consiste en cuidar que todas las llamadas de una página a otra envíen el valor del código de sesión.

Veamos todas las posibilidades:

Redireccionamiento usando la función PHP header: Todas las llamadas a otras páginas internas de nuestro sitio hechas a través de la función header(), deberán ser alteradas de modo que entre los parámetros se incluya el nombre y código de sesión. Veamos un ejemplo:

              Una llamada que tenga la forma:

<?php

  header(”Location: http://www.misitio.com”);

?>

              Deberá ser cambiada por algo como:

<?php

  $url = ”http://www.misitio.com”;

  header(”Location: $url?PHPSESSID=” . sesión_id());

?>

              O mejor aún:

<?php

  $url = ”http://www.misitio.com?”;

  $url .= sesión_name() . ”=” . session_id();

  header(”Location: $url”);

?>

Redireccionamiento mediante formularios: Todos los formularios que llamen a otra página a través del atributo action de la etiqueta form, deben incluir un elemento oculto cuyo nombre sea PHPSESSID (de no haber sido cambiado) y cuyo valor sea el código de la sesión. Veamos de que estamos hablando:

              Una llamada que tenga la forma:

<html>

  <head>

  </head>

  <body>

    <form action=’Pagina2.php’>

      Producto:

      <input type=’text’ name=’producto’ />

      <br />

      Precio:

      <input type=’text’ name=’precio’ />

      <br />

      <input type=’submit’ value=’Enviar’ />

    </form>

  </body>

</html>

              Deberá ser cambiada por algo como:

<html>

  <head>

  </head>

  <body>

    <form action=’Pagina2.php’>

      Producto:

      <input type=’text’ name=’producto’ />

      <br />

      Precio:

      <input type=’text’ name=’precio’ />

      <br />

      <input type=’submit’ value=’Enviar’ />

      <input type=’hidden’ name=’PHPSESSID’ value=’<?php echo session_id(); ?>’ />

    </form>

  </body>

</html>

Redireccionamiento usando JavaScript: Todo re direccionamiento escrito en JavaScript a través de la función open() o por asignando una dirección a la propiedad location, debe ser cambiado de forma que se garantice que en la dirección URL se incluya el valor de la sesión corriente. Por ejemplo:

Si existe una función JavaScript que contenga algo como:

<html>

  <head>

    <script language=’javascript’>

      function abre_popup(){

        open(‘pagina2.php’);

      }

    </script>

  </head>

  <body>

    <input type=’button’ value=’popup’ onclick=’abre_popup()’ />

  </body>

</html>

Debe ser cambiado de la siguiente manera:

<html>

  <head>

    <script language=’javascript’>

      function abre_popup(){

        open(‘pagina2.php?PHPSESSID=<?php echo session_id(); ?>’);

      }

    </script>

  </head>

  <body>

    <input type=’button’ value=’popup’ onclick=’abre_popup()’ />

  </body>

</html>

              También cada vez que se encuentre algo como lo siguiente:

<html>

  <head>

    <script language=’javascript’>

      function ir_a_2(){

        location.href = ‘pagina2.php’;

      }

    </script>

  </head>

  <body>

    <input type=’button’ value=’Ir a página 2’ onclick=’ir_a_2()’ />

  </body>

</html>

              Se debe alterar de la siguiente manera:

<html>

  <head>

    <script language=’javascript’>

      function ir_a_2(){

        location.href = ‘pagina2.php?PHPSESSID=<?php echo session_id(); ?>’;

      }

    </script>

  </head>

  <body>

    <input type=’button’ value=’Ir a página 2’ onclick=’ir_a_2()’ />

  </body>

</html>

Propagación automática:

Para hacer todo el proceso de propagación más sencillo, PHP puede encargarse de transformar por nosotros todos los enlaces internos de nuestro sitio para que incluyan el session_id. Esto se logra haciendo que la directiva session.use_trans_sid en nuestro php.ini esté activada (valor igual a "1").

Tal y como dijéramos en las primeras páginas de este material, el aprendizaje de un lenguaje de programación es similar al dominio de cualquier idioma. No basta con entender los conceptos. Para obtener el dominio completo de todo lenguaje hay que practicarlo, y es ese un punto que forzosamente corresponde en exclusiva al lector.

Esperamos haber cumplido lo que prometimos al comienzo de este libro, que no es otra cosa que ofrecer en forma sencilla al lector poco especializado un cúmulo de conceptos, ejemplos e información técnica que le permita dar sus primeros pasos en el mundo de la programación Web usando el lenguaje PHP.

Esperamos igualmente haber transmitido, aunque sea un poco, el gusto por el mundo de la programación Web. De haber logrado esto último, estamos seguros que parte del camino hacia el éxito en este oficio está garantizado.