Conceptos Avanzados del lenguaje PHP >
Autor: F. Javier García Castellano Web: http://decsai.ugr.es/~fjgc, Mail: fjgc@decsai.ugr.es |
(C) GeNeura Team Web: http://geneura.ugr.es, Mail: todos@geneura.ugr.es |
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; } // 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 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; // Compramos las cosas interesantes $different_cart = new Otro_Carrito ("AzlonXP 3000+", 17);
En PHP hay cuatro tipos de errores y avisos:
- 1 - Errores Normales de Funciones (Normal Function Error )
- 2 - Avisos Normales (Normal Warnings)
- 4 - Errores del analicador de código (Parse Errors)
- 8 - 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>
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 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.
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 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>
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.
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 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.
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 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>"; } ?>
También disponemos de fwrite y fread para escribir o leer, respectivamente, un buffer de un fichero.
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:clave@ftp.ejemplo.com/camino/a/archivo'.
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); ?>
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> </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:
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"; 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>
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.
Una función muy util para estos casos, es connection_status() que devuelve el estado de la conexión.
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.
La lista de funciones disponibles es la siguiente:
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.
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.
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.
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().
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.
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().
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()
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.
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.
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.
int mysql_errno(int [identificador del link] Esta función devuelve el número del código de error que devuelve el servidor MySql.
string mysql_error(int [identificador del link] Devuelve la cadena asociada a un error que posee el identificador de conexión que se especifica.
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.
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
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 campo.
- 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.
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().
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
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.
string mysql_field_name(int result, int field_index) Devuelve el nombre del campo que se especifica, mediante el orden que ocupe dentro del resultado.
int mysql_field_seek(int result, int field_offset) Busca el desplazamiento que se especifica en el segundo argumento, dentro del resultado.
string mysql_field_table(int result, int field_offset)
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 MySql.
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()
Las palabras que puede devolver son:
- not_null
- primary_key
- unique_key
- multiple_key
- blob
- unsigned
- zerofill
- binary
- enum
- auto_increment
- timestamp
int mysql_field_len(int result, int field_offset) Devuelve la longitud del campo especificado.
int mysql_free_result(int result) Libera la memoria que utiliza el parámetro.
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.
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.
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().
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().
int mysql_num_fields(int result); Devuelve el número de campos que contiene el parámetro resultado.
int mysql_num_rows(int result) Devuelve el número de líneas que contiene el parámetro resultado.
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.
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 ;.
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().
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.
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.
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.
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>
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> </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"; #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); ?> </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>
Ejercicio: Prueba a realizar una conexión con el mysql, crea una tabla, inserta un par de valores, lee los valores de la tabla y muestralos en la salida. La tabla la puedes crear con tres elementos, un nombre, un precio y una pequeña descripcion. Nota: antes de crear una tabla (en SQL) tienes que haber creado la base de datos con la que vas a trabajar
Ejercicio: Utilizando la tabla del ejemplo anterior crea una pagina PHP que te permita seleccionar un cantidad de elementos de la base de datos y envie los elementos seleccionados a otro PHP que te guarda los seleccionado en una cookie. Si hay más de uno puedes utilizar un vector.
Ejercicio: Pide el idioma del usuario entre varios (español o inglés), y guardalo en un cookie para uso futuro. Crea un formulario con un campo para escribir un email, otro para un asunto y un tercero para escribir un tema, con esos datos envia un correo.(Nota: Usa la referencia de funciones XLIX. Funciones de Correo)