Programación con PHP Curso básico

Instructor

Luis Carlos Aguirre Mora guica@secso.net

1. Introducción ..............................................................................................................................................................6 1.1. Instalación de nuestras herramientas..........................................................................................................7 1.2. Instalación de la base de datos: MySQL...................................................................................7 1.3. Instalación del servidor Web: Apache.......................................................................................8 1.4. Instalación de PHP..............................................................................................................................10 2. El lenguaje PHP ......................................................................................................................................................12 2.1. Extensión de los archivos ................................................................................................................................12 2.2. Delimitadores ...................................................................................................................................................12 2.3. Fin de línea .......................................................................................................................................................13 2.4. Comentarios .....................................................................................................................................................13 2.5. Variables...........................................................................................................................................................14 2.5.1. Declaración y uso .......................................................................................................................................14 2.5.2. Tipos de variables.......................................................................................................................................14 2.5.3. Ámbito........................................................................................................................................................15 2.5.4. Referencias .................................................................................................................................................15 2.5.5. Acceso indirecto .........................................................................................................................................16 2.6. Tipos de datos ..................................................................................................................................................16 2.6.1. Enteros (int, integer)...................................................................................................................................16 2.6.2. Números en punto flotante (float, double, real) .........................................................................................16 2.6.3. Arrays (array).............................................................................................................................................17 2.6.4. Cadenas de texto (string)............................................................................................................................18 2.6.5. Objetos (object) ..........................................................................................................................................19 2.7. Constantes ........................................................................................................................................................19 2.8. Mayúsculas y minúsculas................................................................................................................................20 2.9. Operadores.......................................................................................................................................................20 2.9.1. Operadores aritméticos ...............................................................................................................................20 2.9.2. Auto-incremento y auto-decremento ..........................................................................................................20 2.9.3. Operadores de bits ......................................................................................................................................21 2.9.4. Operadores lógicos .....................................................................................................................................21 2.9.5. Asignación, igualdad e identidad................................................................................................................21 2.9.6. Comparaciones ...........................................................................................................................................22 2.9.7. Operadores de cadenas de texto..................................................................................................................22 2.9.8. Atajos en la asignación ...............................................................................................................................23 2.9.9. Precedencia y asociatividad de operandos..................................................................................................23 2.10. Estructuras de control...................................................................................................................................24 2.10.1. if ... elseif ... else .......................................................................................................................................24 2.10.2. while y do .. while.....................................................................................................................................25 2.10.3. break y continue .......................................................................................................................................26 2.10.4. for .............................................................................................................................................................27 2.10.5. foreach......................................................................................................................................................28 2.10.6. switch........................................................................................................................................................29 2.11. Evaluaciones a Cierto o Falso.......................................................................................................................30 2.12. Funciones........................................................................................................................................................31 2.12.1. Paso de parámetros por referencia ............................................................................................................32 2.12.2. Devolución de variables por referencia ....................................................................................................32

2

2.13. include y require ............................................................................................................................................33 3. Programando en PHP .............................................................................................................................................34 3.1. Formas..............................................................................................................................................................34 3.1.1. Valores sencillos.........................................................................................................................................34 3.1.2. Valores múltiples........................................................................................................................................34 3.2. Manipulación de strings y arrays...................................................................................................................35 3.2.1. Comparaciones ...........................................................................................................................................35 3.2.2. Subcadenas .................................................................................................................................................35 3.2.3. Imprimir y formatear cadenas.....................................................................................................................36 3.2.4. Escapar caracteres ......................................................................................................................................37 3.2.5. Extraer campos ...........................................................................................................................................38 3.2.6. Recorrer un array ........................................................................................................................................39 3.2.7. Ordenar un array.........................................................................................................................................40 3.2.8. Otras funciones útiles .................................................................................................................................40 3.2.7. Más información.........................................................................................................................................40 3.3. Acceso a Bases de Datos ..................................................................................................................................41 3.3.1. Abrir y cerrar una conexión........................................................................................................................41 3.3.2. Elegir una BD .............................................................................................................................................42 3.3.3. Interrogar a la BD.......................................................................................................................................42 3.3.4. Extraer información del resultado del query...............................................................................................43 3.4. A trabajar.........................................................................................................................................................44 4. Proyectos de PHP con bases de datos .....................................................................................................................47 5. Características y funciones adicionales ..................................................................................................................57 5.1. Módulos disponibles ........................................................................................................................................57 6. Bibliografía ..............................................................................................................................................................59

3

¿QUÉ OBJETIVOS ESPERA LOGRAR AL TÉRMINO DE ESTE MÓDULO?

¿QUÉ

COMPROMISOS

ASUME

PARA

QUE

LOS

OBJETIVOS

ANTERIORES SE CUMPLAN?

4

OBJETIVO GENERAL:

Al finalizar el modulo, el participante será capaz de crear páginas Web que interactúen con una base de datos. Esto implica insertar, modificar y consultar información almacenada en un gestor de base de datos a través de páginas Web. Obteniendo conocimiento y habilidades necesarias que le permitirán construir, diseñar, publicar y realizar un sitio Web dinámico.

TEMARIO

1. Conceptos Generales Introducción a PHP, Apache y mySQL. Instalación de apache, PHP y mySQL.

2. Programación fundamental Sintaxis de PHP. Qué es un script PHP. Variables, operadores y sentencias de control. Crear funciones propias en y utilizar arreglos. Funciones include() y require().

3. Librería estándar de PHP Acceder a archivos externos. Utilizar vectores y funciones de tiempo y fecha. Tratamiento de formularios. Expresiones regulares.

4. Trabajando con Bases de Datos Funciones de acceso a mySQL. Trabajando con una base de datos

5

corre en un sin numero de plataformas con un rendimiento a la altura de las mejores bases de datos comerciales. La combinación de PHP/MySQL es gratuita (sin restricción alguna sobre licencias) y es independiente de la plataforma. que mejor que lograrlo de una manera en la que nuestro trabajo pueda ser implantado en cualquier equipo. Cuando el servidor de Web encuentra elementos de PHP en una pagina HTML que ha sido solicitada por un navegador. Oracle.1. MySQL es una base de datos pequeña y compacta ideal para aplicaciones pequeñas y medianas. 6 . Si contamos con un sistema masivamente complejo de RDBMS (sistema administrador de bases de datos relacionales) es tan bueno. Introducción Seguramente si usted ha estado en contacto con el mundo de la informática habrá escuchado el concepto “open source software”. Por su parte MySQL fue premiada como la base de datos (libre) del año en el Webcon de 1998. Este movimiento ha ganado importancia a tal grado que compañías como Oracle. creación dinámica de archivos PDF y muchas mas. pequeño y sencillo. Solid. tanto en servidores con Microsoft Windows en cualquiera de sus “sabores y colores” hasta equipos mas sofisticados con sistemas operativos Unix también en cualquiera de sus modelos. Finalmente cabe mencionar que para ambos proyectos. pero el script PHP es ejecutado y los resultados de la ejecución del script son anexados al envío en lugar del código PHP original. y claro cualquier otra que sea capaz de operar vía ODBC. Informix y otras mas están tomando ventaja de los productos generados como software “open source”. PHP es un lenguaje para generación de “scripts” que han de ser colocados en un servidor de Web para ser funcionales. PHP tiene muchas otras cualidades. entre otras. Sybase. Y que decir del sistema operativo en bogue: Linux. PHP permite colocar código de programación incrustado en páginas HTML. tanto como si sabemos que hacer con él. PostgreSQL. Es además fácilmente extensible. Errores y problemas en ambos productos son solucionados con una rapidez considerable y nuevas características se implementan día con día. el uso de XML.netcraft. la creación dinámica de imágenes.500 sitios en junio de 1998 a 410. Tan profundo como para realizar un sitio Web sustentado en información dinámica. Una encuesta de Netcraft (www. Una maravilla desde el punto de vista de algunos desarrolladores. Y si hemos de aprender ha hacer eso.com) muestra que el uso de PHP creció de 7. Nosotros solo daremos una introducción al mundo de las bases de datos. envía los elementos HTML intactos. Con soporte para el estándar SQL. PHP y MySQL existe una gran cantidad de información y documentación disponible en la Web. Sin embargo PHP también soporta otras plataformas de base de datos incluidos Informix.000 en marzo de 1999. permitir la autenticación de usuarios.

0 es una buena opción.mysql. Instalación de la base de datos: MySQL Comencemos por obtener el software que necesitamos para trabajar. en este momento MySQL 4. así que seleccionemos la versión Windows 95/98/NT/2000/XP/2003 y tomemos un descanso mientras los 22.zip o alguno similar con una numeración distinta. según la versión descargada. Claro recuerde que la cercanía física no significa necesariamente una mayor rapidez de transferencia por la red.exe en el subdirectorio bin bajo el directorio donde realizaste la instalación del producto. Instalación de nuestras herramientas. Por ejemplo C:\mysql\bin\winmysqladmin.1.2. Localiza el archivo winmysqladmin.exe Sigue las indicaciones en pantalla. Proporciona el que desees y procura no olvidarlo.0. Para nuestros fines la instalación básica de MySQL es suficiente. Siendo MySQL un software de uso tan difundido. Si todo va bien en este momento veras sobre la barra de inicio de Windows un icono como esto: 7 . Si todo va bien tendrás en tu equipo un archivo llamado mysql4. 1.exe Ejecuta el archivo.16-win. Para obtener mayor información de las diferentes opciones de instalación consulta la documentación de MySQL en el sitio Web www. quien se encarga de hospedar nuestro sitio Web. sobretodo si deseamos realizar una instalación de estos productos en nuestra computadora personal para aprender a utilizarlos.1. lo más factible es que usted al igual que yo tenga a su alcance una computadora con Microsoft Windows para comenzar a trabajar. La primera ocasión que lo ejecutes te solicitara crear tu clave de administrador. Descompacta el archivo y ejecuta setup. cuando el Web se lo pregunte elija el más cercano a usted. Comencemos por la base de datos. Tomemos una versión estable. Aunque podríamos experimentar con cualquier plataforma. Será sencillo para usted ingresar a la sección etiquetada “downloads” para descargar el software que requerimos.com. Realmente no necesitamos preocuparnos por el proceso de instalación la mayor parte de las veces dejaremos esta labor a nuestro proveedor de acceso a Internet. Sin embargo es adecuado conocer el proceso involucrado.mysql.7 Mb del software se transfieren a nuestro equipo.com. así que selecciona la opción “instalación típica” para evitar detalles y complicaciones. El sitio Web oficial de MySQL se encuentra en www. es de entenderse que exista mas de un nodo en Internet desde el cual podamos obtenerla. En este momento es buena idea reiniciar la computadora para que la instalación sea concluida satisfactoriamente.

ya contamos un sistema gestor de base de datos. A fin de poder operar PHP debe trabajar de la mano del servidor donde se hospedan las hojas Web. Así que para poder elaborar scripts PHP y probarlos requerimos o bien contar con acceso a un servidor Web que contratemos con un proveedor de servicios o bien instalar uno propio. Instalación del servidor Web: Apache Como comentamos en la introducción. Sin embargo es buena idea tomar la versión mas reciente disponible.47 Para nuestros fines cualquiera de las versiones disponibles resulta de utilidad. Apache es el servidor de Web mas utilizado en Internet. Ingresemos al sitio oficial de Apache en www. el archivo apache_2.org y localicemos el enlace a Httpd server Apache 2. El elegido es el servidor Web Apache. estadísticas del sitio Web de Netscraft colocan a Apache con un 66% de sitios en la red. Descarguemos el archivo con el servidor compatible con Windows. Una vez descargado el archivo. ahora requerimos instalar PHP. que nos indica podemos continuar con nuestra labor. Estamos a la mitad del camino.msi con aproximadamente 5.0. 8 . simplemente confía en la configuración que te propongo. doble clic en el para comenzar con el proceso de instalación.Un semáforo con la luz verde.0.apache.80 Mb de tamaño. 1. PHP es un lenguaje que permite incrustar código de programación en hojas de Web. Sigamos tomando ventaja del software “open source” y ahora descarguemos un servidor de Web o servidor de http. por el momento podemos instalar uno en nuestra computadora. Aceptemos la licencia y proporciona los siguientes datos en la ventana de configuración: Dominio: localdomain Nombre del Servidor: localhost Correo del administrador: <escribe aquí tu correo electrónico> Apache es un software que por si mismo requeriría una explicación aparte.47-win32-x86-no_ssl.3. Dado que sale del alcance de este modulo. Si bien para publicar nuestro sitio Web oficial requeriremos de contratar un espacio con un proveedor de servicios de Internet.

revisemos nuestra barra de inicio en Windows. Concluida la instalación. Un nuevo icono confirma que el proceso es exitoso y podemos continuar Para confirmar abre un navegador en tu computador y conecta la siguiente dirección: http://localhost/ La siguiente página aparecerá y nos invita a continuar el proceso 9 .Una vez completa la pantalla mostrada clic en el botón seguir y cuando el proceso de instalación te lo pregunte elige la instalación “típica”. Ello es suficiente para nuestras necesidades.

Descargaremos de ahí en particular de la sección Windows el paquete php-4. En mi equipo tengo en este momento las carpetas: C:\mysql C:\Apache2 C:\php 10 . veamos ahora el proceso a seguir para contar con PHP.php. También parte de la familia “open source” PHP puede ser descargado del sitio Web www.1Mb serán transferidos a nuestra computadora Toma el paquete u descompactalo en una carpeta de tu computador. Instalación de PHP Instalar el gestor de base de datos MySQL fue relativamente sencillo al igual que el servidor de Web.3Win32.net.3. Te recomiendo coloques el fólder en el mismo sitio donde has estado instalando el resto de los paquetes.4.1. aproximadamente 6.zip.

En tu menú de inicio encontraras bajo la opción de programas.conf que se encuentra en el fólder c:\Apache2\conf LoadModule php4_module D:/php/sapi/php4apache2. de forma tal que nuestro servidor Web pueda reconocer y ejecutar las instrucciones que se le darán empleando el lenguaje PHP. pongamos eso a trabajar! 11 .Te recomiendo descmpactar php en la unidad c en un fólder llamado php. Recapitulando: En este momento tenemos operando en nuestra computadora un gestor de base de datos (MySQL). Será necesario que añadamos las siguientes líneas en el archivo httpd.dll cópialo en el directorio Luego renombra el archivo php. un servidor de Web (Apache) y un lenguaje de programación para Web (PHP). Si decides utilizar una ruta distinta. En el directorio php c:\windows\system se encuentra el archivo php4ts. Hasta aquí hemos terminado con la configuración de nuestro ambiente de trabajo. El archivo install. las herramientas detener y ejecutar para Apache http Server. Podemos tomar un pequeño receso.c AddType application/x-httpd-php . Como para cualquier otro software la mayoría de las veces no requerimos ser expertos en la instalación de los productos para poderlos utilizar adecuadamente.dll # AddModule mod_php4. Sin embargo comentaremos a continuación los pasos a seguir. recuerda cambiar “C:\php” por el directorio por ti utilizado en todos los pasos mencionados a continuación como parte del proceso de instalación.txt ubicado en el c:\php explica el proceso de instalación a detalle.php Para que los cambios tomen efecto.ini-dist como php.ini y cópialo en el directorio c:\windows Hecho lo anterior solo nos resta conectar nuestra instalación de PHP con la instalación del servidor Web Apache. será necesario detener nuestro servidor de Web y ejecutarlo nuevamente. ¡Ahora.

2. . </script> <% echo 'Método de compatibilidad con ASP'. A continuación analizaremos en detalle estas diferencias al tiempo que vamos introduciendo las bases de la programación en PHP.php4 Indica código PHP 4. salvo unas pocas excepciones.2. La extensión es importante ya que el servidor HTTP (en nuestro caso. 2. ?> <?php echo 'Segundo método. Las extensiones que indican al servidor HTTP que el archivo contiene código PHP que debe ser procesado son: • • • • . Apache) decide si debe pasárselo al procesador de PHP o no en función de esta extensión. El lenguaje PHP PHP toma características de lenguajes como C. En general. Este curso se centra en PHP 4. el más usado'. C++ y Java. PHP 4 es compatible con 3. Así nuestros programas se verán con una estructura como esta: <html> <body> <?php if ( Hour(time)>20 || Hour(time)<4) { ?> Buenas noches. . Preferiremos esta extensión por ser más genérica. y algunas también de Perl. no tienen efecto en el intérprete que las procesará IGUAL. ?> <script language="php"> echo 'Algunos editores (como el FrontPage) Sólo entienden este método'. ya que se pueden activar o desactivar al compilar el intérprete de PHP.php3 Indica código PHP 3. preferiremos usar el segundo método. Aunque haya extensiones diferentes para PHP 3 y 4.x. Delimitadores En PHP disponemos de cuatro opciones para delimitar el código: <? echo 'Primer método de delimitar código PHP'. 2. Extensión de los archivos La primera característica de PHP viene a la hora de dar nombre a los archivos que contienen el código del programa.php Indica código PHP. %> Los métodos primero y cuarto no siempre estarán disponibles. 12 . . así que no analizaremos estos casos de incompatibilidad con las versiones anteriores. En general.1.phtml Actualmente en desuso.x.

Cubren hasta el final de la línea. Comentarios En PHP hay tres formas de introducir comentarios en el código: /* Comentarios estilo C. Por ejemplo.3. time()) ). } ?> </body> </html> También es factible imprimir de forma rápida con <%=$var%>.”.4. Fin de línea PHP ignora cualquier carácter de espaciado presente en el código. 2. incluyendo espacios. <?php }?> </body> </html> O también así. # Comentarios estilo Bash/Perl. time() ) ) . utilizando la función echo para imprimir cadenas de texto: <html> <body> <?php if ( Hour(time)>20 || Hour(time)<4) { echo “Buenas noches. 2.”. los dos trozos de código siguientes son equivalentes: print( date("M d. Cubren hasta el fin de línea. Hay que hacer notar que los comentarios de una línea cubren hasta final de línea O HASTA EL FIN DEL BLOQUE PHP ( ?>) 13 . } else { echo “Buenos días. El fin de sentencia se marca con un carácter de punto y coma.<?php } else { ?> Buenos días. print ( date( "M d. al igual que en ASP. */ // Comentarios estilo C++. tabuladores y saltos de línea (salvo si se encuentran dentro de una cadena de texto). * Pueden extenderse durante varias líneas. Y H:i:s". Y H:i:s".

en PHP NO hace falta declarar las variables antes de usarlas: tras la primera aparición en el código quedan declaradas. una misma variable se puede reutilizar asignándole a lo largo del tiempo datos de distinto tipo. se pueden comparar entre sí y se puede hacer variar el flujo del programa en función de su valor. En el ejemplo anterior.5. Visto de otra forma. En este caso $mivar comienza almacenando la cadena “3”. PHP convierte el valor entero 123 a la cadena de texto “123” antes de pasárselo a la función echo. $mivar = 123. $var_2 = ’hola’. // cadena de texto’. Ahora un float. Por ejemplo: $mi_variable $mi_variable $mi_variable $mi_variable = = = = ’Inicializamos como una 3.5. En la segunda línea.2. en PHP todas las variables llevan delante el signo del dólar ‘$’. $var_3 = $var_1 * 2. Variables Las variables son una parte fundamental de todo lenguaje de programación. el tipo es importante en algunos casos (para efectuar operaciones o llamadas a funciones. estando el tipo indicado en el contenido. no en la variable en sí. // 3. Tipos de variables Las variables en PHP están débilmente tipadas. por ejemplo: $mivar = (string)123. A pesar de esto.5. También se puede forzar la conversión a un tipo específico.1. PHP se encarga de realizar las transformaciones necesarias de forma automática.14 * $mi_variable. Declaración y uso Al contrario que en la mayoría de lenguajes de programación. Vamos a ver cómo trabajar con variables en PHP. : $var_1 = 123. echo $mivar. Ej. // new MiClase(). $mivar = ’3’. 14 . y para realizar la suma. Una variable se asocia a un contenido. 2. se realiza la suma y se asigna a $mivar el entero 5. $mivar = 2 + $mivar. del tipo que sea. Ahora un objeto. En ellas se almacenan valores con los que se puede operar. 2.2.) En estos casos. se convierte al entero 3. Ahora es un entero.

Y se puede cambiar el tipo de una variable con: $mivar = 12. En cambio en PHP no imprimiría nada (si no da un error) ya que la variable $mivar de mifuncion es una variable DISTINTA a la global y local a esta función. settype($mivar. Dentro de una clase. 2.) En una función. Las modificaciones hechas sobre una u otra repercuten en el mismo dato. ya que no se comportan como en C. y depende del contexto en el que haya sido definida la variable: • • • En el cuerpo de un archivo.5. Debe quedar claro que la referencia no significa 15 . Ámbito El ámbito de una variable hace referencia a dónde está disponible esa variable y dónde no.4. tener dos (o más) nombres distintos para un mismo dato. funciones. echo $mivar. Referencias En PHP se puede definir “alias” para las variables. Por ejemplo. considérese el código siguiente: $mivar = 3. introduciremos ya una posible fuente de errores: Los programadores acostumbrados a C deben llevar cuidado con las variables globales.) Aunque todos estos conceptos (includes. Para definir una referencia utilizamos el carácter ‘&’ delante de la variable referenciada: $alias = &$variable Así podremos acceder al mismo dato por $alias o $variable. son LOCALES a esa función y no pueden ser accedidas desde fuera. las variables son GLOBALES al archivo y a cualquier código que se haya incluido con los comandos “include” o “require” (explicados más adelante. es decir. } En C. la función mifuncion() imprimiría '3'. function mifuncion() { global $mivar. sólo pueden ser accedidas a través del operador “->” sobre el nombre del objeto (las clases se explicarán con detalle más tarde. hay que utilizar la palabra reservada global: $mivar = 3. "double"). clases) los presentaremos más tarde. } 2. Se puede ver de forma similar a tener dos punteros en C haciendo referencia a la misma zona de memoria.5.3. Para acceder a las variables globales desde una función. function mifuncion() { echo $mivar.

como se verá más tarde. double. expresado en octal Valor hexadecimal del 18 El tamaño. de esta forma: $a = 123.6. negativo El 83 decimal. // Número con decimales // Notación científica. // Pero $b sigue valiendo 1 Las referencias también se pueden usar para pasar o devolver parámetros por referencia en las funciones. $var2 = 1.5. echo $$b. Se permiten las dos notaciones típicas: $var1 = 1. 0123. Se puede eliminar una referencia con la función unset(): $a = 1.6. -1234.) 2. si no que tanto $alias como $variable “apuntan a” un mismo contenido en memoria.2 * 10^3 Internamente se representan mediante 64 bits en formato IEEE (hasta 1. representación interna y valores máximos dependen de la plataforma. // 123 2. a costa de cierta pérdida de precisión en los dígitos menos significativos del número.234.6. 2.8e308 con una precisión de 14 dígitos decimales.1. Acceso indirecto En PHP podemos acceder al contenido de una variable cuyo nombre tenemos almacenado en otra variable. Enteros (int.2.2 billones. integer) Números enteros en notación decimal. Números en punto flotante (float.5. 1. octal (un 0 inicial indica que el valor está representado en octal) o hexadecimal (un 0x indica que es hexadecimal. $b = ‘a’. aunque lo normal son 32 bits con signo (+.) Ejemplos: $var1 $var2 $var3 $var4 = = = = 1234. 0x12.) 16 . $b = &$a.2e3. unset ($a). real) Los números en punto flotante admiten decimales y su rango de valores es mayor que el de los enteros.que $alias “apunta a” $variable. // // // // Número en decimal El mismo número. Tipos de datos PHP soporta los siguientes tipos de datos básicos: 2.

3 => 8. Como se ve en el ejemplo. 5). Arrays (array) Los arrays representan vectores unidimensionales o multidimensionales. : $MiArray[0] = 1.2. // 8 // Homer Para definir un array multidimensional. por lo tanto. Ej.3. $MiArray[1] = “hola!!”. echo $MiArray[1]. echo $MiArray[“nombre”]. no hace falta definir la dimensión del array antes de usarlo. de forma simultánea a los enteros. 2 => 5. $MiArray[2] = 5. Los elementos de un mismo array pueden ser de tipos distintos. “hola”. p. donde indicamos explícitamente el índice: $YOtroArray = array( 0 => 1. así: $OtroArrayMas = array( 1. “nombre” => “Homer” ). También podemos definir arrays utilizando los constructores del lenguaje array() o list(). 1 y 2. mediante el nombre de la variable que los contiene e indicando el índice (que comienza en el 0) entre corchetes. Un mismo array puede funcionar a la vez de forma indexada (como un vector) o de forma asociativa (como una tabla hash): $MiArray[“nombre”] = “Homer”. 1 => “hola”.6. 17 . ni. Donde los valores se asignan por orden a los índices 0. echo $MiArray[3]. Se definen y acceden como en C. o de esta otra forma. Siguiendo con el ejemplo anterior: $MiArray[] = 8 // $MiArray[3] = 8 Los arrays de PHP admiten también cadenas como índices. tampoco redimensionarlo a la hora de añadir más elementos. simplemente indicamos más índices: $MiOtroArray[1][2][“pepe”][0] = “4 dimensiones!!!”. Si al definir un array omitimos el índice (pero NO los corchetes. el elemento se asigna a la siguiente posición del array sin definir. ¡estaríamos sobrescribiendo la variable!).

Por ejemplo: $cadena = <<<FINCAD Esto es un ejemplo de cadena como “here doc”.Se pueden definir arrays multidimensionales mediante composición de varias llamadas anidadas al constructor array(). 2. Para finalizar la cadena.. podríamos acabar con un resultado incorrecto. Debemos llevar cuidado al elegir este delimitador. Utilizando la sintaxis “here doc” de Perl. cuya estructura es: $cadena = <<<DELIMITADOR texto texto texto . texto DELIMITADOR Después del operador “<<<” especificamos un delimitador que marcará el final del texto.3} Significado Nueva línea (LF ó 0x0A en ASCII) Retorno de carro (CR ó 0x0D en ASCII) Tabulación horizontal (HT ó 0x09 en ASCII) Barra invertida Símbolo del dólar Dobles comillas Un carácter determinado en notación octal \x[0-9A-Fa-f]{1. Ahora vamos a finalizar la cadena: FINCAD • 18 . ya que el análisis y proceso al que son sometidas las es menor. Además. que puede expandirse por tantas líneas como queramos. Tras la línea con el “<<<” y el delimitador.4. debe aparecer una línea que contenga únicamente el delimitador.6. este segundo método es bastante más rápido que el primero a la hora de manipular o imprimir cadenas. escribimos la cadena de texto. La variable \$a vale $a. se expandirá cualquier variable que haya dentro de la cadena.) Debido a estas limitaciones.. Cadenas de texto (string) Las cadenas en PHP se pueden definir de tres formas: • Si se delimitan entre comillas dobles (”). se pueden incluir ciertas secuencias de escape. las variables no se expanden y además las únicas secuencias de escape que se reconocen son “\\” y “\'” (barra invertida y comillas simples. al igual que en C: Secuencia \n \r \t \\ \$ \" \[0-7]{1. ya si aparece en algún lugar del texto. Las variables dentro del texto se expanden y no hace falta escapar las comillas.2} El carácter indicado en hexadecimal • Si se delimitan entre comillas simples (’).

• puede accederse a ellas desde cualquier parte del código donde han sido definidas..”. • sólo pueden contener valores escalares. 2. Se puede acceder a cada carácter de la cadena de forma independiente utilizando notación de arrays indexados sobre la cadena: $cad2 = “El tercer carácter de \$cad es ‘$cad[2]’. aunque con ciertas carencias respecto a otros lenguajes.6. valor su valor. 2. podemos concatenar la cadena con el valor de la variable o encerrar la variable entre llaves: echo “Esto no irá bien $a[1][3]”. mientras que si está a 0 (valor por defecto) sólo podremos acceder a ella de la misma forma como la hayamos definido. Las clases y objetos en PHP se definen y usan de forma similar a C++ o Java. Por último. no vectores. con construcciones complejas (arrays multidimensionales. echo ‘La constante SALUDO vale ‘ . mixed valor [. mundo!’). objetos.’ : $cad = ‘A esta cadena ‘. Las constantes en PHP se diferencian de las variables en que: • no llevan el símbolo del dólar delante. y el campo opcional noMayusculas indica si está a 1 que podemos acceder a la variable independientemente con mayúsculas o minúsculas.7. $cosa->valor. cuya declaración es: int define(string nombre.’. SALUDO. 19 . ‘Hola. señalar que aunque como ya hemos dicho en una cadena delimitada por dobles comillas se expanden las variables.Para concatenar cadenas se utiliza el operador ‘. int noMayusculas]) Donde nombre es el nombre que le queremos dar a la constante. Objetos (object) Pese a no ser un Lenguaje Orientado a Objetos puro..) la expansión NO siempre funciona bien.5. Para evitar problemas. • no pueden ser redefinidas o borradas una vez definidas. Un ejemplo de declaración y uso de constantes en PHP sería: define(‘SALUDO’. sin restricciones de ámbito como en las variables. $cad = $cad . Se estudiarán con profundidad en la segunda parte de este curso. echo “Así no hay problemas {$a[1][3]}”. echo ‘Concatenar es otra alternativa ‘ . PHP soporta clases y objetos. Constantes En PHP podemos definir constantes utilizando la función define(). ‘le vamos a añadir más texto.

las mayúsculas y minúsculas IMPORTAN. y después lo Pre-decremento Decrementa $a en 1. Auto-incremento y auto-decremento PHP también dispone de los típicos operadores de auto-incremento y decremento de C: Operación Nombre ++$a $a++ --$a $a-Pre-incremento Post-incremento Resultado Incrementa $a en 1. Multiplicación Producto de $a y $b. 2. y $b 2. Cociente de $a y $b. y después lo devuelve. Operadores Vamos a ver los distintos operadores disponibles en PHP. incrementar). Resto de la operación $a / $b. En PHP tenemos un comportamiento mixto: • • En las variables.9. Post-decremento Devuelve $a. En los nombres de funciones y palabras reservadas. y las funciones propias siempre tal y como se escribieran en la declaración. y después lo incrementa en 1. -> $a vale 2. he aquí un ejemplo para clarificarlo: $a = 1. $a = 1. Por si alguien no está familiarizado con el funcionamiento de estos operadores. La función PRINT() hace referencia a print().9. // $b = $a. $b = $a++. $b = $a. Para evitar errores y confusiones.$b $a * $b $a / $b $a % $b Suma Resta División Módulo Resultado Suma de $a y $b. Así.2. y devuelve $a (ya incrementado) Devuelve $a (sin incrementa en 1.9. $a 2. Operadores aritméticos Disponemos de los clásicos operadores aritméticos: Operación Nombre $a + $b $a . 2. Diferencia entre $a y $b. la variable $MiVar es distinta de $mivar. las mayúsculas NO IMPORTAN.1. Mayúsculas y minúsculas Esta puede ser una causa de problemas. $a = $a + 1.2. 20 . clasificados por tipos: 2.8. $b = ++$a. -> $b vale 1. siempre escribiremos los nombres de funciones del sistema en minúscula. // $a = $a + 1.

) Desplaza $b posiciones a la izquierda todos los bits de $a. pero no en ambos. Izq. Cierto si $a o $b es cierto. ($var1 == $var2) ($var1 == $var3) ($var1 === $var2) ($var1 === $var3) // Asignación // // // // Cierto.9. Se ponen a 1 los bits que están a 1 en $a o $b.5. el tipo no coincide 21 . La razón de que haya dos operadores distintos para las operaciones Y y O lógicas es que tienen distinta precedencia (ver punto 2. el tipo coincide. Compara si el valor es el mismo y. Asignación. pero no ambos. $var2 = 1. Se ponen a 1 los bits que están a 1 en $a o $b. Resultado Se ponen a 1 los bits que están a 1 en $a y $b.9. Compara si el valor de los dos operandos es el mismo. $var3 = “1”. son idénticas FALSO. además. Cierto si $a o $b es cierto. Cierto si $a o $b es cierto. 2. Desplaza $b posiciones a la derecha todos los bits de $a. $a === $b Identidad Ejemplo: $var1 = 1.) 2.3.9. Operadores de bits Veamos ahora los operadores BIT a BIT de que dispone PHP: Operación Nombre $a & $b $a | $b $a ^ $b ~ $a $a << $b $a >> $b Y O O Exclusivo No Desp.4. Drch.2.9. Operadores lógicos Los operadores lógicos realizan operaciones dependiendo del valor booleano de los operandos. Cierto si $a y $b son ciertos. Desp. O Exclusivo. igualdad e identidad En PHP hay tres operadores distintos para asignar y comparar valores entre variables: Operación Nombre $a = $b $a == $b Asignación Igualdad Resultado Asigna el valor de una variable o expresión del segundo término a la variable del primer término. Operación Nombre $a and $b Y $a or $b $a xor $b ! $a $a && $b $a || $b O No Y O Resultado Cierto si $a y $b son ciertos.8. Se invierten los bits (se cambian 1 por 0 y viceversa. son iguales Son iguales (tras la conversión) Cierto. Cierto si $a es falso.

9. ‘ es ‘ . o expr3 si expr1 se evalúa a falso. Tras esto $var1 vale ‘2’. Cierto si $a es estrictamente menor que $b.’. en PHP se utilizan “!=” y “!==”. También se puede englobar aquí el operador condicional “?:”. Para expresar la desigualdad. o si no tienen el mismo tipo. $a + b. } else { echo ‘distintas’. $a .7. $var2 = 2. Ej. 2. Cierto si $a no es igual a $b. ya que puede llevar a errores de este tipo: $var1 = 1. 2. Para operar con cadenas sólo disponemos de un operador: la concatenación de cadenas representada por el punto ‘. if( $var1 = $var2 ) { echo ‘iguales’. Esta expresión devuelve expr2 si expr1 se evalúa a cierto. Cierto si $a es estrictamente mayor que $b.Se debe tener mucho cuidado con esto.6. $c = ‘El resultado de ‘ . que funciona como en C y otros lenguajes: (expr1) ? (expr2) : (expr3). ‘ + ‘ . $b . lo que estamos haciendo es asignar el valor de $var2 a $var1. } En PHP como ‘=’ es el operador de ASIGNACIÓN y no el de IGUALDAD. Mayor o igual que Cierto si $a es mayor o igual que $b. Operadores de cadenas de texto. Operación Nombre $a != $b No igual Resultado Cierto si el valor de $a no es igual al de $b. $b = 2. Por ejemplo: $cad = $a > $b ? “a es mayor que b” : “a no es mayor que b”.9. Comparaciones Devuelven cierto o falso según el resultado de comparar los dos operandos. que como es distinto de 1 se evaluará a CIERTO. : $a = 1. $a !== $b No idéntico $a < $b $a > $b $a <= $b $a >= $b Menor que Mayor que Menor o igual que Cierto si $a es menor o igual que $b. 22 .

// $var1 = $var1 + 3.9. en una sola operación. y está ordenada en orden decreciente de precedencia (el más prioritario primero): Asociatividad Operandos izquierda izquierda izquierda izquierda derecha izquierda izquierda izquierda izquierda izquierda izquierda izquierda no-asociativo . operar sobre una variable y asignarle a esa misma variable el resultado. Por ejemplo.9. $var2 /= 2.8. or xor and print = += -= *= /= . $var3 >>= 1. 1 + 5 * 3 en PHP daría como resultado 1 + (5 * 3) = 16 y no (1 + 5) * 3 = 18 ya que el producto tiene mayor precedencia que la suma. en PHP disponemos de una serie de “atajos” para. >> y << resultando en los nuevos signos de operación-asignación: += -= *= /= %= &= ^= .) 2. 2.= %= &= |= ^= ~= <<= >>= ?: || && | ^ & == != === !== 23 . C++ y Java. // $var2 = $var2 / 2. Las operaciones susceptibles de ser usadas en estos atajos son: + . Precedencia y asociatividad de operandos La precedencia de los operandos resuelve el orden en el que se evalúa una expresión múltiple que no ha sido delimitada con paréntesis. Antes de cada concatenación se realizarán las conversiones de tipo que fueran necesarias (en el ejemplo.= >>= y <<= Ejemplos de uso: $var1 += 3. La tabla muestra la asociatividad de los operandos en PHP. los enteros se convierten a cadenas. Atajos en la asignación Al igual que en C.Que dejaría en $c la cadena “El resultado de 1 + 2 es 3”.* / % & ^ .9. // $var3 = $var3 >> 1.

1. sólo hay que ponerlas para agrupar si hay más de un comando. A pesar de este carácter optativo es aconsejable acostumbrarse a ponerlas siempre. y además algunas otras estructuras más típicas de lenguajes interpretados como Perl o Bash.10. En todos los casos. En su forma más simple. o cualquier combinación de éstas con los operadores vistos en el punto anterior. una constante.. se ejecutan los comandos y después se sigue ejecutando el resto del programa. Estructuras de control Las estructuras de control permiten alterar el flujo del programa y así ejecutar unas partes u otras del código según ciertas condiciones. Estas expresiones pueden ser una variable. if . su sintaxis es esta: if (expresión) { comandos } resto Su funcionamiento es idéntico al de la mayoría de los lenguajes. 2. ya que si al continuar el desarrollo se decide añadir un segundo comando (o varios) tras la condición es fácil olvidarse de añadir las llaves y el resultado sería incorrecto. elseif . no se ejecutan los comandos y continúa con el resto. con la sintaxis de C. */% ! ~ ++ -. aunque sólo haya un comando que ejecutar.. Las llaves ‘{‘ y ‘}’ no son necesarias (ni en el if ni en ninguna otra sentencia de control) si sólo hay un comando que ejecutar tras la condición. Si se evalúa a falso.. una función (el valor que devuelve).Asociatividad Operandos no-asociativo izquierda izquierda izquierda derecha derecha no-asociativo < <= > >= << >> +-.(int) (double) (string) (array) (object) @ [ new 2. salvando las diferencias sintácticas: Si expresión se evalúa a cierto. A una sentencia if le podemos añadir código que se ejecute cuando la condición no se verifica mediante la sentencia else: if (expresión) { comandos_cierto } else { comandos_falso } 24 . PHP dispone de todas las estructuras clásicas de los lenguajes de alto nivel.. else El condicional if es la estructura de control más básica de todas. C++ o Java. las estructuras de control contienen una expresión cuya evaluación a cierto o falso determinará el flujo a seguir dentro de la estructura.10.

Si expresión se evalúa a cierto.2. se ejecuta comandos_falso. La estructura de un bucle while es esta: while (expresión) { comandos } Y el resultado es que se estará ejecutando toda la serie de sentencias especificada en comandos mientras que expresión se evalúe a cierto.. evalúa expresión3. se ejecuta comandosElse (este último else es optativo. podemos encadenar varias condiciones con la sentencia elseif.... después se continúa con el flujo normal del programa. aunque expresión se evalúe a falso. ejecuta expresión2.. condición se evalúa a falso. Por último. y continúa así hasta que alguna de las condiciones de un endif se verifique. La estructura de do . Si no se verifica ninguna. En ambos casos luego se ejecuta el resto de comandos que sigan a la instrucción if. Si se evalúa a falso.. Con esto lo que se consigue es que al menos la iteración se realice siempre una vez.) La estructura do . ejecuta comandos1. comandos no se ejecuta. while representan ciclos que se ejecutan mientras se verifique una determinada condición. 2.10. Si es cierta. while puede ser vista como una variante de while en la que la comprobación de la condición se realiza al final de cada iteración del bucle en lugar de al principio. evalúa expresión2. de esta forma: if (expresion1) { comandos1 } elseif (expresion2) { comandos2 } elseif (expresion3) { comandos3 } . Llegados a este punto hay que hacer notar dos detalles: • • Si la primera vez que el flujo del programa llega a la sentencia while. while y do . Si no. elseif (expresionN) { comandosN } else { comandosElse } El flujo del código comienza evaluando expresión1. while Las estructuras de control while y do .) En cualquier caso. while es esta: 25 . el código entrará en un bucle infinito (a no ser que algún proceso externo sea el encargado de variar el valor de expresión.. se ejecutan comandos_cierto.. Si no. Si expresión se evalúa a cierto y dentro de comandos no se modifica el valor de alguna de las variables contenidas en expresión. Si es cierta.

} } } Por su parte. } En el ejemplo se saltaría el echo de la iteración $a = 2.do { comandos } while (expresión).”. sale del while b } } while ($b < 5) { if ($a == 3 && $b == 3) { break 2. } $a++.3. // Saldría de los DOS bucles. break y continue La sentencia break nos permite salir inmediatamente de una estructura de control while. Por ejemplo. Por defecto es uno (salir del bucle más interno) : $a = 0. for o switch. el siguiente bucle while finalizaría en la iteración $a = 5. // Equivale a “break 1”. } Después del break podemos especificar un parámetro. el número de niveles de bucles anidados de los que queremos salir. la sentencia continue lo que hace es saltarse el resto de la iteración actual. y pasar directamente a la siguiente: $a = 0. while ($b < 5) { if ($b == 2) { break.10. while ($a < 10) { if ($a == 5) { break. 2. pese a que la condición del while es $a < 10: $a = 0. while ($a < 5) { if ($a == 2) { continue. y el resultado sería: $a $a $a $a vale vale vale vale 0 1 3 4 26 . while ($a < 10) { $b = 0. } echo “\$a vale $a.

continuando la ejecución del programa con el resto del código de después del for. Mientras que expresión2 se evalúe a cierto. al principio. el bucle estará iterando. con lo que el código se podría rescribir así: for ($factorial5 = 1. Los cuatro ejemplos siguientes tienen el mismo resultado: muestran los números del 0 al 10. cuando el flujo del programa llega al bucle. y generalmente modifica el valor de alguna variable (separadas por comas si hay más de una). 27 . for ($i = 2. aunque en este caso tendremos que llevar cuidado de realizar su función en el cuerpo del bucle. $i++ ) { $factorial5 *= $i. expresión3 es el paso de iteración. $i = 2. for Los bucles for son los más complejos de que dispone PHP.10.2. Sólo se ejecuta una vez. Generalmente da un valor inicial a una o varias variables (separadas por comas). expresión2 es la condición. • Cualquiera de las tres expresiones puede estar vacía. $factorial5*=$i. $i++). Se evalúa al inicio de cada iteración. Su estructura es la misma que en C: for (expresión1. Se ejecuta después de cada iteración. en expresión3 también podemos operar sobre varias variables separándolas con comas. $i <= 5. En expresión1 podemos inicializar varias variables separándolas con comas. Esto es un ejemplo tanto de la potencia de los bucles for.4. $i <= 5. con lo que podríamos encerrar todo el código del bucle en la línea for de esta forma: for ($factorial5=1. $i++ ) { $factorial5 *= $i. $i=2. y si no se verifica la condición la siguiente iteración ya no se realiza y finaliza el bucle. Ejemplos: $factorial5 = 1. expresión3) { comandos } Donde: • • expresión1 es la iniciación del bucle. } Por último. } El bucle anterior calcula la factorial de 5 (5!). expresión2. $i<=5. En general no se debe complicar tanto un bucle for porque como se ve se pierde bastante en la claridad del código. como de un mal uso (abuso) de ellos.

$i <= 10. } /* ejemplo 3 */ $i = 1. 2. se coloca en $variable un elemento de array./* ejemplo 1 */ for ($i = 1.5. De nuevo.. } /* ejemplo 4 */ for ($i = 1. Su sintaxis es esta: foreach (array as $variable) { comandos } En cada iteración del bucle. foreach El bucle foreach es nuevo en PHP 4. } El resultado sería: 28 . $i++) . print $i. 3. en la que a una variable se le van asignando todos los valores de una lista. for (. $i <= 10.) { if ($i > 10) { break. algunos de estos ejemplos (en especial el último) no lo son de buenas costumbres de programación. } /* ejemplo 2 */ for ($i = 1.$i++) { if ($i > 10) { break.\n".. $i++. 2. $i++) { print $i. 17). y representa una estructura de control típica de lenguajes interpretados como Perl y Bash. comenzando por el primero y siguiendo un orden ascendente. } print $i. pero sí de la potencia y flexibilidad del bucle for. } print $i. Por ejemplo: $a = array (1.10. foreach ($a as $v) { print "Valor actual de \$a: $v.

sólo la última. } Si $i vale 1. Cuando se termina de ejecutar el código de un case. case 2: echo “Código del 2”. ahora con una cláusula default: switch ($i) { case 0: case 1: 29 . sólo la tercera. Y si vale 4. Si vale 2.6. En caso de que no se cumpla ninguna. uno detrás del otro. si no se finaliza el switch explícitamente con un break. case 3: echo “Código del 3”. la segunda y la tercera.. hasta que se llegue al final del bloque switch o se finalice este con un break. Si vale 3. se imprimirán las tres primeras cadenas. break. El comportamiento sería similar a tener un if por cada case.10. switch Su sintaxis es: switch (variable) { case valor1: comandos1 case valor2: comandos2 .. case 4: echo “Código del 4”. case valorN: comandosN default: comandosDefault } El flujo procede linealmente de arriba a abajo. y ejecutando el código asociado si se cumple la condición.Valor Valor Valor Valor actual actual actual actual de de de de $a: $a: $a: $a: 1 2 3 17 2. Por ejemplo: switch ($i) { case 1: echo “Código del 1”. se continúa ejecutando el código del siguiente case aunque no se cumpla la condición. comparando con cada valor de los case. se ejecuta el código asociado a la cláusula default. Otro ejemplo del funcionamiento del switch.

break. pero no negativa”. break. break. mientras que si tiene algún elemento lo hace a CIERTO. if( $x ) // se evalúa a cierto Para objetos. } 2. if( $x ) $x = 0. que como ya hemos visto se evalúa a FALSO. Class Yod {} // clase vacía $x = new Yod(). $x = "hello". 0 es FALSO. if( $x ) $x = "". "b". lo que lleva a varios tipos de conversión: Para los valores numéricos. Para arrays: un array vacío se evalúa a FALSO. default: echo “i mayor que 4 o negativa”. En PHP se puede evaluar de esta forma cualquier variable. el resultado de la evaluación es FALSO si son objetos vacíos (su clase no define ningún método ni variable). contenga un valor del tipo que contenga.case 2: case 3: echo “i es menor que 4. if( $x ) // // // // $x se evalúa a cierto $x definida como el entero 0 se evalúa a falso Para cadenas de texto. if( $x ) // // // // asignamos una cadena a $x se evalúa a cierto cadena vacía evalúa a falso NOTA: $x = “0” es la única excepción. ya que primero se convierte la cadena “0” al decimal 0. una cadena vacía equivale a FALSO. $x = 1. cualquier otro valor CIERTO. ya que antes de realizar la comprobación PHP puede convertir el tipo de la variable. case 4: echo “i vale 4”. $x = array(). if( $x ) // se evalúa a falso 30 . Evaluaciones a Cierto o Falso La forma de realizar las comprobaciones booleanas sobre una variable (evaluar su valor a cierto o falso) en PHP puede resultar confusa a los programadores acostumbrados a trabajar con lenguajes fuertemente tipados. "c" ).11. y CIERTO en otro caso. // $x es un array vacío if( $x ) // se evalúa como falso $x = array( "a". una cadena no vacía a CIERTO.

} $x = new Yod(). Para evitar confusiones. Por ejemplo: function factorial ($valor) { if ($valor < 0) { return –1. 31 . podemos tener en mente esta regla que funciona el 99% de las veces: el valor 0 y la cadena vacía se evalúan a FALSO. Como regla general a utilizar al principio hasta que nos acostumbremos al funcionamiento de PHP.. y en vez de repetir este código varias veces lo sustituimos por una simple “llamada” a la función. ‘True’ y ‘tRuE’ hacen referencia a la misma constante ‘TRUE’. El comando return es opcional. if( $x ) // se evalúa a cierto PHP tiene definidas dos constantes para los valores CIERTO y FALSO. Funciones Con una función podemos agrupar bajo un nombre una serie de comandos que se repiten a menudo a lo largo del código. Puede aparecer varias veces en el código de la función.. FALSE es la cadena vacía. escribiremos estas constantes siempre en mayúsculas. La sintaxis de la declaración de una función en PHP es: function nombre ($arg_1. incluso otras definiciones de funciones y / o clases. } if ($valor == 1 || $valor == 2) { return $valor. $arg_n copias locales de las variables. Es indiferente si se escriben en mayúsculas o minúsculas.. ‘true’. $arg_2. .12. 2. cualquier otra cosa a CIERTO. se crea en $arg_1 . } Los parámetros se pasan por valor. y siempre implica la final de la ejecución de la función.. // Error } if ($valor == 0 ) { return 1. y se trabaja sobre estas copias locales. de forma que al salir de la función los valores originales no han sido modificados.. respectivamente TRUE y FALSE. Es el equivalente a asignar un valor al nombre de la función en ASP. es decir. En el cuerpo de la función puede haber cualquier combinación de instrucciones válidas en PHP. Están definidas de esta forma: • • TRUE es el valor entero decimal 1. $arg_n) { comandos return $salida. y sirve para que la función devuelva un valor de salida. es decir.Class Yod { // clase no vacía var $x = 1.

Paso de parámetros por referencia Los parámetros de las funciones se pueden pasar por referencia. } $factorial5 = factorial(5)..12.) En este caso.2. } 2.} $ret = 1. hay que utilizar el ‘&’ tanto en la definición de la función como en la llamada a ésta: function &buscar_cliente($nombre) { // .net”) { echo ‘<a href=”’ . Esto puede ser útil. MiFuncion($a). for ($i = 2. por ejemplo. como en el ejemplo de arriba. Esta restricción se ha eliminado en PHP 4. En PHP 3 era necesario definir las funciones antes de usarlas.php. $url . 32 . return $registro. Devolución de variables por referencia PHP también nos permite devolver variables por referencia. // Aquí $a == 6 2. } $a = 5. cuando tenemos una función que busca un valor dentro de una colección de variables. Esto se consigue utilizando el símbolo ‘&’ en la definición de la función: function MiFuncion(&$var) { $var++.. $i <= $valor. de forma que si que se pueda modificar su valor dentro de la función. ‘”>Pulsa aquí</a>’. echo $cliente->dni.1. ni tampoco se puede eliminar o modificar una función previamente definida. Lo que si se puede hacer es dar valores por defecto a algunos de los parámetros que reciba la función (comenzando siempre por la derecha) y hacerlos así optativos: function enlace($url = ”www. } $cliente = &buscar_cliente(“Juan”). $i++) { $ret *= $i..12. } return $ret. y queremos que devuelva la variable entera (porque es una estructura que contiene más datos que vamos a necesitar. buscamos . PHP no soporta sobrecarga de funciones (tener varias funciones con el mismo nombre y distintos argumentos).. donde ya se puede utilizar una función antes de su declaración.

cada vez que el flujo del programa llega a esa línea. en caso de que en sucesivos includes vuelva a aparecer. Con require se cargarían TODOS los archivos SIEMPRE. La cláusula include(“archivo”). Con include.php y antes de ejecutarlo. En lugar de copiar ese código en todos los archivos que lo necesiten. Flexibilidad. mientras que con require siempre se accede al mismo archivo. se deba incluir o no otros archivos. se sustituye en el código antes de que este se ejecute por el contenido de archivo. Con include podemos acceder a archivos cuyo nombre tenemos en una variable que podemos ir cambiando en tiempo de ejecución. también se sustituye por el contenido de archivo. que nos aseguran que un determinado archivo sólo será procesado una vez. Entontes.13. mientras se está preprocesando el contenido del archivo .2. • También existen las funciones include_once y require_once. se realiza durante la ejecución. una función que valide ciertos datos. ¿por qué tener dos funciones distintas para hacer lo mismo? Principalmente por dos motivos: • Optimización de los accesos a disco: Imagínese un código en el que dependiendo de una serie de condiciones. include y require La cláusula require(“archivo”). 33 . se pone en un archivo que es “incluido” por el resto. o que muestre la cabecera y pie de las páginas). La utilidad de ambas cláusulas es la misma: imagínese unas líneas de código que se vayan a necesitar en varios archivos (por ejemplo. pero en lugar de realizarse una única vez durante el preproceso del archivo. que puede ser un archivo local o una URL. igual que funciona el #include de C o ASP. Esta sustitución se realiza una sola vez. únicamente aquellos que se vayan a utilizar.

3.1. 3. Por ejemplo este formulario estaría mal: <form action="accion. Programando en PHP En esta segunda parte del curso. con los nombres que se les haya dado en éste. una vez ya tenemos una idea general de cómo se programa en PHP. Por ejemplo.php. Valores sencillos Para los campos de un formulario en los que únicamente se puede elegir o introducir un valor (como campos de texto.1.2.php" method="POST"> Su nombre: <input type=text name=nombre><br> Su edad: <input type=text name=edad><br> <input type=submit> </form> En el script de destino accion. Vamos a ver algunos ejemplos: 3.php" method="POST"> <select multiple name=menu[]> <option>Tortilla <option>Paella <option>Fabada <option>Lentejas </select><input type=submit></form> 34 . Valores múltiples Para los campos de selecciones múltiples PHP también se encarga de almacenar los valores marcados por el usuario en una variable con el nombre del campo. accederíamos a los valores enviados en el form así: Hola <?=$nombre?>.1. vamos a estudiar con más detalle algunas de las funciones de PHP que probablemente tendremos que usar con mayor frecuencia. ya que el propio lenguaje se encarga de crear automáticamente las variables necesarias para almacenar los datos del <form> en la página que los recibe. Formas Trabajar en PHP con formas es muy fácil. pero en este caso tendremos que llevar cuidado de dar a las variables nombres de arrays. desplegables y “radio buttons”) PHP crea en el archivo de destino tantas variables como campos haya en el formulario.3. si tenemos este formulario: <form action="accion. ya que si no sólo tendremos acceso al primer valor seleccionado.1. Tiene <?=$edad?> años.php" method="POST"> <select multiple name=menu> <option>Tortilla <option>Paella <option>Fabada <option>Lentejas </select><input type=submit></form> Deberíamos haberlo escrito así: <form action="accion.

y mayor que cero si $a es mayor que $b. $b) == 0) { echo ‘iguales’. Por ejemplo: if (strcmp($a.2.. un número menor que cero si $a es menor que $b. Comparaciones Para comparar cadenas ya hemos visto que podemos utilizar los operadores == y ===. usaremos strcasecmp: int strcasecmp (string str1. Esto se consigue con: string substr (string cadena.. int tamaño]) Si inicio es positivo. string str2) La función devuelve 0 si ambas cadenas son iguales. devuelve la subcadena que empieza en esa posición. Manipulación de strings y arrays Durante la generación de contenido para páginas Web vamos a estar continuamente trabajando con cadenas de texto: modificándolas. aunque también disponemos de la función strcmp() con el mismo funcionamiento que en C: int strcmp (string str1. añadiéndoles el valor de algún cálculo interno o algún acceso a una base de datos. se elimina ese número de caracteres de la subcadena devuelta: 35 . Además. Si queremos comparar sin tenerlas en cuenta. foreach($menu as $plato) { echo "$plato<br>\n". } ?> 3.2. se devuelve una subcadena de hasta ese número de caracteres. Subcadenas Otra operación que podríamos necesitar es obtener una subcadena de otra dada. siempre que la cadena contenga algún carácter binario deberemos utilizar esta función en lugar del operador “==”. 3.2.Y podemos ver el resultado con este código: <?php echo "Su elección:<br>". string str2) 3. int inicio [. Si es negativo.1.2. Si se indica el tamaño. la subcadena que empieza en esa posición contando desde el final. } La función strcmp tiene en cuenta mayúsculas y minúsculas. Vamos a ver algunas de las funciones más útiles para manipular strings y arrays. Si el tamaño es negativo.

y se busca desde el final de la cadena. 1). Imprimir y formatear cadenas Se puede formatear e imprimir una cadena con la función printf().$str $str $str $str = = = = substr('abcdef'. al igual que en C: int printf (string formato [. -2). 'de'). 2. pero si una serie de caracteres de referencia que marcarán su inicio. Los tipos disponibles son: 36 . Por defecto se usa el espacio. 'de'). Por ejemplo. substr('abcdef'.]) Aquí. Entonces podremos usar estas funciones: int strpos (string cadena. // $i = 7 $s = strrpos('cadena de prueba'. El número mínimo de caracteres que ocupará el campo tras la conversión. string referencia [. 2. 1. Un indicador opcional para especificar si se alineará a la izquierda (-). 4. Por defecto se alinea a la derecha. y secuencias de formato que comienzan por ‘%’ y controlan cómo se mostrarán los argumentos. 5. char referencia) string strstr (string cadena. -2). formado por un punto seguido del número de dígitos decimales que se deberán mostrar con los números en punto flotante. Estas secuencias de formato se componen de: 1. También es opcional.2.. Un indicador de tipo que especifica cómo se deberá tratar el dato. // // // // cde ef e bcd En ocasiones puede que no sepamos la posición exacta en la cadena de lo que andamos buscando. // $s = dena de prueba 3. substr('abcdef'. int inicio]) int strrpos (string cadena. -2. No tiene efecto con otros tipos de datos. La segunda función es similar pero aquí referencia es un carácter en lugar de una cadena (si se pasa una cadena sólo se usará el primer carácter). Por último. // $i = 7 $s = strstr('cadena de prueba'. que se imprimirán tal cual. 'de').3. mixed args. 'de'. Un carácter opcional que se utilizará para rellenar y ajustar el tamaño del campo. 3. la tercera función devuelve la subcadena de cadena que comienza en la primera ocurrencia de referencia. formato es una cadena que puede contener cualquier carácter excepto ‘%’. substr('abcdef'. $i = strpos('cadena de prueba'. 3).. Un indicador opcional de precisión. string referencia) La primera función devuelve el índice de la primera ocurrencia de la cadena referencia en cadena a partir de la posición inicio. 5). // $i = 2 $i = strpos('cadena de prueba'. un espacio para caracteres o un cero para números.

Se trata como entero y se muestra el número en decimal. y se muestra como punto flotante.2. 3.75.4. pero si por ejemplo estas restricciones las hemos obtenido por parte del usuario (en un form).% b c d f o s x X Ejemplos: El carácter de tanto por ciento. $año). $pago = $pago1 + $pago2. Se trata como double. $dia.2f". 37 . El argumento se trata y se muestra como una cadena. $dia. ya que se encarga de añadir las barras invertidas que haga falta: $busca = “D’Alton”. addslashes($busca) . $pago2 = 54. // echo $pago mostrará "123. $mes. $pago1 = 68. no sabemos a priori si habrá algún carácter que escapar ni dónde.. printf(“%02d/%02d/%04d”. Escapar caracteres PHP tiene varias funciones para “escapar” con barras invertidas algunos caracteres que bajo ciertas circunstancias pueden dar problemas. ‘\’’. rellenando con ceros printf ("%01.. El argumento se trata como entero y se muestra en binario. Por ejemplo. ya que es mucho más rápido imprimir con echo o concatenar cadenas con el operador ‘. pero se debe de huir de ellas cuando este formato no sea importante o simplemente no se esté realizando ningún formateo. $mes.]) El formato es el mismo que con printf: $fecha = sprintf(“%02d/%02d/%04d”. Se trata como entero y se muestra en hexadecimal (con las letras en mayúsculas). Se trata como entero y se muestra en octal.’. Estas dos funciones son muy útiles a la hora de dar un formato específico a unos datos. $pago). y se muestra el carácter ASCII. // Habrá que escapar el apóstrofe $sql = ‘SELECT * FROM usuarios WHERE apellido = \’’ . También podemos almacenar el resultado del formateo en una cadena en lugar de imprimirlo con la función sprintf(): string sprintf (string formato [. Se trata como entero y se muestra en hexadecimal (con las letras en minúsculas).1" // Mostrar al menos un dígito entero y exactamente dos // decimales. Se trata como entero. $año).35. en SQL tendremos que escapar los apóstrofes en las restricciones de un WHERE. mixed args. Con la función addslashes() podemos manejar este tipo de situaciones.

ya que si en el form por ejemplo nos hubieran puesto “pepe . Podemos utilizar esta función para obtener el valor de cada campo. Además de por razones de seguridad. también necesitaremos a veces cambiar unos caracteres por otros para formatear correctamente un texto en HTML. se extraerá hasta ese número de campos y en el último estará el resto de la cadena.2. string cadena [. apachectl stop” y PHP se estuviera ejecutando como root cualquiera nos podría detener Apache. // <input type=hidden name=var value=”a&gt. Extraer campos Podemos dividir una cadena formateada en campos divididos por un delimitador en un array de cadenas con esos campos usando la función explode(): array explode (string delimitador. int límite]) Si se especifica un límite. tendríamos un grave agujero de seguridad. y que devuelva la información de finger sobre ese usuario.´'\"|*?~<>^()[]{}$\\\x0A\xFF). en UNIX se utiliza bastante el carácter de dos puntos para separar campos en una cadena. $cadena = “campo1:campo2:campo3”.b”> Podemos también convertir todos los caracteres de fin de línea de una cadena a “<br>” con: string nl2br (string cadena) 3. 38 . int valor_salida]) Por ejemplo. htmlspecialchars($valor) . por ejemplo en el archivo /etc/passwd. Esto lo hace la función htmlspecialchars(): $valor = “a>b”. ‘”>’. echo ‘<input type=hidden name=var value=”’ . En PHP podemos ejecutar cualquier comando en el servidor con la función system(): string system (string comando [.Otro caso en el que escapar caracteres es MUY importante es a la hora de realizar llamadas al sistema. Por ejemplo.5. Para evitar esto habría que aplicar esta función sobre los datos que recibamos del form: string escapeshellcmd (string comando) que se encarga de escapar con barras los caracteres que se podrían usar en el shell de UNIX para ejecutar un programa sin nuestro permiso (en concreto. podríamos tener una página en la que en un form se pida el nombre de un usuario de nuestro sistema. y en $usuario tenemos la entrada del form sin más. #&. Si lo hiciéramos simplemente así: echo system(“finger $usuario”).

57. each($arr). $fecha). La operación inversa. guiones o puntos. current($arr). que devuelve el índice (numérico o asociativo) del elemento actual.1. es implode(): string implode (string delimitador. // // // // // // // // // // // 1 cosa cosa 1 gato gato perro 1 array(0.1. prev(). y each(). que devuelven el elemento actual.'perro'=>'gato'). puntero que sirve para recorrer el array secuencialmente con las funciones current(). Recorrer un array Todos los arrays de PHP disponen de un puntero que señala al elemento actual. En caso de que delimitador no siempre sea el mismo carácter.-]'. inicial o final del array.2. por la que a partir de un array de campos y un separador se junta todo en una sola cadena. para obtener los campos de una fecha donde el día. next(). anterior. y actualiza el puntero actual al siguiente (lo que haría next). mes y año puedan estar separados por espacios. each($arr). int límite]) Por ejemplo. key($arr). each($arr). $campos = split ('[ /. next($arr). reset() y end(). Por ejemplo: $arr = array(1. usaríamos: $cadena = implode(“:”. siguiente. current($arr).1) array(1. y su valor (lo mismo que devolvería current) en las posiciones 1 y ‘value’. y a la vez actualizan el puntero a esa posición. end($arr). prev($arr). $campos). También disponemos de las funciones key(). string cadena [.'gato'=>'raton'. cuyo funcionamiento es similar al de explode pero utiliza expresiones regulares para dividir los campos: array split (string delimitador.'cosa'. barras. 3. tendremos que recurrir a split. array campos) Para volver a la cadena original del ejemplo anterior.'foo') array(2.6. current($arr). reset($arr). que devuelve un array con el índice del elemento actual en las posiciones 0 y ‘key’.$campos = explode(“:”. $cadena). tendríamos que utilizar split así: $fecha = "12/4 2000".57) 39 .

Ordenar un array En PHP tenemos varias funciones para ordenar un array: • • • • sort(): rsort(): ksort(): rksort(): Ordena Ordena Ordena Ordena el array por contenido en orden ascendente.2. Otras funciones útiles Una operación útil puede ser eliminar los espacios que haya al principio o final de una cadena.net/manual/ref. 3.Este puntero al elemento actual del que estamos hablando también se utiliza en los bucles foreach y se actualiza en cada iteración. Más información Para más información sobre todas las funciones de strings y arrays disponibles en PHP. por el índice en orden descendente. También se puede usar ltrim y rtrim. por el índice en orden ascendente. ver las páginas de manual: • • Funciones de strings http://www.php Funciones de arrays http://www. por contenido en orden descendente.8.net/manual/ref. que los eliminan sólo del inicio y sólo del final.php 40 .7. Esto lo conseguimos con trim: string trim (string cadena) Esta función elimina espacios del principio y final de la cadena. Podemos convertir una cadena a mayúsculas con: string strtoupper (string cadena) Y a minúsculas con: string strtolower (string cadena) También puede ser útil convertir a mayúsculas tan sólo el primer carácter de la cadena. por ejemplo si vamos a pasar el texto que ha escrito un usuario en un form a un query en SQL.php. respectivamente.7.2.2.php. 3. Esto se consigue con: string ucfirst (string cadena) 3.strings.array. por ejemplo si estamos construyendo frases.

3. y la cadena vacía como contraseña.mysql. string contraseña]]]) Todos los parámetros son opcionales. if (!$link) { die ("No se pudo conectar"). ""). o un error si algo ha ido mal.net/manual/ref. Si no se indican. La conexión con la BD se cierra automáticamente al finalizar la ejecución del archivo actual.3.es".1. "nobody".php.. 41 . ya que dependiendo de la BD y de su grado de integración con PHP tendremos más o menos funciones. Abrir y cerrar una conexión Para conectar a una BD tenemos la función mysql_connect con la siguiente definición: int mysql_connect ([string servidor [:puerto] [:/camino/al/socket] [. una función ifx_connect. string usuario [. se utiliza “localhost” como servidor por defecto. Vamos a explicar las funciones más importantes.3. Lo único que tendremos que comprobar es que una determinada función esté disponible para la BD que vamos a atacar. el nombre del usuario que esté ejecutando PHP como usuario. mysql_close ($link). Se puede obtener una lista completa de todas las opciones en el manual de PHP: http://www. Para evitar confusiones entre las funciones de unas BD y otras.php o en las páginas de funciones de las otras BD. con ejemplos en MySQL ya que es la BD que mejor integrada está en PHP. y devuelve TRUE o FALSE según si la operación ha finalizado con éxito o no. otra para conectar a Informix. si no una para conectar a MySQL. el nombre de todas estas funciones sigue este patrón: <nombreBD>_<nombreFUNCION> de forma que tenemos una función mysql_connect. así nos conectaríamos a la BD MySQL en el servidor Linux: $link = mysql_connect ("www. Por ejemplo. También se puede cerrar explícitamente con mysql_close: int mysql_close ([int identificador]) Esta función cierra la conexión indicada por el identificador o la última conexión que se haya abierto si se omite.ua. } print ("Conexión realizada").mmlabx. 3.. no hay una función “conectar” genérica. Acceso a Bases de Datos PHP dispone de varias funciones para acceder a Bases de Datos. pero son propias de cada una de estas Bases de Datos. Todas las funciones con el mismo nombre de función pero para distintas BD comparten la misma funcionalidad y parámetros. La función devuelve un identificador de la conexión que necesitaremos más tarde para hacer referencia a este enlace en concreto con la BD. es decir. etc.

La función devuelve TRUE o FALSE. $asignaturas = mysql_query($query. y si no existiera. string contraseña]]]) int mysql_pclose ([int identificador]) 3.3. Estos enlaces se abren y cierran con mysql_pconnect y mysql_pclose. int identificador]) En query va la sentencia en SQL que queremos ejecutar. Para elegir la BD “prueba” utilizada en el sistema de gestión de asignaturas en nuestro servidor Linux. Para obtener la información de las asignaturas en la BD de ejemplo: $query = "SELECT codigo. } 42 . se trata de crear uno con mysql_connect (sin parámetros). creditos.3. se utiliza el último enlace abierto.3. Al igual que con mysql_select_db. Interrogar a la BD Para hacer querys a una BD se utiliza mysql_query: int mysql_query (string query [. nombre_bd especifica el nombre de la BD a la que queremos acceder. int identificador]) Aquí. si no que permanecerán abiertos y se podrán utilizar desde los siguientes archivos .Con algunas BD también se pueden usar enlaces persistentes que no se cerrarán automáticamente al acabar la ejecución del archivo. nombre. Si se omite este último campo. según si todo ha ido bien o no. $link). Elegir una BD Para elegir la base de datos con la que queremos trabajar de entre todas las disponibles se utiliza la función mysql_select_db: int mysql_select_db (string nombre_bd [.2. Esta función devuelve FALSE si ha habido un error. si se omite el identificador se usa el último o se trata de crear. descripcion. o un valor no negativo (TRUE) que identifica el resultado y que más tarde deberá ser tratado para extraer la información necesaria. y el campo opcional identificador es el número de identificación de enlace devuelto por mysql_connect. } 3. Su definición es idéntica a la de connect y close: int mysql_pconnect ([string servidor [:puerto][:/camino/al/socket] [. utilizaríamos: if (!mysql_select_db("prueba". if (!$asignaturas) { die (“Error en el query”). $link)) { die (“No existe la BD”). string usuario [. tipo FROM asignatura".php que se ejecuten.

a pesar de la funcionalidad extendida sobre mysq_fetch_row. “\n”. comenzando la primera en la posición 0. Hay que destacar que. o MYSQL_BOTH para indicar el tipo de indexado que queremos (por defecto.También podemos utilizar esta otra función. en la que además del query indicamos la BD a la que queremos interrogar: int mysql_db_query (string nombre_bd. Las columnas están indexadas por orden en el array. podemos obtener los resultados del query así: while ($fila = mysql_fetch_array($asignaturas)) { echo $fila[‘codigo’] . int tipo_resultado]) Esta función es capaz de indexar el array de forma numérica o asociativa por el nombre de las columnas. Continuando con el ejemplo anterior. string query [. esta función NO es significativamente más lenta que la anterior. podemos liberar memoria con: int mysql_free_result (int result) aunque realmente no es necesario ya que el recolector de basura de PHP se encargará de liberarla al acabar la ejecución del archivo actual. ambos). UPDATE o DELETE (operaciones que modifican algún registro). hasta que no queden filas y devuelva FALSE. El parámetro tipo_resultado puede valer MYSQL_ASSOC. Para este mismo fin también disponemos de otra función. tenemos: int mysql_num_rows (int resultado) Donde resultado es el valor devuelto por mysql_query. } 43 .4. ‘ ‘ . Para obtener toda una fila del resultado: array mysql_fetch_row (int resultado) Cada llamada sucesiva a esta función devuelve un array con la siguiente fila del resultado. 3. se puede utilizar esta función para ver el número de filas afectadas: int mysql_affected_rows ([int identificador]) Para obtener el número de filas en el resultado de un query.3. $fila[‘nombre’] . que es una extensión de la anterior: array mysql_fetch_array(int resultado [. Extraer información del resultado del query Si la última operación fue un INSERT. MYSQL_NUM. int identificador]) Cuando hayamos acabado con el resultado.

} Si queremos saber el tamaño de los mysql_fetch_array.4. con los tamaños de estas columnas. ‘ ‘ . int mysql_data_seek (int resultado. Por último. podemos “saltar” directamente a una fila del resultado. construyendo una base de datos y alimentándola con información a través de una pagina Web. con la función mysql_data_seek.4. lo almacena en un objeto cuyas propiedades (variables) coinciden con los nombres de las columnas: while ($fila = mysql_fetch_object($asignaturas)) { echo $fila->codigo . Las filas comienzan en el 0.Otra función que podemos mysq_fetch_object: utilizar para obtener los resultados de un query es object mysql_fetch_object (int result) que en lugar de almacenar el resultado en un array. Crea un script con lo siguiente <html> <body> <?php phpinfo().1. int numero_fila) 3. Una forma sencilla de conocer que opciones están disponibles en PHP y que hacen en tu servidor es usando la función phpinfo(). A trabajar Veamos un ejemplo. Crear una base de datos Ahora estamos listos para conectarnos a mySQL. tenemos: campos de la última fila devuelta por array mysql_fetch_lengths (int resultado) Esta función devuelve un array con tantos campos como columnas el último resultado. $fila->nombre . o “rebobinar” una vez hemos llegado al final. ?> </body> </html> 44 . 3. object o row. “\n”.

así que lo haremos sin explicar a detalle el proceso. el ambiente interno de las variables del servidor de Web. last varchar(20). El comando dice a MySQL que estamos haciendo esto como usuario root.'Smith'. PRIMARY KEY (id). Para ingresar a la base de datos. Si MySQL esta ahí.dump 45 . (nombra al archivo mydb. Vamos a necesitar un archivo core dump que mencionamos anteriormente. Ahora adicionaremos datos utilizando un ejemplo clásico. La inserción y salida de este proceso esta realmente fuera del objetivo de este texto. Snowston'.com/mysql/ . se requiere algún trabajo en la consola de DOS. first varchar(20). es crear una base de datos. así que trabajaremos como usuario root.'1/34 Nowhere Blvd. address varchar(255). podrían adicionarse nuevos usuarios con varios permisos.Salva y ve este script a través de tu servidor de Web. una base de datos de empleados.'John'. desde la línea de comando. Townville'. las opciones que son compiladas y mucho más. pero se podría escribir un artículo entero sobre eso.'Marketing Manager'). INSERT INTO employees VALUES (2. No hay una manera fácil de hacer esta etapa. En la instalación. Si estas interesado en profundizar en el tema revisa el manual que viene con MySQL o revisa la liga http://www. INSERT INTO employees VALUES (3. UNIQUE id (id)). Esa información dice todo acerca de tu servidor. Copia y pega el siguiente texto en un archivo y guárdalo en el directorio c:\mysql\bin.) CREATE TABLE employees ( id tinyint(4) DEFAULT '0' NOT NULL AUTO_INCREMENT.turbolift. tienes que poner datos en ella. un usuario default (root) es automáticamente creado sin password.'Johnson'.'Brad'. Observaras una página con información útil e interesante.'45 There St .'128 Here St. Cityname'.'Bob'.'Roberts'. Desde la línea de comandos tecleamos: mysql -u root mydb < mydb. teclear: mysqladmin -u root create mydb Esto crea la base de datos llamada "mydb". Es el administrador de la base de datos. Consulta información respecto al lenguaje SQL y sistemas de gestión de bases de datos en las fuentes necesarias. position varchar(50).INSERT INTO employees VALUES (1. Se tendrá que utilizar una ventana DOS y ubicarnos en la ruta del directorio MySQL/bin La primera cosa que necesitamos. Antes que puedas obtener datos de MySQL.'Doorman').'Telephonist'). MySQL utiliza su propia tabla de usuarios. entonces estas listo para continuar. Ahora insertaríamos en la base de datos mydb. La mayoría de los scripts de PHP viene con un archivo conocido como core dump que contiene todos los datos requeridos para crear y almacenar una base de datos MySQL.dump.

mysql_result($result. $result = mysql_query("SELECT * FROM employees". 3. En cada una de las líneas de encima.php <html> <body> <?php $db = mysql_connect("localhost".php3 Hasta aquí hemos compilado. printf("Address: %s<br>\n".0. Vamos a hacer algunas cosas con ellos. mysql_query() hace todo el trabajo duro. Si necesitas especificar un password. printf("First Name: %s<br>\n".php3. puedes adicionarlo también."position")) pueden ser manejados como una cadena e imprimirlos. instalado y configurado exitosamente MySQL y PHP. mysql_result() es usado para desplegar los valores de los campos de nuestra consulta. nos vamos a la primera línea. mysql_result($result. La sintaxis de print puede ser vista como las utilizadas en C o Perl. La siguiente. los % indican que la variable en la segunda mitad de la expresión (por ejemplo.0. El resultado de la conexión es almacenada en la variable $db. Copia y pega las siguientes líneas de texto y salva el archivo en un documento dentro del servidor de Web con la extensión . la cual esta numerada como 0 y desplegamos el valor de los campos especificados.printf.Podrías tener algunos errores ejecutando esto."position")). Para más información sobre print.4. Podríamos crear múltiples conexiones a las bases de datos en diferentes servidores. ?> </body> </html> Explicaremos que sucede aquí.0.0. puedes ver la documentación de PHP.net/manual/function. este envía una línea de SQL al servidor MySQL para ser procesada. mysql_select_db("mydb".0. mysql_result($result. "root"). mysql_resutl($result. 46 . Si los tienes revisa y busca alguna línea que haya sido escrita de forma incorrecta. dejaremos esto así. Usando $result.$db). además hemos ejecutado un script simple para recuperar información. Finalmente."first"))."last")). Pero por ahora. mysql_result($result. La función mysql_connect() abre una conexión al servidor MySQL en el host especificado (en este caso es el host local) accesandolo con el nombre del usuario (root). printf("Last Name: %s<br>\n". Usando el identificador de la conexión a la base de datos. http://www. printf("Position: %s<br>\n"."address")). Los resultados que son retornados son almacenados en la variable $result.2 Colocando juntas todas las piezas Ahora que tenemos los datos en la base de datos.$db). Mysql_select_db() le dice a PHP que las consultas que estamos haciendo van contra la base de datos mydb.

Observa el código cuidadosamente y seguramente el sentido quedara claro. La instrucción while construye un ciclo. Un pequeño problema con mysql_fetch_row() es que retorna un arreglo que soporta solo referencias numéricas a campos individuales. En consultas complejas esto puede ser algunas veces un problema. while ($myrow = mysql_fetch_row($result)) { echo "<tr>". Comencemos por desplegar en una página Web la base de datos que creamos en la unidad anterior. indica que en tanto existan nuevos renglones de datos disponibles (los cuales son leídos de la base de datos mediante la instrucción mysql_fetch_row()). } echo "</table>\n".$db). echo "<td>$myrow[1] $myrow[2]</td>". Las primeras líneas las puedes reconocer del ejemplo de la primera unidad.4. Así que el primer campo es referido como 0. se almacena el renglón actual en la variable $myrow. mysql_select_db("mydb". Entonces imprimimos el contenido del arreglo en la pantalla con la función printf. ?> </body> </html> Probablemente notaras que se han introducido algunas nuevas características en el código anterior. echo "<table border=1>\n". En el ciclo while. tomamos una línea del resultado y la asignamos al arreglo $myrow. "root"). pero ahora anexemos nuevos elementos de diseño en HTML. $result = mysql_query("SELECT * FROM employees". Proyectos de PHP con bases de datos Vamos a continuar con la escritura de programas con PHP y MySQL. echo "<td>$myrow[3]</td>". 47 . no tenemos manera de que el usuario lo conozca. el segundo como 1 y así sucesivamente.$db). Luego se ejecutan las instrucciones encerradas entre las llaves. Después este ciclo inicia de nuevo y otra línea es asignada a $myrow. Esto sucede hasta que obtiene todas las líneas disponibles. echo "</tr>". Pero si la consulta no retorna datos. Primero realicemos una búsqueda en la base de datos utilizando el siguiente código: <html> <body> <?php $db = mysql_connect("localhost". echo "<tr><td>Name</td><td>Position</tr>\n". En principio la instrucción while(). Ahora examinemos el ciclo con más detalle.

$myrow["last"]. Si en este punto ejecutamos una sentencia regular while (como while($myrow = mysql_fetch_row($result)). Tenemos que sacar forzosamente el primer registro fuera de la variable y reemplazándola con el segundo registro. Es exactamente lo mismo que mysql_fetch_row() con una pequeña excepción: Usando esta función. Esto podría ahorrarnos algunos dolores de cabeza. entonces que continue. si no hay registros retornados en la consulta. } else { echo "Sorry. $myrow["first"]. $myrow["address"]).1. cambia la sentencia SQL a : SELECT * FROM employees WHERE id=6 o alguna otra cosa que no retorne registros. 48 . echo "</table>\n". "root"). podemos referirnos a los campos por sus nombre (como $myrow["first"]) en lugar de sus números. Primero. echo "<tr><td>Name</td><td>Position</td></tr>\n". } while ($myrow = mysql_fetch_array($result)). existe la función mysql_fetch_array(). if ($myrow = mysql_fetch_array($result)) { echo "<table border=1>\n". También introducimos un ciclo do/while y una sentencia if-else. Si la sentencia if-else dice que si podemos asignar una celda a $myrow. Necesitamos hacer el do/while aquí por una buena razón: Con la sentencia inicial if. Ahora vamos a extender este ciclo y el código if-else para hacer una página más elegante. nosotros asignamos el primer renglón retornado de la consulta a la variable $myrow. Para ver esta porción en acción. Así que no hay oportunidad de que nos saltemos algún renglón. las sentencias contenidas en la porción.4. do { printf("<tr><td>%s %s</td><td>%s</tr>\n".$db). Pero el ciclo do/while nos deja probar la condición después de que el código ha sido corrido ya una vez. $result = mysql_query("SELECT * FROM employees". en otro caso salta a la sección del else y hacer lo que hay ahí. mysql_select_db("mydb". Finalmente. Mantener informado al usuario Observe el siguiente script: <html> <body> <?php $db = mysql_connect("localhost". } ?> </body> </html> Hay un número de nuevos desarrollos introducidos aquí pero no son tan simples. no records were found!". else{} serán ejecutadas.$db). El ciclo do/while es una variación del while() que utilizamos antes.

php3?id=1"> Vamos a utilizar esta técnica ahora. Primero observa que cada marca. hay tres maneras de conseguir la información en la cadena de consulta. Lo segundo es el tipo de información dentro del URL en tu Navegador. <html> <body> <?php $db = mysql_connect("localhost". Como usted debe saber. Esta variable. Usando $PHP_SELF. $myrow["first"]. va precedida por un backslash. almacena el nombre y la locación del script. Pero antes de que procedamos aquí.$db). $myrow["id"]. } ?> </body> </html> Todas las cosas son lo mismo excepto la función printf. sin embargo. Desplegado de información Vamos a tomar el poder de un ciclo que aprendimos y usamos antes para crear un ejemplo mas practico. Escribe una etiqueta como esta en un archivo HTML: <a href="http://my_machine/mypage. } while ($myrow = mysql_fetch_array($result)). Lo primero es utilizar el método del GET en una forma. También nota el uso de la variable $PHP_SELF. así que observaremos esto con algún detalle. Mucho de esto se vera muy familiar ahora.$db). $result = mysql_query("SELECT * FROM employees". podemos asegurar que esto sucederá al igual si el archivo es movido a otro subdirectorio o al igual a otra maquina. Observe el script siguiente. información extra es adicionada a la cadena de consulta. se pasa con cada paginación del PHP.4. mysql_select_db("mydb".2. $myrow["last"]). $PHP_SELF. if ($myrow = mysql_fetch_array($result)) { do { printf("<a href=\"%s?id=%s\">%s %s</a><br>\n". 49 . } else { echo "Sorry. La segunda vez. Como se ha mencionado estas ligas podrían recargar la página. Primero consultaremos nuestra base de datos otra vez y enumeraremos los nombres de los empleados. el QUERY_STRING y los métodos GET y POST. "root"). El backslash dice a PHP que no debe desplegar el carácter que le sigue. Vamos a trabajar con la información del QUERY_STRING. más bien lo trata como parte del código. usted debe saber trabajar con las formas HTML. no records were found!".

"root"). Primero vamos a crear una página con una forma HTML simple. 50 . 3. } else { // no records to display echo "Sorry. Aquí tenemos por fin. if ($myrow = mysql_fetch_array($result)) { // display list if there are records to display do { printf("<a href=\"%s?id=%s\">%s %s</a><br>\n". así que es buena idea comenzar a hacer comentarios para seguirle la pista a lo que esta sucediendo. $myrow["position"]). Todo lo que tenemos que hacer es pregunta al PHP si la variable. printf("Address: %s\n<br>". } } ?> </body> </html> Este código se esta complicando. $myrow = mysql_fetch_array($result). $myrow["last"]). Puede utilizar // para hacer un comentario sencillo de una sola línea o utilizar /* y */ para iniciar y finalizar respectivamente un bloque largo de comentario. Este desarrollo nos permite probar si es la primera o segunda vez que lo envía la pagina. printf("Position: %s\n<br>". $myrow["first"].$db). mysql_select_db("mydb". Una vez que conocemos la respuesta a la pregunta. $myrow["id"]. en este caso. no records were found!". Inserción de datos en la base desde una pagina Web Hemos obtenido datos de la base de datos sin mucha dificultad. crea automáticamente una variable con el nombre y valor que indica la cadena. $myrow["last"]). } else { // show employee list $result = mysql_query("SELECT * FROM employees". } while ($myrow = mysql_fetch_array($result)).$db). $myrow["address"]). Pero enviar datos es otra historia. // display individual record if ($id) { $result = mysql_query("SELECT * FROM employees WHERE id=$id". $PHP_SELF. podemos desplegar un grupo diferente de información la segunda vez. 4. Ahora vamos a observar como vamos conectar formas HTML para enviar información a la base de datos.PHP cuando ve una cadena del tipo “nombre = valor” en el URL de la pagina. $id existe. He aquí el ejemplo de ello: <html> <body> <?php $db = mysql_connect("localhost". $myrow["first"]). printf("Last name: %s\n<br>".$db). printf("First name: %s\n<br>". un verdadero primer y útil script de PHP/MySQL.

<html> <body> <form method="post" action="<?php echo $PHP_SELF?>"> First name:<input type="Text" name="first"><br> Last name:<input type="Text" name="last"><br> Address:<input type="Text" name="address"><br> Position:<input type="Text" name="position"><br> <input type="Submit" name="submit" value="Enter information"> </form> </body> </html> Note que usamos $PHP_SELF otra vez. utilizando $HTTP_POST_VARS. Notara también que cada elemento de la forma concuerda con el nombre del campo en la base de datos. tres o las páginas que se requieran. Tenemos que mencionar que no es necesario tener una página que se recargue así misma. Esto no es obligatorio. Leamos el valor del las variables de la forma y coloquémoslas en la pantalla. Como comentamos en la unidad numero 1. $value) = each($HTTP_POST_VARS)) { echo "$name = $value<br>\n". pero es una buena idea. Vamos a añadir algún código para revisar la entrada a la forma. } } else{ // display form ?> <form method="post" action="<?php echo $PHP_SELF?>"> First name:<input type="Text" name="first"><br> Last name:<input type="Text" name="last"><br> Address:<input type="Text" name="address"><br> Position:<input type="Text" name="position"><br> <input type="Submit" name="submit" value="Enter information"> </form> <?php } ?> </body> </html> 51 . se puede utilizar el PHP en cualquier parte dentro de un código HTML. <html> <body> <?php if ($submit) { // process form while (list($name. Esto permitirá mas adelante buscar la existencia de una variable $submit. También nota que he dado al botón Submit un atributo nombre. Pero el construir una pagina auto referenciada ayuda a mantener todas las cosas compactas. De esta manera cuando la página es llamada por segunda vez podremos conocer que ya se ha utilizado la forma HTML. Pueden crearse dos.

Ahora que se observa bien. Ya conocemos como obtener datos de la base de datos. Pero aun estamos lejos de la perfección. Sin embargo editar es hacer algo diferente a que mostremos los datos apropiados en la forma.'$address'.'$last'. Primeramente. <html> <body> <?php if ($submit) { // process form $db = mysql_connect("localhost". echo "Thank you! Information entered. "root"). $result = mysql_query($sql). } else{ // display form ?> <form method="post" action="<?php echo $PHP_SELF?>"> First name:<input type="Text" name="first"><br> Last name:<input type="Text" name="last"><br> Address:<input type="Text" name="address"><br> Position:<input type="Text" name="position"><br> <input type="Submit" name="submit" value="Enter information"> </form> <?php } // end if ?> </body> </html> Hemos introducido datos en la base de datos. hemos cargado las declaraciones de SQL en la variable ($sql) antes de lanzar la consulta a la base de datos con mysql_query(). Ahora vamos a intentar modificar los registros que están en la base de datos. ¿Que pasa si alguien deja un campo en blanco o introduce texto cuando debió de introducir un número? ¿Que pasa si hay un error donde sea? Vamos ahora a solucionar eso. recuperemos el código de la unidad 1 para desplegar los nombres de los empleados en nuestra página. vamos a tomar la información de la forma y vamos a ponerla en la base de datos.\n".$db).'$position')".last.address. 4. ya que siempre podremos desplegar el SQL a la pantalla y examinar los errores. mysql_select_db("mydb". Actualizar datos vía una pagina Web.4. Editar datos combina dos elementos que ya hemos visto: desplegar datos en la pantalla y enviar datos a la base de datos vía una forma de entrada. A través de este texto.position) VALUES ('$first'. $sql = "INSERT INTO employees (first. Pero esta vez completos y llenemos nuestra forma con la información de los empleados: 52 . Esto es útil para revisar si alguna parte de la sentencia SQL causa un error.

mysql_select_db("mydb". De nuevo vamos a utilizar el botón submit para probar si necesitemos procesar la entrada de la forma. Adicionaremos la habilidad de enviar el código editado de vuelta a la base de datos. Construyamos un poco más. "root"). $result = mysql_query($sql). <html> <body> <?php $db = mysql_connect("localhost".$db). lo cual fue mas o menos fácil. if ($id) { // query the DB $sql = "SELECT * FROM employees WHERE id=$id". ?> <form method="post" action="<?php echo $PHP_SELF?>"> <input type=hidden name="id" value="<?php echo $myrow["id"] ?>"> First name:<input type="Text" name="first" value="<?php echo $myrow["first"] ?>"><br> Last name:<input type="Text" name="last" value="<?php echo $myrow["last"] ?>"><br> Address:<input type="Text" name="address" value="<?php echo $myrow["address"] ?>"><br> Position: <input type="Text" name="position" value="<?php echo $myrow["position"] ?>"><br> <input type="Submit" name="submit" value="Enter information"> </form> <?php } else { // display list of employees $result = mysql_query("SELECT * FROM employees". $myrow["last"]). 53 . $PHP_SELF.<html> <body> <?php $db = mysql_connect("localhost". } } ?> </body> </html> Solo desplegamos la información del campo en el atributo value de cada elemento. $myrow["id"].$db). "root"). while ($myrow = mysql_fetch_array($result)) { printf("<a href=\"%s?id=%s\">%s %s</a><br>\n". $myrow["first"]. Note que las sentencias SQL que utilizamos son un poco diferentes. $myrow = mysql_fetch_array($result).

$db). $PHP_SELF. $result = mysql_query($sql). $myrow = mysql_fetch_array($result). $myrow["first"]. Es hora de poner todo junto en un script. } } ?> </body> </html> Y esto es todo. echo "Thank you! Information updated. Obsérvese como hemos utilizado un if() dentro de otro if() para revisar condiciones múltiples. $myrow["last"]).$db). } else { // query the DB $sql = "SELECT * FROM employees WHERE id=$id". $result = mysql_query($sql). Hemos manejado diferentes combinaciones de características en varios scripts. $myrow["id"]. 54 .mysql_select_db("mydb".\n". while ($myrow = mysql_fetch_array($result)) { printf("<a href=\"%s?id=%s\">%s %s</a><br>\n". if ($id) { if ($submit) { $sql = "UPDATE employees SET first='$first'. ?> <form method="post" action="<?php echo $PHP_SELF?>"> <input type=hidden name="id" value="<?php echo $myrow["id"] ?>"> First name: <input type="Text" name="first" value="<?php echo $myrow["first"] ?>"><br> Last name: <input type="Text" name="last" value="<?php echo $myrow["last"] ?>"><br> Address: <input type="Text" name="address" value="<?php echo $myrow["address"] ?>"><br> Position: <input type="Text" name="position" value="<?php echo $myrow["position"] ?>"><br> <input type="Submit" name="submit" value="Enter information"> </form> <?php } } else { // display list of employees $result = mysql_query("SELECT * FROM employees".last='$last'.position='$position' WHERE id=$id".address='$address'.

} else { $sql = "INSERT INTO employees (first. } } ?> <P> <a href="<?php echo $PHP_SELF?>">ADD A RECORD</a> <P> <form method="post" action="<?php echo $PHP_SELF?>"> <?php if ($id) { // editing so select a record 55 . <html> <body> <?php $db = mysql_connect("localhost".$db). $result = mysql_query($sql).last. $myrow["id"]. $myrow["id"]). if ($submit) { // here if no ID then adding else we're editing if ($id) { $sql = "UPDATE employees SET first='$first'. while ($myrow = mysql_fetch_array($result)) { printf("<a href=\"%s?id=%s\">%s %s</a> \n".'$position')". mysql_select_db("mydb".position) VALUES ('$first'.position='$position' WHERE id=$id".address. editar y remover entradas de la base de datos.$db). Demos un vistazo. $myrow["last"]). printf("<a href=\"%s?id=%s&delete=yes\">(DELETE)</a><br>". Es una extensión de lo que hemos visto hasta ahora y haremos un buen repaso. } else { // this part happens if we don't press submit if (!$id) { // print the list if there is not editing $result = mysql_query("SELECT * FROM employees". echo "$sql Record deleted!<p>". } elseif ($delete) { // delete a record $sql = "DELETE FROM employees WHERE id=$id". echo "Record updated/edited!<p>". $PHP_SELF.'$last'.last='$last'. "root").4. } // run SQL against the DB $result = mysql_query($sql).address='$address'. $myrow["first"]. $PHP_SELF.'$address'.5. Colocar todo junto Finalizamos esta lección poniendo todo en una página sencilla donde podemos aumentar.

En otro caso . $position = $myrow["position"]. consultamos a la base de datos para desplegar los registros relevantes. tomamos la acción default que despliega la lista de empleados y la forma. $id = $myrow["id"]. $myrow = mysql_fetch_array($result). $last = $myrow["last"]. Si no entonces adiciona un registro. pero realmente no lo es. 56 . $address = $myrow["address"].$sql = "SELECT * FROM employees WHERE id=$id". Y hemos observado como podemos pasar información de una página a otra usando URLs y formas de entrada. // print the id for editing ?> <input type=hidden name="id" value="<?php echo $id ?>"> <?php } ?> First name:<input type="Text" name="first" value="<?php echo $first ?>"><br> Last name:<input type="Text" name="last" value="<?php echo $last ?>"><br> Address:<input type="Text" name="address" value="<?php echo $address ?>"><br> Position:<input type="Text" name="position" value="<?php echo $position ?>"><br> <input type="Submit" name="submit" value="Enter information"> </form> <?php } ?> </body> </html> Se ve complejo. Nota que con la primera sentencia if() revisamos para una variable que llega vía un POST y en este la variable que podría ser parte de un GET. Usamos ciclos while() y sentencias if() y hemos corrido la gama de sentencias básicas de SQL como SELECT. De nuevo revisamos la existencia de la variable $id. INSERT. checa que la variable $id exista. UPDATE y DELETE. $result = mysql_query($sql). edita un registro. El script esta dividido en tres partes. Después revisamos si la variable $delete existe. Hemos puesto todo lo aprendido y lo pusimos en un script. desplegamos una forma en blanco. Si existe. La primera condición if() checa para ver que el botón de Submit ha sido presionado y si es así. Finalmente. Si existe borramos el registro. $first = $myrow["first"]. En otro caso.

php Acceso a servidores FTP • • • • • • • • • • 57 .php Manipulación de objetos COM en Windows http://www.domxml.php.php.php.net/manual-php/ref.net/manual-php/ref.html Semáforos y memoria compartida http://www.php Manipulación de XML http://www.net/manual/ref. Algunos de estas características podrían no venir en la instalación por defecto de PHP.php Compresión de datos http://www.com.php.php.xml.net/manual/ref. 5.php.php http://www.1.net/manual/ref.net/manual/ref.mmlinux.php Expresiones regulares http://www.php Cifrado http://www.php http://www. por lo que podrían no estar disponibles en un sistema concreto.math.php.php.mcrypt.image.mcal.datetime. Características y funciones adicionales Muchas características avanzadas de PHP.net/manual/ref.net/manual/ref.net/manual/ref.php Manipulación de imágenes http://www.satellite. se nos han quedado en el tintero.net/manual/ref.php.5.sem. que en muchos casos en ASP vienen en paquetes a parte por los que hay que pagar más.regex.net/manual/ref.net/manual/ref.net/manual/ref. y casi todos son gratuitos (algunos pueden depender de alguna librería propietaria): • • Ejecución de programas http://www.mmlinux.net/manual/ref.php http://www.calendar.php.pcre.net/manual/ref.bc.php. ser opcionales a la hora de compilar o incluso necesitar de paquetes a parte.net/manual/ref.zlib.php Manipulación de fechas/calendarios http://www.php. Módulos disponibles Los siguientes módulos y funciones están disponibles en la mayoría de instalaciones de PHP.php Funciones cliente CORBA http://www.php http://www.php.html http://www.php.exec.php Funciones matemáticas http://www.

php.php Acceso a servidores ICAP http://www.aspell.php.php.php.imap.php. POP3 y NNTP http://www.php Pago con tarjetas de crédito http://www.php Acceso a servidores de correo IMAP.net/manual/ref.net/manual/ref.net/manual/ref.cybercash.pfpro.php Generación online de documentos PDF http://www.php.net/manual/ref.net/manual/ref.net/manual/ref.php.pdf.icap.gettext.pspell.php.php.php.swf.net/manual/ref.php Generación de documentos Shockwave Flash http://www.php • 58 .php Corrección ortográfica http://www.net/manual/ref.php Acceso a servidores LDAP http://www.php • • • • • • • • Envío de correo http://www.net/manual/ref.mail.net/manual/ref.php.ftp.net/manual/ref.php Manejo de traducciones a diversos idiomas con GNU gettext http://www.php http://www.php.php http://www.net/manual/ref.http://www.ldap.

http://conf.php.6.com Switching to PHP: What's the Language Difference? Artículo que describe las diferencias entre PHP y otros lenguajes (principalmente Perl.com/zend/art/langdiff. http://www.net • • • • 59 .zend.php.net/manual/ Zend / Where PHP meets eBusiness Empresa de los creadores del motor del intérprete PHP (Zend).net PHP Annotated Manual Manual del PHP con correcciones y anotaciones de los usuarios.php. http://www. Contiene información.) http://www. JavaScript y ASP. y los futuros depurador y compilador.zend.) http://www. Bibliografía • PHP: Hypertext Preprocessor Página principal del PHP. código y programas (un optimizador de consultas.php PHP Conference material site Página con transparencias (en html) para diversas conferencias y cursos de PHP.

Sign up to vote on this title
UsefulNot useful