DFSI Curso 2003-2004 PHP 1 PHP Introducción Qué es y qué herramientas vamos a usar El PHP (Profesional Home Pages - Páginas Personales Profesionales) es un un lenguaje para la creación de páginas web. Es una solución para la construcción de Webs con independencia de la Base de Datos (aunque normalmente se usará MySQL) del servidor Web (aunque normalmente se usará Apache), válida para cualquier plataforma (Unix, Windows, Mac). El objetivo final es conseguir la integración de las páginas HTML con aplicaciones que corran en el servidor como procesos integrados en el mismo, y no como un proceso separado, como ocurre con los CGIs (aunque PHP también puede funcionar como un CGI) . Igualmente interesa que dichas aplicaciones sean totalmente independientes del navegador (lo que no ocurre con otros lenguajes basados en scripts como JavaScript o VisualBasic Script). Para trabajar con PHP nos va a hacer falta: Un editor para poder escribir los programas PHP, por ejemplo, FrontPage (o notepad) en windows y xemacs (o kwrite) en Linux • Un servidor de páginas web , que ejecute y muestre los programas realizados con PHP, nosotros usaremos Apache. • Una Base de Datos, donde podamos guardar y recuperar información. Esta parte es optativa, aunque en un proyecto real suele ser necesaria. Nosotros utilizaremos MySQL. • Un navegador, para ver las páginas generadas con PHP, por ejemplo, el Internet Explorer o el Netscape • Y, por supuesto, el PHP. • DFSI Curso 2003-2004 PHP Índice 1. 1. 2. 3. 4. 2. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 3. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Introducción a PHP Introducción Instalación de PHP en Windows Instalación de PHP en Linux Ejercicios Conceptos básicos del lenguaje PHP Inserción de PHP en HTML Separación de instrucciones Comentarios Tipos de datos Variables Constantes Expresiones y operadores Estructuras de control Funciones Ejercicios Conceptos Avanzados del lenguaje PHP Clases y objetos Manejo de errores Creacion de imágenes Autentificación de un usuario con PHP Cookies (Galletitas) Utilización de ficheros remotos Subida de ficheros usando HTTP Manejo de Conexiones Funciones de PHP para MySQL Referencia de funciones de PHP Ejercicios 2 DFSI Curso 2003-2004 PHP 3 1.- Inserción de PHP en HTML EL PHP va dentro dentro de la página HTML (o página PHP, según se vea) y para insertarlo dentro de utilizan, entre otras cosas, las instrucciones de procesado (<? ... ?>). <? .... ?> Sólo si se activa la función short_tags() o la bandera de configuración short_open_tag. • <?php .... ?> • <script languaje="php"> .... </script> • Sólo si se activan los tags para ficheros 'asp' con la bandera de configuración asp_tags. • Ejemplos de PHP en HTML: <html> <head> <title>Ejemplo 1 </title></head> <body> <h1> Ejemplo de PHP </h1> <? echo ("esta es la más simple, una instrucción de procesado SGML\n"); ?> <br> <?php print "si quiere servir documentos XML, se puede hacer esto\n"; ?> <br> <script language="php"> printf ("a algunos editores -como FrontPage- no les gustan las intrucciones de procesado"); </script> <br> <% echo ("Puedes también usar etiquetas tipo ASP"); %> <br> <br> </body> </html> DFSI Curso 2003-2004 PHP En el ejemplo anterior se puede observar que echo, printf y print sirven para lo mismo para escribir en la página HTML que genera PHP como resultado . 2.- Separación de instrucciones Las instrucciones se separan con ';', en el caso de ser la última instrucción no es necesario el punto y coma. 3.- Comentarios Los comentarios en PHP pueden ser: Como en C o C++, /*...*/ ó // • Otro tipo de comentario de una línea es #, que comentará la línea en la que aparezca pero sólo hasta el tag ?> que cierra el código php. • 4.- Tipos de Datos Los tipos de cada variable en PHP no están tan claros como en C. El intérprete asigna el tipo de una variable según el uso que se esté haciendo de ella. Para asignar un tipo fijo a una variable se utiliza la función settype(). Los tipos son: • • • • • • Enteros Flotantes String Arrays Objetos Variables variables Respecto al tipo entero y flotante, no hay mucho que decir, así que detallaremos sólo los tipos String, Arrays y Objetos. Ejemplos de Tipos de datos simples de PHP: <html> <head> <title>Ejemplo 2 </title></head> <body> <h1> Ejemplo de PHP </h1> <?php 4 DFSI Curso 2003-2004 #Enteros $a = 1234; $a = -123; $a = 0123; decimal) $a = 0x12; decimal) */ PHP 5 # número decimal # un número negativo # número octal (equivalente al 83 /* número hexadecimal (equivalente al 18 //Flotantes o reales $b = 1.234; $b = 1.2e3; //Escribimos algo print "\n La a= $a y la b= $b <br>\n"; ?> </body> </html> En el ejemplo anterior puede verse que se han usado distintos tipos de comentarios 4.1. -String Las cadenas pueden estar delimitadas por " o '. Si la cadena está delimitada por comillas dobles, cualquier variable incluida dentro de ella será sustituida por su valor (ver y ejecutar el ejemplo anterior). Para especificar el carácter " se escapará con el carácter backslash( \ ) Otra forma de delimitar una cadena es utilizando la sintaxis de documentos incrustado "<<<" Ejemplo: $variable = <<< EOD Ejemplo de cadena que ocupa varias líneas EOD; La marca de final de un docuemento incrustado (en este caso EOD) debe estar en la primera columan del documento. Las operaciones con cadenas son exactamente igual que en PERL. Por ejemplo, con strlen se ve el tamaño de una cadena y con el punto ( . ) se concatenan cadenas. DFSI Curso 2003-2004 PHP 6 Operaciones con cadenas <html> <head> <title>Ejemplo 3 </title></head> <body> <h1> Ejemplo de PHP </h1> <?php /* Asignando una cadena. */ $str = "Esto es una cadena"; /* Añadiendo a la cadena. */ $str = $str . " con algo más de texto"; /* Otra forma de añadir, incluye un carácter de nueva línea */ $str .= " Y un carácter de nueva línea al final.\n"; print "$str <br>\n"; /* Esta cadena terminará siendo '<p>Número: 9</p>' */ $num = 9; $str = "<p>Número: $num</p>"; print "$str <br>\n"; /* Esta será '<p>Número: $num</p>' */ $num = 9; $str = '<p>Número: $num</p>'; print "$str <br>\n"; /* Obtener el primer carácter de una cadena una vector*/ $str = 'Esto es una prueba.'; $first = $str[0]; print "$str 0->$first <br>\n"; como /* Obtener el último carácter de una cadena. */ $str = 'Esto es aún una prueba.'; $last = $str[strlen($str)-1]; print "$str last->$last <br>\n"; ?> </body> </html> DFSI Curso 2003-2004 PHP 7 Para hacer conversión de cadenas a otros tipos de datos hay que tener en cuenta una cadena se evalúa como un valor numérico, el valor resultante y el tipo se determinan como sigue. La cadena se evaluará como un doble si contiene cualquiera de los caracteres '.', 'e', o 'E'. En caso contrario, se evaluará como un entero. El valor viene dado por la porción inicial de la cadena. Si la cadena comienza con datos de valor numérico, este será el valor usado. En caso contrario, el valor será 0 (cero). Cuando la primera expresión es una cadena, el tipo de la variable dependerá de la segunda expresión. Ejemplos de tipos de datos <html> <head> <title>Ejemplo 4</title></head> <body> <h1> Ejemplo de PHP </h1> <?php $foo = 1 + "10.5"; // $foo es doble (11.5) print "$foo <br>\n"; $foo = 1 + "-1.3e3"; // $foo es doble (1299) print "$foo <br>\n"; $foo = 1 + "bob-1.3e3"; // $foo es entero (1) print "$foo <br>\n"; $foo = 1 + "bob3"; // $foo es entero (1) print "$foo <br>\n"; $foo = 1 + "10 Cerditos"; // $foo es entero (11) print "$foo <br>\n"; $foo = 1 + "10 Cerditos"; // $foo es entero (11) print "$foo <br>\n"; $foo = "10.0 cerdos " + 1; // $foo es entero (11) print "$foo <br>\n"; $foo = "10.0 cerdos " + 1.0; // $foo es doble (11) print "$foo <br>\n"; ?> DFSI Curso 2003-2004 PHP </body> </html> 4.2.-Arrays Los Arrays en PHP se pueden utlizar tanto como Arrays indexados (vectores) o como Arrays asociativos (tablas hash). Para PHP, no existen ninguna diferencia arrays indexados unidimensionales y arrays asociativos. Las funciones que se utilizan para crear Arrays son list() o array() , o se puede asignar el valor de cada elemento del array de manera explícita. En el caso de que no se especifique el índice en un array, el elemento que se asigna se añade al final. Ejemplos de Arrays <html> <head> <title>Ejemplo 5</title></head> <body> <h1> Ejemplo de PHP </h1> <?php #forma explicita $a[0] = "abc"; $a[1] = "def"; $b["foo"] = 13; #Añadiendo valores al array $a[] = "hola"; // $a[2] == "hola" $a[] = "mundo"; // $a[3] == "mundo" #mostramos los resultados print "a= $a[0] , $a[1] , $a[2] , $a[3] <br>\n"; print "b[foo]=".$b["foo"]."<br>\n"; ?> </body> </html> 8 DFSI Curso 2003-2004 PHP Los arrays se pueden ordenar usando las funciones asort(), arsort(), ksort(), rsort(), sort(), uasort(), usort(), y uksort() dependiendo del tipo de ordenación que se desee. Se puede contar el número de elementos de un array usando la función count(). Se puede recorrer un array usando las funciones next() y prev(). Otra forma habitual de recorrer un array es usando la función each(). Los arrays multidimensionales son bastante simples, para cada dimensión array, se puede añadir otro valor [clave] al final. Los indices de un array multidimensional pueden ser tanto numéricos como asociativos. Arrays multidimensionales $a[1] dimensión $a["foo"] = $f; # ejemplos de una sola = $f; $a[1][0] = $f; # bidimensional $a["foo"][2] = $f; # (se pueden mezclar índices numéricos y asociativos) $a[3]["bar"] = $f; # (se pueden mezclar índices numéricos y asociativos) $a["foo"][4]["bar"][0] = $f; # tetradimensional! Los arrays se puede rellenar también usando => # Ejemplo 1: $a["color"] $a["sabor"] $a["forma"] $a["nombre"] $a[3] = = = = = "rojo"; "dulce"; "redondeada"; "manzana"; 4; # Ejemplo 2: $a = array( "color" => "rojo", "sabor" => "dulce", "forma" => "redondeada", "nombre" => "manzana", 9 DFSI Curso 2003-2004 3 PHP 10 => 4 ); 4.3.-Objetos Para inicializar un objeto se utiliza el método new , y para acceder a cada uno de sus métodos se utiliza el operador -> . class nada { function haz_nada () { echo "No estoy haciendo nada."; } } $miclase = new nada; $miclase->haz_nada(); Posteriormente veremos como trabajar con objetos en PHP con más profundidad. 4.4.-Conversión de Tipos de datos Una variable en PHP, define su tipo según el contenido y el contexto en el que se utilice, es decir, si se asigna una cadena a una variable, el tipo de esa variable será string . Si a esa misma variable se el asigna un número, el tipo cambiará a entero . Para asegurarte de que una variable es del tipo adecuado se utiliza la función settype() . Para obtener el tipo de una variable se utiliza la función gettype() . También es posible utilizar el mecanismo del casting tal y como se utiliza en C. Ejemplos de Castings <html> <head> <title>Ejemplo 6</title></head> <body> <h1> Ejemplo de PHP </h1> <?php $foo = 10; // $foo es un entero DFSI Curso 2003-2004 $bar = (double) $foo; PHP 11 // $bar es un doble #Mostramos resultados print "bar=$bar , foo=$foo <br>\n"; ?> </body> </html> Los tipos de casting permitidos son: • • • • • (int), (integer) - fuerza a entero (integer) (real), (double), (float) - fuerza a doble (double) (string) - fuerza a cadena (string) (array) - fuerza a array (array) (object) - fuerza a objeto (object) 5.- Variables En PHP las variables se representan como un signo de dólar seguido por el nombre de la variable. El nombre de la variable es sensible a minúsculas y mayúsculas. Las variables se asignan normalmente por valor, pero desde PHP4, también se asignan por referencia usando el símbolo & Variables por valor y referencia <html> <head> <title>Ejemplo 7</title></head> <body> <h1> Ejemplo de PHP </h1> <?php $foo = 'Bob'; // Asigna el valor 'Bob' a $foo $bar = &$foo; // Referencia $foo vía $bar. $bar = "Mi nombre es $bar"; // Modifica $bar... echo $foo." <br>\n"; // $foo también se modifica. echo $bar." <br>\n"; ?> DFSI Curso 2003-2004 PHP </body> </html> Algo importante a tener en cuenta es que sólo las variables con nombre pueden ser asignadas por referencia. 5.2.- Variables predefinidas En PHP cada vez que se ejecuta un script, existen variables que se crean y que nos pueden informar del entorno en el que se está ejecutando dicho script. Para obtener una lista de todas estas variables predefinidas se puede utilizar la funcion PHPinfo(). De todas estas variables, algunas se crean dependiendo del servidor que se esté utilizando y otras son propias de PHP. Si se tratara de un servidor Apache, la lista de variables es: • • • • • • • • • • • • • • • • • • • • • • • GATEWAY_INTERFACE: SERVER_NAME SERVER_SOFTWARE SERVER_PROTOCOL REQUEST_METHOD QUERY_STRING DOCUMENT_ROOT HTTP_ACCEPT HTTP_ACCEPT_CHARSET HTTP_ENCODING HTTP_ACCEPT_LANGUAJE HTTP_CONNECTION HTTP_HOST HTTP_REFERER HTTP_USER_AGENT REMOTE_ADDR REMOTE_PORT SCRIPT_FILENAME SERVER_ADMIN SERVER_PORT SERVER_SIGNATURE PATH_TANSLATED SCRIPT_NAME 12 DFSI Curso 2003-2004 PHP REQUEST_URL • las variables creadas por el propio PHP son: argv argc PHP_SELF HTTP_COOKIE_VARS HTTP_GET_VARS HTTP_POST_VARS • • • • • • Nota: Esta lista no es exhaustiva ni pretende serlo. Simplemente es una guía de qué tipo de variables predefinidas se puede esperar tener disponibles en un script PHP. 5.3.- Ámbito de una Varible El ámbito de una variable en PHP es exactamente igual que en C o en Perl tomando siempre en cuenta los ficheros incluidos al principio de cada programa. La única diferencia se encuentra en las variables globales, que tienen que ser expresamente definidas dentro de las funciones. Variables globales <html> <head> <title>Ejemplo 8</title></head> <body> <h1> Ejemplo de PHP </h1> <?php $a = 1; $b = 2; Function Sum () { global $a, $b; $b = $a + $b; } Sum (); echo $b; 13 DFSI Curso 2003-2004 PHP 14 ?> </body> </html> 5.4. Varibles variables PHP permite un mecanismo para mantener variables con un nombre no fijo. Por ejemplo: $a = "hola"; $$a = "mundo"; El ejemplo anterior, define dos variables, una denominada $a que contiene el valor "hola" y otra que se llama $hola que contiene el valor "mundo" Para acceder al valor de una variable, se accede con: echo "$a ${$a}"; La sentencia anterior provocará la salida "hola mundo". Algo que se debe tener en cuenta cuando se utilizan variables, es que hay que resolver la ambiguedad que se crea al utilizar arrays de variables de este tipo. Por ejemplo $$a[1] provoca una ambiguedad para el intérprete, puesto que no sabe si se desea utilizar la variable denominada $a[1] o utilizar la variables $a indexándola en su primer valor. Para esto se utiliza una sintaxis especial que sería ${$a[1]} o ${$a}[1] según se desee una opción u otra. 5.5.- Variables de los formularios HTML Cuando existe un formulario en HTML, inmediatamente después de ser enviado, dentro del ámbito PHP se crean automáticamente una variable por cada uno de los objetos que contiene el formulario. Por ejemplo, consideremos el siguiente formulario: DFSI Curso 2003-2004 PHP 15 Formulario simple <html> <head> <title>Ejemplo 9</title></head> <body> <h1> Ejemplo de Formulario 1 </h1> <p> Dame tu nombre !!! <form action="ej10.php" method="post"> Nombre: <input type="text" name="nombre"> <input type="submit"> </form> </body> </html> Cuando es enviado, PHP creará la variable $nombre, que contendrá lo que sea que se introdujo en el campo Nombre:: del formulario. Procesado de Formulario siple <html> <head> <title>Ejemplo 10</title></head> <body> <h1> Ejemplo de PHP </h1> <?php print "<h2>Hola $nombre </h2>\n"; ?> </body> </html> PHP también maneja arrays en el contexto de variables de formularios, pero sólo en una dimensión. Se puede, por ejemplo, agrupar juntas variables relacionadas, o usar esta característica para recuperar valores de un campo select input múltiple: DFSI Curso 2003-2004 PHP Formulario complejos <html> <head> <title>Ejemplo 11</title></head> <body> <h1> Ejemplo de Formulario 2 </h1> <form action="ej12.php" method="post"> Nombre: <input type="text" name="personal[name]"> E-mail: <input type="text" name="personal[email]"> Cerveza: <br> <select multiple name="beer[]"> <option value="warthog">Warthog <option value="guinness">Guinness <option value="stuttgarter">Stuttgarter Schwabenbräu </select> <input type="submit"> </form> </body> </html> Variables de formularios complejos <html> <head> <title>Ejemplo 12</title></head> <body> <h1> Ejemplo de PHP </h1> <?php print "<h2>Hola $personal[name] , "; print "tu email es $personal[email] y "; print "te gusta la cerveza $beer[0] </h2>\n"; ?> </body> </html> 16 DFSI Curso 2003-2004 PHP 17 Si la posibilidad de PHP de track_vars está activada (se hace en la configurtación previa a la compilación), las variables enviadas con los métodos POST o GET también se encontrarán en los arrays asociativos globales $HTTP_POST_VARS y $HTTP_GET_VARS. 5.6.- Cookies HTML Las cookies son un mecanismo para almacenar datos en el navegador y así rastrear o identificar a usuarios que vuelven. La función SetCookie() es una función PHP para asignar Cookies a un ordenador cliente. Esta función se debe llamar siempre antes de comenzar a crear la página puesto que debe formar parte de la cabecera de HTML. Cualquier Cookie que se envía a un cliente, se convierte dentro de PHP en una variable. Ejemplos de cookies con PHP <?php $cuenta++; SetCookie ("cuenta", $cuenta, time()+3600); SetCookie ("visita[$cuenta]", "Visita número $cuenta", time()+3600); ?> <html> <head> <title>Ejemplo 13</title></head> <body> <h1> Ejemplo de PHP </h1> <?php print "cuenta: $cuenta <br>\n"; print "Número de Visitas:".count($visita)." <br>\n"; for ($i=0; $i < count ($visita) ; $i++) { print "Visita $i:".$visita[$i]." <br>\n"; } ?> DFSI Curso 2003-2004 PHP 18 </body> </html> Este ejemplo mantiene dos Cookies en el cliente. La primera mantiene el contador cuenta y la segunda contiene una lista de los comentarios de cada una de las veces que se ha actualizado la cookie, visita. Más adelante veremos con más profundidad el uso de las cookies. 5.7.- Variables de entorno Las variables de entorno, tales como $HOME, para entornos Linux, se pueden utilizar desde PHP. Para asegurarnos podemos usar la función getenv() También se puede asignar un valor a una variable de entorno con la función putenv() 6.- Constantes Las constantes en PHP tienen que ser definidas por la función define() y además no pueden ser redefinidas con otro valor. Además, existen una serie de variables predefinidas denominadas: _FILE_: Fichero que se está procesando. _LINE_: Línea del fichero que se está procesando • _PHP_VERSION: Versión de PHP. • PHP_OS: Sistema operativo del cliente. • TRUE: Verdadero. • FALSE: Falso. • E_ERROR: Error sin recuperación. • E_WARNING: Error recuperable. • E_PARSE: Error no recuperable (sintaxis). • E_NOTICE: Puede Tratarse de un error o no. Normalmente permite continuar la ejecución. Ejemplo: • • DFSI Curso 2003-2004 PHP 19 Todas las constantes que empiezan por "E_"se utilizan normalmente con la función error_reporting(). Ejemplos de constantes <html> <head> <title>Ejemplo 14</title></head> <body> <h1> Ejemplo de PHP </h1> <?php define("CONSTANTE", "hello world."); echo CONSTANTE; ?> </body> </html> 7.- Expresiones y operadores En PHP una expresión es cualquier cosa que pueda contener un valor. Las expresiones más simples son las variables y las constantes y otras más complicadas serán las funciones, puesto que cada función devuelve un valor al ser invocada, es decir, contiene un valor, por lo tanto, es una expresión. Todas las expresiones en PHP son exactamente igual que en C. Los operadores abreviados, los incrementos, etc, son exactamente iguales. Incluso existen otros operadores adicionales como el operador "." que concatena valores de variables, o el operador "===" denominado operador de identidad que devolverá verdadero si las expresiones a ambos lados del operador contienen el mismo valor y a la vez son del mismo tipo. Por último, el operador "@" sirve para el control de errores. Para poder ver como funciona el operador @, veamos un ejemplo: <?php $res = @mysql_query("select nombre from clientes") or die ("Error en la selección, '$php_errormsg'"); ?> DFSI Curso 2003-2004 PHP 20 Este ejemplo, utiliza el operador @ en la llamada a mysql_query y en el caso de dar un error, se salvará el mensaje devuelto en una variable denominada php_errormsg. Esta variable contendra el mensaje de error de cada sentencia y si ocurre otro error posterior, se machaca el valor con la nueva cadena. PHP mantiene también los operadores " ' " que sirven para ejecutar un comando del sistema tal y como hace la función system(). En PHP existen dos operadores and y dos operadores or que son: 'and', '&&' y 'or', '||' respectivamente, que se diferencian en la precedencia de cada uno. La tabla que nos puede resumir la precedencia de cada uno de los operadores es: Asocitividad Operadores Izquierda Izquierda , or Izquierda Izquierda Derecha xor and print Izquierda Izquierda = += -* *= /= .= %= &= |= ^= ~= <<= >>= ?: Izquierda Izquierda Izquierda || && | Izquierda Izquierda ^ & No posee No posee Izquierda == != === < <= > >= >> << Izquierda Izquierda +-. */% Derecha Derecha No posee ! ~ ++ -- (int) (double) (string) (array) (object) @ [ new DFSI Curso 2003-2004 PHP 21 Ejemplos de expresiones <html> <head> <title>Ejemplo 15</title></head> <body> <h1> Ejemplo de PHP </h1> <?php function double($i) { return $i*2; } $b = $a = 5; /* asignar el valor cinco a las variables $a y $b */ $c = $a++; /* postincremento, asignar el valor original de $a (5) a $c */ $e = $d = ++$b; /* preincremento, asignar el valor incrementado de $b (6) a $d y a $e */ /* en este punto, tanto $d como $e son iguales a 6 */ $f = double($d++); /* asignar el doble del valor de $d antes del incremento, 2*6 = 12 a $f */ $g = double(++$e); /* asignar el doble del valor de $e después del incremento, 2*7 = 14 a $g */ $h = $g += 10; /* primero, $g es incrementado en 10 y termina valiendo 24. después el valor de la asignación (24) se asigna a $h, y $h también acaba valiendo 24. */ #Operador de ejecución $output = `ls -al`; echo "<pre>$output</pre><br>"; echo "<h3>Postincremento</h3>"; DFSI Curso 2003-2004 PHP 22 $a = 5; echo "Debería ser 5: " . $a++ . "<br>\n"; echo "Debería ser 6: " . $a . "<br>\n"; echo $a = echo echo "<h3>Preincremento</h3>"; 5; "Debería ser 6: " . ++$a . "<br>\n"; "Debería ser 6: " . $a . "<br>\n"; echo $a = echo echo "<h3>Postdecremento</h3>"; 5; "Debería ser 5: " . $a-- . "<br>\n"; "Debería ser 4: " . $a . "<br>\n"; echo $a = echo echo ?> "<h3>Predecremento</h3>"; 5; "Debería ser 4: " . --$a . "<br>\n"; "Debería ser 4: " . $a . "<br>\n"; </body> </html> 8.- Estructuras de Control Además de la sintaxis normal (parecida al Perl o al C), PHP ofrece una sintaxis altenativa para alguna de sus estructuras de control; a saber, if, while, for, y switch. En cada caso, la forma básica de la sintaxis alternativa es cambiar abrir-llave por dos puntos (:) y cerrar-llave por endif;, endwhile;, endfor;, or endswitch;, respectivamente. Ejemplo de sintaxis alternativa para el if <html> <head> <title>Ejemplo 16</title></head> <body> <h1> Ejemplo de PHP </h1> <?php $a=8; DFSI Curso 2003-2004 PHP $b=6; #Primer if if ($a > $b) { print "a es mayor que b<br>"; $b = $a; } #if alternativo if ($a > $b): print "A es mayor que B<br>"; endif; #Segundo if (con else y if ($a > $b) { print "a es mayor } elseif ($a == $b) { print "a es igual } else { print "b es mayor } elseif ) que b<br>"; que b<br>"; que a<br>"; #Segundo if alternativo if ($a > $b): print "A es mayor que B<br>"; print "..."; elseif ($a == $b): print "A es igual a B<br>"; print "!!!"; else: print "B es mayor que A<br>"; endif; ?> </body> </html> La mejor forma de resumir cada una de las opciones que ofrece PHP para las estructuras de control es mediante una tabla: Estructura Alternativa If, if else, if elseif while if: endif; while: endwhile; for do.. while foreach(array as $value) for: endfor; - 23 DFSI Curso 2003-2004 PHP 24 foreach(array as $key=>$value) switch continue switch: endswitch; - break require()(Necesitan estar dentro de tags PHP) include()(Necesitan estar dentro de tags PHP) - La sentencia require() se sustituye a sí misma con el archivo especificado, tal y como funciona la directiva #include de C. La sentencia include() incluye y evalúa el archivo especificado. A diferencia de include(), require() siempre leerá el archivo referenciado, incluso si la línea en que está no se ejecuta nunca. Si se quiere incluir condicionalmente un archivo, se usa include(). La sentencia conditional no afecta a require(). No obstante, si la línea en la cual aparece el require() no se ejecuta, tampoco se ejecutará el código del archivo referenciado. De forma similar, las estructuras de bucle no afectan la conducta de require().. Aunque el código contenido en el archivo referenciado está todavía sujeto al bucle, el propio require() sólo ocurre una vez. Esto significa que no se puede poner una sentencia require() dentro de una estructura de bucle y esperar que incluya el contenido de un archivo distinto en cada iteración. Para hacer esto, usa una sentencia include(). Así, require, reemplaza su llamada por el contenido del fichero que requiere, e include, incluye y evalua el fichero especificado. Ejemplo de include 1 <?php print "Hola Caracola<br>\n"; ?> Ejemplo de include 2 <html> <head> <title>Ejemplo 18</title></head> <body> <h1> Ejemplo de PHP </h1> DFSI Curso 2003-2004 PHP 25 <?php include( 'ej17.php' ); ?> </body> </html> 9.-. Funciones 9.1.- Funciones definidas por el usuario Un ejemplo puede ser: function foo($arg1, $arg2, ..., $argN) { echo "Función ejemplo" return $value; } Dentro de una función puede aparecer cualquier cosa, incluso otra función o definiciones de clase. Respecto al paso de argumentos, son siempre pasados por valor y para pasarlos por referencia hay que indicarlo y se puede hacer de dos formas diferentes, en la definición de la función, anteponiendo el símbolo & al argumento que corresponda, en este caso la llamada será igual que la llamada a una función normal, o manteniendo la definición de la función normal y anteponer un & delante del argumento que corresponda en la llamada a la función. Ejemplo de parámetros de funciones <html> <head> <title>Ejemplo 19</title></head> <body> <h1> Ejemplo de PHP </h1> <?php #Definimos la función con parametros por referencia DFSI Curso 2003-2004 PHP 26 function suma1 (&$a, &$b) { $c=$a+$b; return $c; } #Definimos la función con parametros por valor function suma2 ($a, $b) { $c=$a+$b; return $c; } $a=2; $b=3; $suma; #Llamamos la función 1 por referencia (no puede ser de otra forma) print $suma=suma1($a,$b); #Llamamos la función 2 por referencia print $suma=suma1(&$a,&$b); #Llamamos la función 2 por valor print $suma=suma1($a,$b); ?> </body> </html> PHP permite el mecanismo de argumentos por defecto. Un ejemplo de esta caracteristica es: function hacerCafe($tipo="capuchino") { return "he hecho un café $tipo\n"; } En la llamada a esta función se obtendrá una frase u otra según se llame: echo hacerCafe(); echo hacerCafe("expreso"); DFSI Curso 2003-2004 PHP En el caso de tratarse de una función con argumentos por defecto y argumentos normales, los argumentos por defecto deberán estar agrupados al final de la lista de argumentos. En PHP4 el número de argumentos de una función definida por el usuario, puede ser variable, se utilizan las funciones func_num_args(), func_get_arg() y func_get_args(). 9.2- Valores devueltos A diferencia de C, PHP puede devolver cualquier número de valores, sólo hará falta recibir estos argumentos de la forma adecuada. Ejemplo: function numeros() { return array(0,1,2); } list ($cero, $uno, $dos) = numeros(); 9.3- Funciones Variables PHP soporta el concepto de funciones variable, esto significa que si una variable tiene unos paréntesis añadidos al final, PHP buscará una función con el mismo nombre que la evaluación de la variable, e intentará ejecutarla. <?php funtcion foo() { echo "En foo()<br>\n"; } function bar ($arg ='') { echo " bar();El argumento ha sido '$arg'.<br>\n"; } $func = 'foo'; $func(); $func='bar'; $func('test'); ?> 27 DFSI Curso 2003-2004 PHP 28 10. Ejercicios Ejercicio: Realizar una página PHP que genere dos vectores ordenados y los una en un tercero. Ejercicio: Escribir una función mcd que calcule el máximo comúm divisor de dos números y lo devuelva. Ejercicio: Hacer un formulario que pida las horas trabajadas al día, el número de días. Dicho formulario debe entregar los datos a una página PHP que calculará el salario neto, a partir del salario bruto y las retenciones fiscales (suponer un 12%) Ejercicio: Realizar una página PHP que genere, escriba y suma dos matrices NxN. Ejercicio: Realizar una página PHP que ilustre el uso de los distintos tipos de casting posible, mostrando los tipos de las variables Ejercicio: Hacer un formulario que pida el nombre del usuario. Dicho formulario debe entregar dicho nombre a una página PHP que guardará el nombre del usuario y las veces que ha visitado el script PHP con Cookies. 1.- Clases y objetos Una clase es una colección de variables y de funciones que acceden a esas variables. Una clase se define con la siguiente sintaxis: La sintaxis para definir una clase es la siguiente: <?php class Carrito { var $items; // Artículos en nuestro carrito de la compra // Añadir $num artículos de tipo $artnr al carro function add_articulo ($artnr, $num) { $this->items[$artnr] += $num; } DFSI Curso 2003-2004 PHP // Sacar $num artículos del tipo $artnr del carro function remove_articulo ($artnr, $num) { if ($this->items[$artnr] > $num) { $this->items[$artnr] -= $num; return true; } else { return false; } } } ?> El ejemplo define una clase llamada Carrito que consiste en un array asociativo de artículos de un carrito de la compra y dos funciones para añadir y sacar ítems del carro. Las clases son tipos, es decir, son plantillas para variables. Con el operador new crea una instancia de la clase Carrito. $carro = new Carrito; $carro->add_articulo("Plancha Filips 202", 1); En el anterior ejemplo creamos un objeto carro de la clase carrito a la que le añadimos 1 artículo. Entre funciones de una clase, la variable $this hace referencia al propio objeto. Tienes que usar $this->loquesea para acceder a una variable o función llamada loquesea del objeto actual. PHP soporta herencia, las clases extendidas o derivadas tienen todas las variables y funciones de la clase base y lo que les añadas al extender la definición. La herencia múltiple no está soportada. La herencia en PHP se realiza con extends. Los constructores de cada clase se llaman automáticamente por el operador new . El constructor de cada clase debe tomar el mismo nombre de la clase y cuando se trata de una clase derivada, hay que tener cuidado porque sólo se 29 DFSI Curso 2003-2004 PHP llama automáticamente al constructor de dicha clase pero no al constructor de la clase padre. class Carrito_con_amo extends Carrito { var $amo; function fijar_amo ($nombre) { $this->amo = $nombre; } } El ejemplo anterior define una clase Carrito_con_amo que tiene todas las variables y funciones de Carrito, y además añade la variable $amo y una función adicional fijar_amo(). Un carro con amo se crea de la forma habitual y, una vez hecho, puedes acceder al propietario del carro. En los carros con nombre también puedes acceder a las funciones normales del carro: $miCarro = new Carrito_con_amo; // Creamos un carro con dueño $miCarro ->fijar_amo ("Richal"); // Nombramos el carro print $miCarro->amo; // Imprimimos el nombre del propietario $miCarro->add_articulo ("Monitor Soni GD450", 1); // Funcionalidad heredada de Carrito Los constructores también pueden recibir parámetros y estos parámetros pueden ser opcionales, lo que los hace más útiles. class Otro_Carrito extends Carrito { function Otro_carrito ($articulo = "Boli Byc Azul", $cantidad = 1) { $this->add_articulo ($articulo, $cantidad); } } // Compramos las mismas cosas aburridas de siempre $default_cart = new Otro_Carrito; 30 DFSI Curso 2003-2004 PHP 31 // Compramos las cosas interesantes $different_cart = new Otro_Carrito ("AzlonXP 3000+", 17); 2-. Manejo de Errores En PHP hay cuatro tipos de errores y avisos: • • • • 1Error ) 248- Errores Normales de Funciones (Normal Function Avisos Normales (Normal Warnings) Errores del analicador de código (Parse Errors) Avisos que se pueden ignorar( Notices ) Los 4 números de la izquierda son sumados para definir un nivel de aviso de error. El nivel de error por defecto es 7 (1+2+4), pero esto puede ser modificado en tiempo de ejecución usando la función error_reporting (). Cualquier expresión en PHP se puede llamar con la "@" al principio que invocará a la función de manejo de errores, y el error podremos encontrarlo en la variable $php_errormsg. Error en un documento PHP <html> <head> <title>Ejemplo error </title></head> <body> <h1> Ejemplo de error en PHP </h1> <?php error_reporting(0); $a=5/0; print "<p>La siguiente variable no existe: $zx \n"; ?> </body> </html> DFSI Curso 2003-2004 PHP 32 3-. Creación de Imágenes PHP tiene una funcionalidad muy potente: la creación de imágenes al vuelo (aunque también puede generar, por ejemplo, documentos PDF). Esto puede ser útil para crear gráficas partir de datos y generar cualquier gráfico dinámicamente.Para esto, PHP utiliza la librería GD de la empresa Boutell.com, por lo que es necesario tenerla instalada en el sistema (se puede ver si está instalada viendo el resultado generado por phpinfo() ). A partir de la versión 1.6 no se puede trabajar con imágenes GIF (por problema de patentes) y desde la 1.8 se puede trabajar con jpeg. El ejemplo más sencillo es abrir una imagen que esté en un fichero de disco y mostrarla tal cual. <?php #En la cabecera decimos no es HTML lo que devolvemos, si no una imagen jpeg Header("Content-type: image/jpeg"); #Creamos la imagen a partir de un fichero $im=imagencreatefromjpeg("php.jpg"); #La mostramos ImageJPEG($im); #Liberamos la memoria ocupada ImageDestroy($im); ?> Si en el anterior ejemplo cambiamos jpeg por png nos servirá para leer imágenes en formato png. Con la función imagecreatefromjpeg creamos una imagen a partir de un fichero jpeg.Con imagejpeg devolvemos al navegador una imagen jpeg. En el siguiente ejemplo será llamado desde una página con una línea como esta: <img src="boton.php?texto=hola"> El siguiente script de arriba toma la cadena "text" la situa sobre la imagen base, en este caso es "images/button1.jpg" y muestra la DFSI Curso 2003-2004 PHP 33 imagen resultante. Esta es una forma muy conveniente para evitar tener que dibujar un nuevo botón cada vez que quiera cambiar el texto del mismo. Con este método los botones son generados dinámicamente. Un ejemplo de esta característica se muestra en el siguiente ejemplo: <?php #Decimos que es una imagen Header("Content-type: image/jpeg"); #Creamos la imagen a partir de un fichero $im = imagecreatefromjpeg("images/button1.jpg"); #Creamos un color blanco (se usan valores RGB) $blanco = ImageColorAllocate($im, 255, 255, 255); #Tomamos el sitio por donde vamos a empezar a escribir el texto $px = (imagesx($im)-7.5*strlen($texto))/2; #Escribimos el texto ImageString($im,10,$px,9,$texto,$blanco); #Creamos la imagen ImageJPEG($im); #Liberamos la memoria ocupada ImageDestroy($im); ?> Con este método puedes generar la imagen adecuada dinámicamente. El parámetro texto nos permitirá poner el texto que deseemos en la imagen que vamos a generar. 4.- Autentificación de un Usuario con PHP El protocolo HTTP proporciona un mecanismo de autentificación de clientes. Lo más común es que se presente una cajita con dos campos: uno para el login y el otro para la clave. PHP tiene la función Header(). Esta función debe ser llamada antes de que se haya producido ninguna salida del DFSI Curso 2003-2004 PHP 34 fichero html que se está generando. Esta función envía una línea a la cabecera de dicho HTML. Y con esta función es posible enviar un mensaje de "Autentificación Requerida " que forzará al usuario a completar los datos solicitados. El funcionamiento es muy sencillo. Una vez que el usuario ha completado los datos que se le piden, se fuerza una nueva llamada al script con las variables $PHP_AUTH_USER, $PHP_AUTH_PW y $PHP_AUTH_TYPE que contendrán el nombre del usuario, el pasword y el tipo de autentificación. Autentificación de usuarios <?php if (!isset($_SERVER['PHP_AUTH_USER'])) { header("WWW-Authenticate: Basic realm=\"flanagan.ugr.es\""); header("HTTP/1.0 401 Unauthorized"); } ?> <html> <head> <title>Ejemplo 20 </title></head> <body> <h1> Ejemplo de PHP </h1> <?php if (!isset($_SERVER['PHP_AUTH_USER'])) { echo "Texto a enviar si pulsa el botón Cancelar\n"; exit; } else { echo "<p>Hola ".$_SERVER['PHP_AUTH_USER'].".</p>"; echo "<p>Has introducido <b>".$_SERVER['PHP_AUTH_PW']." </b>como tu contraseña. "; } ?> </body> </html> DFSI Curso 2003-2004 PHP 35 Hay que tener mucho cuidado con el orden en el que se envian los diferentes tipos de cabeceras. La cabecera de WWW-authenticate, debe ir siempre delante de la del tipo HTTP/1.0 401. Es una especie de cookie que se mantiene mientras el usuario no apague el navegador. Además el usuario debe ser consciente de que, desde el momento que ha insertado su login y su clave, ha sido identificado y que todo lo que haga puede ser registrado. 5.- Cookies (Galletitas) Una cookie no es más que una variable que se registras dentro del navegador del internauta.Si el navegador tiene configurado que se rechacen las cookies o que se pregunte si se permite aceptarlas, pueden ser controladas. En cambio, por defecto, los navegadores dejan que las cookies se creen sin que el usuario sea consciente de ello. Para PHP las cookies son fáciles de utilizar. Para esto se utiliza la función setcookie() y al igual que la función anterior, Header, tiene que ser invocada antes de producir ninguna salida. La función posee el siguiente formato: int setcookie(string name, string value, int expire, string path, string domain, int secure); Esta función define la cookie que se va a enviar. Todos los argumentos son opcionales a excepción del nombre, Si sólo se especifica el parámetro name, la cookie con ese nombre se borrará del cliente remoto. También puede sustituir cualquier parámetro por una cadena de texto vacía ("") y saltar así ese parámetro. Los parámetros expire y secure son números enteros y no se pueden saltar con una cadena de texto vacía. En su lugar utilice un cero (0). El parámetro expire es un entero de tiempo.El parámetro secure indica que la cookie se debe transmitir única y exclusivamente sobre una conexión segura HTTPS. Todos los parámetros excepto name son opcionales. Si sólo se especifica el parámetro name, la cookie con ese nombre se DFSI Curso 2003-2004 PHP 36 borrarára del cliente remoto. Los parámetros path y domain sirven para distinguir nuestras cookies de las de otros sitios web. setcookie("TestCookie","Test Value"); setcookie("TestCookie",$value,time()+3600); expira en 1 hora */ /* setcookie("TestCookie",$value,time()+3600,"/~rasmus/ ",".utoronto.ca",1); Para poder ver el contenido de un cookie, podemos utilizar: print $TestCookie; print $HTTP_COOKIE_VARS["TestCookie"]; Se pueden utilizar vectores de cookies. setcookie( "cookie[three]", "cookiethree" ); setcookie( "cookie[two]", "cookietwo" ); setcookie( "cookie[one]", "cookieone" ); if ( isset( $cookie ) ) { while( list( $name, $value ) = each( $cookie ) ) { echo "$name == $value \n"; } } Fallos habituales: Las cookies no se hacen visibles hasta la siguiente carga de una página para la que la cookie deba estar visible. Las llamadas múltiples a setcookie() en el mismo script se ejecutarán en orden inverso. Si estas intentando borrar una cookie antes de insertar otra, se debe situar la llamada de inserción antes de la de borrado. 6.- Utilización de ficheros locales y remotos 6.1.- Utilización de ficheros La utilización de ficheros en PHP es muy similar a como se hace en C. Tenemos fopen para abrir un fichero, donde se indica el nombre del fichero y el modo de apertura y nos devuelve el descriptor del fichero. Con feof miramos si DFSI Curso 2003-2004 PHP 37 estamos al final de un fichero. Con fclose cerramos un fichero. Y con fputs y fgets escribimos o leemos, respectivamente, una línead de un fichero. Ejemplo de escritura en un fichero <? //Abrimos el fichero en modo de escritura $DescriptorFichero = fopen("fichero_prueba.txt","w"); //Escribimos una línea $string1 = "Esta es la primera línea de texto\r\n"; fputs($DescriptorFichero,$string1); //Escribimos otra $string2 = "Y esta es la segunda\r\n"; fputs($DescriptorFichero,$string2); //Cerramos el fichero fclose($DescriptorFichero); ?> Ejemplo de lectura de un fichero <? //Abrimos el fichero en modo lectura $DescriptorFichero = fopen("fichero_prueba.txt","r"); //Repetimos hasta que no lleguemos al final del fichero while(!feof($DescriptorFichero)){ //Leemos una línea de como max 4096 caracteres (4KB), que será menos si hay un retorno de carro $buffer = fgets($DescriptorFichero,4096); //Escribimos la línea echo $buffer."<BR>"; } ?> DFSI Curso 2003-2004 PHP 38 También disponemos de fwrite y fread para escribir o leer, respectivamente, un buffer de un fichero. 6.2.- Utilización de ficheros remotos PHP permite la utilización de ficheros remotos para realizar algún tipo de lectura de ellos. En el caso de querer realizar algún tipo de escritura, se debe hacer a través de un servidor ftp. Un ejemplo de ambas cosas se muestra a continuación. Leyendo un fichero remoto <?php #Abrimos el fichero remoto $archivo = fopen("http://www.php.net/", "r"); if (!$archivo) { echo "<p>No se pudo abrir el archivo remoto.\n"; exit; } #Mostramos el fichero línea a línea $i=0; while (!feof($archivo)) { $linea = fgets($archivo, 1024); print "LINEA $i: $linea <BR>"; $i++; } #Cerramos el fichero fclose($archivo); ?> También se puede escribir a archivos en un FTP siempre que se conecte como un usuario con los correctos derechos de acceso, y el archivo no exista ya.Para conectar como un usuario distinto de 'anonymous', se necesita especificar el nombre de usuario (y posiblemente contraseña) dentro de la URL, tales como 'ftp://usuario:[email protected]/camino/a/archivo'. DFSI Curso 2003-2004 PHP 39 Escribiendo en un fichero remoto usando ftp <?php $file = fopen("ftp://ftp.php.net/incoming/outputfile", "w"); if (!$file) { echo "<p>Unable to open remote file for writing.\n"; exit; } /* Escribimos el fichero. */ fputs($file, "$HTTP_USER_AGENT\n"); /*Lo cerramos*/ fclose($file); ?> 7-. Subida de ficheros usando HTTP La solución ideal para intercambios de ficheros es el protocolo FTP, pero los internautas a lo que están acostumbrados es a utilizar la web. Con HTTP Upload podemos lograr que el cliente envie ficheros locales de su computador pulsando un botón. Lo primero que hay que hacer es crear una página HTML con un formulario con el cual enviaremos el fichero: Formulario HTML para enviar ficheros <html> <head> <title>Ejemplo 21</title></head> <body> <h1> Ejemplo de Formulario 3 </h1> <p> <form enctype="multipart/form-data" action="ej22.php" method="post"> Fichero: <input type="file" name="fichero_usuario"> <br> <input type="submit" value="Enviar Fichero"> </form> DFSI Curso 2003-2004 PHP 40 </body> </html> Debemos destacar de este formulario HTML la posibilidad de restringir el tamaño del fichero que se va a enviar. Como HTTP no está pensado para estos menesteres (al contrario de FTP) no es aconsejable usarlo para ficheros grandes. Dentro el PHP que va a procesar el anterior formulario, se encarga de ir recibiendo el fichero y guardarlo en el disco duro . Es importante tener en cuenta que el usuario que está guardando el fichero es aquel con el que se ejecuta el servidor web (normalmente nobody), por lo que deberá tener permisos para escribir en el direcgtorio y ficheros que se utilicen. En el programa PHP que recibe este fichero se van a definir una serie de variables: • • • • $fichero_usuario nombre del fichero temporal en el que se ha almacenado en el servidor el fichero enviado por el usuario. El lugar donde se guardan estos ficheros es el directorio temporal del servidor web. $fichero_usuario_name nombre original del fichero $fichero_usuario_size tamaño del fichero $fichero_usuario_type el tipo MIME del fichero con el que navegador lo ha enviado. Script PHP para recibir ficheros <html> <head> <title>Ejemplo 22</title></head> <body> <h1> Ejemplo de Formulario 3 </h1> <p> <?php #Mostramos información del fichero recibido print "El fichero recibido está $fichero_usuario <br>\n"; print "El nombre del fichero recibido es $fichero_usuario_name <br>\n"; DFSI Curso 2003-2004 PHP print "El tamaño del fichero recibido es $fichero_usuario_size <br>\n"; print "El tipo MIME del fichero recibido es $fichero_usuario_type <br>\n"; #mostramos el contenido print "El contenido del fichero recibido es: <br>\n"; #Abrimos el fichero remoto $archivo = fopen("$fichero_usuario", "r"); if (!$archivo) { echo "<p>No se pudo abrir el archivo remoto.\n"; exit; } #Mostramos el fichero línea a línea $i=0; while (!feof($archivo)) { $linea = fgets($archivo, 1024); print "LINEA $i: $linea <BR>"; $i++; } #Cerramos el fichero fclose($archivo); ?> </body> </html> 8-. Manejo de conexiones En PHP las conexiones que se mantinen pueden tener tres estados, Normal (0), Aborted (1) y Timeout (2). En un script normal, el estado es NORMAL, cuando el cliente desconecta, el estado pasa a ser ABORTED y si el límite impuesto por PHP-imposed ha transcurrido, (set_time_limit(), el tiempo por defecto es 30 segundos) el estado es TIMEOUT. 41 DFSI Curso 2003-2004 PHP 42 Una función muy util para estos casos, es connection_status() que devuelve el estado de la conexión. 8.1.- Conexiones a bases de datos Las conexiones persistentes son enlaces SQL que no se cierran cuando la ejecución del script termina. El comportamiento de estas conexiones es el siguiente. Cuando se invoca una conexión de este tipo, PHP comprueba si existe una conexión de este mismo tipo o por el contrario, se trata de una nueva conexión. En el caso de que exista, se procede a su uso, y en el caso de que no exista, la conexión se crea. Dos conexiones se consideran iguales cuando están realizadas sobre el mismo servidor, con el mismo usuario y la misma contraseña. Pero en realidad, estas conexiones permanentes, no proporcionan ningún tipo de funcionabilidad adicional frente a conexiones temporales, debido a la forma en que los servidores Web funcionan. Aún así se utilizan debido a la eficiencia, debido al tiempo de establecimiento de la conexión, y debido a que si tienes una sóla conexión sobre el servidor, irá mucho más rápido que si tienes 10 conexiones temporales, puesto que la carga que soporta es diferente. 9.- Funciones de PHP para MySQL La lista de funciones disponibles es la siguiente: • mysql_affected_rows: Otiene el número de tuplas modificadas en la última operacion MySql. int mysql_affected_rows(int [identificador de link]) Devuelve el número de líneas afectadas por la última operación, INSERT, UPDATE o DELETE, asociadas con el identificador que se especifica. Si no se especifica el link, se asume que se refiere al último. DFSI Curso 2003-2004 PHP 43 Excepción: Si la última operación ha borrado todos los registros de una tabla, esta función devuelve 0. Esta función no tiene efecto con ninguna operación SELECT, puesto que no modifican ninguna línea. • mysql_change_user: Modifica el usuario responsable de las operaciones. int mysql_change_user(string user, string password, string[database], int [identificador de link] Los parámetros database y link son opcionales. Si la nueva combinación de usuario y password no es correcta, seguirá activa la actual. • mysql_close : Cierra la conexión MySql. int mysql_close(int [identificador de link] Esta función cierra la conexión permanente que mantiene el link. El parámetro es opcional. Si no se especifica, se cerrará la última conexión abierta. Si una conexión no se cierra, el script la cierra automáticamente al terminar su ejecución. Esta función no opera correctamente con las conexiones abiertas con la función mysql_pconnect(). • mysql_connect: Open a connection to a MySQL Server. int mysql_connect(string[hostname [:port][:/path/to/socket]], string[username],string [password]) Esta función establece una conexión a un servidor mysql. Todos los argumentos son opcionales y los valores por defecto son localhost, el usuario dueño del proceso, sin password. DFSI Curso 2003-2004 PHP 44 Si realizas dos veces una llamada a esta función con los mismos parámetros, devuelve el mismo identificador que para la llamada anterior. Todas las conexiones terminan al terminar la ejecución del script, a no ser que se elimine la conexión llamando a la función mysql_close(). • mysql_create_db: Crea una base de datos en el gestor de Bases de Datos. int mysql_create_db(string databaseName, int [identificador del link]) Esta función crea una nueva base de datos asociada al link especificado. Para mantener la coherencia con otras versiones, se utiliza mysql_createdb() • mysql_data_seek: Realiza un movimiento en el puntero de los datos resultado. int mysql_data_seek(int result_identifier, int row_number) Esta función permite que el puntero a los resultados apunte a la línea especificada. El número de líneas comienza en 0. • mysql_db_query: Realiza una consulta a una base de datos. int mysql_db_query(string database, string query, int [identificador del link] Selecciona la base de datos database y ejecuta una consulta. Si no se especifica el link, utiliza el último abierto, si no existe, intenta optener uno llamando internamente a la función mysql_connect() sin argumentos. DFSI Curso 2003-2004 • PHP 45 mysql_drop_db: Realiza una operación Drop sobre una base de datos. int mysql_drop_db(string database_name, int [identificador del link]) Devuelve True o False según haya o no tenido éxito. Nota: Cuidado, según la versión de MySql, borra toda la base de datos aún conteniendo tablas con datos. • mysql_errno: Devuelve un código de error relacionado con la última operación MySql realizada. int mysql_errno(int [identificador del link] Esta función devuelve el número del código de error que devuelve el servidor MySql. • mysql_error : Devuelve el mensaje de error asociado a un código concreto relacionado con la última operación MySql realizada. string mysql_error(int [identificador del link] Devuelve la cadena asociada a un error que posee el identificador de conexión que se especifica. • mysql_fetch_array: Introduce el resultado en un array asociativo. array mysql_fetch_array(int result, int [result type]) Esta función es una versión extendida de mysql_fetch_row(). Lo que hace es almacenar el resultado en un array indexado, almacenando así los datos en un índice asociativo utilizando los nombres de los campos como claves. Si existen más de una columna con el mismo nombre, tendrá precedencia la última columna. Para acceder a lal otras columnas con el mismo nombre, se debe indexar la columna o hacerun alias para ella. DFSI Curso 2003-2004 PHP 46 Ejemplo: select tabla1.precio as precio 1, tabla2.precio as precio2 from tabla1, tabla2 El segundo argumento, es una constante que puede tomar los siguientes valores. MYSQL_ASSOC MYSQL_NUM MYSQL_BOTH o o o • mysql_fetch_field: Devuelve un objeto con la información de un resultado. object mysql_fetch_field(int result, int [field_offset]) Devuelve un objeto con la información que contiene result Puede utilizarse par obtener información de los campos de ciertas consultas. Si el campo del desplazamiento no está especificado, se selecciona el siguiente dato que no haya sido ya asignado mediante esta función. Las propiedades del objeto son: name: Nombre del campo table: Nombre de la tabla a la que pertenece el o o campo. o o o o o o o o o o max_length: Longitud máxima. not_null: Será verdadero si el campo poosee esta propiedad. primary_key: Verdadero si el campo es la clave principal. unique_key: Verdadero si el campo es clave única. multiple_key: Verdadero si el campo no es clave única. numeric: Verdadero si se trata de un campo numérico. blob: Verdadero si la columna es a BLOB. type: Tipo de la columna. unsigned: Verdadero si se trata de un dato sin signo. zerofill: Verdadero si la columna tiene la propiedad zerofill. DFSI Curso 2003-2004 • PHP 47 mysql_fetch_lengths: Obtener la longitud de los resultados. array mysql_fetch_lengths(int result) Devuelve un array que contiene las longitudes de todos los campos que forman el último registro asignado con la función mysql_fetch_row(), mysql_fetch_array() o mysql_fetch_object(). • mysql_fetch_object: Devuelve el resultado como un objeto. object mysql_fetch_object(int result, int [result_type]) Devuelve un objeto con las propiedades del último registro extraido de un resultado. Esta función es igual que mysql_fetch_array() con la diferencia de que se obtiene un objeto en vez de un array. El segundo argumento, es una constante que puede tomar los siguientes valores. MYSQL_ASSOC MYSQL_NUM MYSQL_BOTH o o o • mysql_fetch_row : Devuelve el resultado como un array. array mysql_fetch_row(int result) Devuelve un array con un registro del resultado o false en el caso de que no existan registros. Si se llama dos veces a esta función, él asignará el primer registro del resultado la primera vez y el segundo registro del resultado la segunda vez. • mysql_field_name: Devuelve el nombre de un campo especificado en un resultado. string mysql_field_name(int result, int field_index) DFSI Curso 2003-2004 PHP 48 Devuelve el nombre del campo que se especifica, mediante el orden que ocupe dentro del resultado. • mysql_field_seek: Asigna el puntero de los resultados a una posición determinada. int mysql_field_seek(int result, int field_offset) Busca el desplazamiento que se especifica en el segundo argumento, dentro del resultado. • mysql_field_table: Obtiene el nombre de la tabla de un campo especificado. string mysql_field_table(int result, int field_offset) • mysql_field_type: Obtiene el tipo de un campo especificado. Obtiene el nombre de la tabla para el campo que se indica en el desplazamiento. string mysql_field_type(int result, int field_offset) Se devuelve el tipo del campo que se indica mediante el desplazamiento. Las cadenas que devuelve pueden ser: int real string blob Otros tipos detallados en la documentación de o o o o o MySql. • mysql_field_flags: Obtiene los "Flags" asociados del campo especificado. string mysql_field_flags(int result, int field_offset) Devuelve una cadena con las propiedades del campo separadas por un espacio. Para partir esa cadena se puede utilizar la función explode() DFSI Curso 2003-2004 PHP 49 Las palabras que puede devolver son: o o o o o o o o o o o • not_null primary_key unique_key multiple_key blob unsigned zerofill binary enum auto_increment timestamp mysql_field_len: Obtiene las longitud de un campo especificado. int mysql_field_len(int result, int field_offset) Devuelve la longitud del campo especificado. • mysql_free_result: Libera la memoria de los resultados. int mysql_free_result(int result) Libera la memoria que utiliza el parámetro. • mysql_insert_id: Obtiene el identificador de la última operación INSERT. int mysql_insert_id(int [link_identifier] ) Devuelve el ID generado para un campo AUTO_INCREMENTED. Devolverá el id autogenerado devuelto por la última operación INSERT del enlace que se especifica como argumento. Si el identificador no se especifica, se utiliza la última conexión abierta. • mysql_list_fields: Lista los campos resultado. DFSI Curso 2003-2004 PHP 50 int mysql_list_fields(string database_name, string table_name, int [link_identifier] Devuelve información del nombre de la tabla que se proporciona. El puntero que devuelve, puede ser utilizado con las funciones mysql_field_flags(), mysql_field_len(), mysql_field_name() y mysql_field_type(). El resultado es un entero positivo, sólo devuelve -1 en caso de que exista algún error. • mysql_list_dbs: Lista las bases de datos disponibles en el servidor MySQL. int mysql_list_dbs(int [link_identifier] ) Devuelve un puntero que contiene la lista de bases de datos disponibles en ese servidor MySql. Con la información que devuelve, puede llamarse a la función mysql_tablaname(). • mysql_list_tables: Lista las tablas de una base de datos MySql. int mysql_list_tables(string database, int [link_identifier] ) Extrae un putero a la lista de tablas que están en una base de datos. Para extraer el nombre de las tablas se puede posteriormente utilizar mysql_db_query() o mysql_tablename(). • mysql_num_fields: Otiene el número de campos del resultado. int mysql_num_fields(int result); Devuelve el número de campos que contiene el parámetro resultado. DFSI Curso 2003-2004 • PHP 51 mysql_num_rows: Obtiene el número de líneas del resultado. int mysql_num_rows(int result) Devuelve el número de líneas que contiene el parámetro resultado. • mysql_pconnect: Abre una conexión permanente con una base de datos. int mysql_pconnect(string [hostname [:port] [:/path/to/socket] ] , string [username] , string [password] ) Devuelve una conexión persistente a un servidor MySql. Todos los argumentos son opcionales y sus valores son los mismos que para la función mysql_connect(). Esta función primero, intenta encontrar una conexión ya existente, si la encuentra, devuelve un identificador para ella, y en el caso de que no la encuentre, abre una nueva conexión permanente. Despues de esto, mantiene la conexión hasta que finaliza la ejecución del script. Hay que tener cuidado, porque mysql_close() no cierra conexiones abiertas con esta función. • mysql_query: Envia una consulta SQL a MySQL. int mysql_query(string query, int [identificador del link] ) Envía una consulta a una base de datos activa en el servidor asociado al link que se especifica. En el caso de que no se especifique ninguna conexión abierta, la función intenta reestablecer una conexión con la función mysql_connect(). La cadena de la consulta, debe terminar con ;. DFSI Curso 2003-2004 PHP 52 La función devuelve TRUE o FALSE si la consulta tiene éxito. Si el valor devuelto es TRUE, significa que la consulta puede ser realizada, no que existan datos que respondan a esa consulta. Para consultar cuantas líneas responden a esa consulta, se puede utilizar la función mysql_affecter_rows() y nos dirá cuantas líneas se han visto afectadas por la última operación INSERT, DELETE, REPLACE o UPDATE. En el caso de tratarse de una operación SELECT la función mysql_query() devuelve un identificador de resultado que se puede utilizar con la función mysql_result(). • mysql_result: Obtiene los datos resultados. int mysql_result(int result, int row, mixed [field] ) Devuelve el contenido de una celda de la tabla dinámica que devuelve MySql como resultado de una operación previa. El último argumento es opcional y puede contener el desplazamiento del campo que se desea obtener, el nombre del campo o algo como tabla.campo o el alias del campo que se desee consultar si se establecio previamente. Cuando se trabaja con amplios conjuntos de resultados, es mejor utilizar alguna de las funciones que extraen un registro de esa consulta. Hay que tener cuidado de no hacer llamadas a funciones que obtienen resultados de result junto con esta función, puesto que el puntero que va leyendo de los resultados, puede perderse. • mysql_select_db: Selecciona una base de datos MySql. int mysql_select_db(string database_name, int [identificador del link] ) Esta función asigna la base de datos activa en el servidor asociado al identificador del link. DFSI Curso 2003-2004 • PHP 53 mysql_tablename: Obtiene el nombre de la tabla de un campo. string mysql_tablename(int result, int i) Esta función devuelve el nombre de una tabla de un puntero de resultados que ha devuelto previamente la función mysql_num_rows. 9.1.- Ejemplos de utilización de MySQL desde PHP Ejemplo de creación de una base de datos <html> <head><title>Ejemplo de creación de una BD con PHP y MySQL</title> </head> <body> <h2>Creación de una base de datos</h2> <?php $host="flanagan.ugr.es"; $user="serweb"; $password="serweb"; #Conectamos a MySQL $bd=@mysql_connect($host,$user,$password) or die ("No se puede conectar a MySQL: ".mysql_error()); #Creamos una base de datos if (@mysql_create_db ("mi_bd")) { print ("<p>Base de Datos creada con éxito \n"); } else { printf ("<p>ERROR al crear la base de datos: %s\n", mysql_error ()); } ?> </body> </html> DFSI Curso 2003-2004 PHP 54 Ejemplo de creación de una tabla <html> <head><title>Ejemplo de creación de una tabla con PHP y MySQL</title> </head> <body> <h2>Creación de una tabla</h2> <?php $host="flanagan.ugr.es"; $user="serweb"; $password="serweb"; #Conectamos a MySQL $bd=@mysql_connect($host,$user,$password) or die ("No se puede conectar a MySQL: ".mysql_error()); #Creamos una tabla de articulos $campos_tabla_articulos=" id INT PRIMARY KEY, nombre VARCHAR(200) NOT NULL, precio FLOAT"; #Creamos 1 variable con la sentencia SQL que crea la tabla $SQL_crea_tabla_articulos="create table tabla_articulos ($campos_tabla_articulos);"; #Ejecutamos la sentencia $result =@ mysql_db_query("mi_bd",$SQL_crea_tabla_articulos) or die ("<p>ERROR, No puedo crear la tabla". mysql_error()); print "<p>Tabla creada</p>"; ?> </body> </html> Ejemplo de inserción en una tabla <html> <head><title>Ejemplo de inserción en una tabla con PHP y MySQL</title> DFSI Curso 2003-2004 PHP 55 </head> <body> <h2>Inserción en una tabla</h2> <?php $host="flanagan.ugr.es"; $user="serweb"; $password="serweb"; #Conectamos a MySQL $bd=@mysql_connect($host,$user,$password) or die ("No se puede conectar a MySQL: ".mysql_error()); #Insertamos 2 artículos $SQL_inserta1="insert into tabla_articulos values (10,'patatas',1.4);"; $SQL_inserta2="insert into tabla_articulos values (5,'manzanas',2.2);"; $result = @mysql_db_query("mi_bd",$SQL_inserta1) or print ("\n No puedo insertar"); $result = @mysql_db_query("mi_bd",$SQL_inserta2) or print ("\n No puedo insertar"); ?> </body> </html> Ejemplo de consulta en una tabla con arrays numéricos <html> <head><title>Ejemplo de consulta en una tabla con PHP y MySQL</title> </head> <body> <h2>Consulta en una tabla</h2> <?php $host="flanagan.ugr.es"; $user="serweb"; $password="serweb"; DFSI Curso 2003-2004 PHP 56 #Mostramos el contenido de la tabla $result = @mysql_db_query("mi_bd","select * from tabla_articulos;"); while($fila = mysql_fetch_array($result, MYSQL_NUM)) { echo "<p>".$fila[0]." "; echo $fila[1]." "; echo $fila[2]." "; } #Liberamos la memoria usada por la consulta mysql_free_result($result); ?> </body> </html> Otro ejemplo de consulta en una tabla con arrays asociativos <html> <head><title>Ejemplo de consulta en una tabla con PHP y MySQL</title> </head> <body> <h2>Consulta en una tabla</h2> <?php $host="flanagan.ugr.es"; $user="serweb"; $password="serweb"; #Mostramos el contenido de la tabla $result = mysql_db_query("mi_bd","select * from tabla_articulos;"); $result = @mysql_db_query("mi_bd","select * from tabla_articulos;"); while($fila = mysql_fetch_array($result, MYSQL_ASSOC)) { echo "<p>".$fila["id"]." "; echo $fila["nombre"]." "; echo $fila["precio"]." "; } #Liberamos la memoria usada por la consulta mysql_free_result($result); ?> DFSI Curso 2003-2004 PHP </body> </html> Otro ejemplo de consulta en una tabla con objetos <html> <head><title>Ejemplo de consulta en una tabla con PHP y MySQL</title> </head> <body> <h2>Consulta en una tabla</h2> <?php $host="flanagan.ugr.es"; $user="serweb"; $password="serweb"; #Mostramos el contenido de la tabla $result = mysql_db_query("mi_bd","select * from tabla_articulos;"); while($fila = mysql_fetch_object($result)) { echo "<p>".$fila->id." "; echo $fila->nombre." "; echo $fila->precio." "; } #Liberamos la memoria usada por la consulta mysql_free_result($result); ?> </body> </html> 57