ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA 301127- Programación de sitios web Act 12: Lección Evaluativa 3 BASES DE DATOS Hasta ahora hemos visto la funciones básicas de PHP, lo que viene a continuación ya es sobre la forma en como podemos acceder a bases de datos, veremos como acceder a ellas en dos sistemas de bases de datos diferentes, los cuales son MySQL Server y Microsoft Access. El primer sistema que veremos es MySQL Server, pero antes de ver código PHP, aprenderemos un poco de este sistema, para los ejemplos en PHP ya va a ser necesario que tengamos una base de datos creada por lo tanto pondremos atención en las formas en que estas se crean. QUE ES MYSQL Administrador de Base de Datos Una base de datos es un conjunto de datos estructurados. Esto podría ser cualquier cosa, desde una simple lista de compras hasta una galería de pinturas o la gran cantidad de información que se maneja en una corporación. Para agregar, acceder y procesar los datos almacenados en una base de datos computacional, se necesita un sistema administrador de base de datos tal como MySQL. Además los computadores son muy buenos manejando grandes cantidades de datos, el administrador de base de datos juega un rol central en la computación, ya sea como utilidad autónoma o parte de otra aplicación. Sistema administrador de base de datos relacionales Una base de datos relacional almacena datos en tablas separadas, más bien colocando todos los datos en un gran almacén. Esto agrega velocidad y flexibilidad. Las tablas son enlazadas por relaciones definidas haciendo posible combinar datos desde varias tablas solicitadas. El SQL forma parte de MySQL, conocido como Lenguaje de Consultas Estructurado, es el lenguaje estandarizado más común usado para acceder base de datos. Software de Fuente Abierta Fuente abierta significa que es posible que pueda ser usado y modificado por cualquiera. Alguien puede bajar MySQL desde Internet y usar éste sin tener que pagar nada. Alguien puede estudiar el código fuente y cambiarlo de acuerdo a sus 1 ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA 301127- Programación de sitios web Act 12: Lección Evaluativa 3 necesidades. MySQL usa el GPL de la GNU, para definir lo que se puede hacer con el software en diferentes situaciones. Uso de MySQL MySQL es muy rápido, seguro y fácil de usar. MySQL también ha desarrollado un conjunto de características muy prácticas, en estrecha cooperación con otros usuarios. MySQL fue desarrollado para manejar grandes bases de datos mucho más rápido que las soluciones existentes y ha sido usado exitosamente en ambientes de producción con altas demandas, por varios años. Aunque está bajo un desarrollo constante, MySQL siempre ofrece conjunto de funciones muy poderoso y eficiente. La conectividad, velocidad y seguridad hace de MySQL una suite poderosa para acceder a bases de datos en Internet. CARACTERISTICAS TECNICAS DE MYSQL Características Técnicas de MySQL MySQL es un sistema Cliente/Servidor que consta de un servidor SQL multihilo que soporta diferentes backends, variados programas cliente y de librerías, administrador de herramientas y un programa de interface. MySQL contribución para muchos de los software disponibles Es mucho más probable que se encuentre que diversas aplicaciones ya soportan MySQL. Los valores centrales de MySQL son : • La mejor y más usada base de datos en el mundo. • Disponible y Accesible para todos • Fácil de usar • Se está perfeccionando continuamente mientras permanece rápida y segura. • Divertida para usar y perfeccionar. • Libre de molestias. CARACTERISTICAS PRINCIPALES DE MYSQL A continuación se describen algunas de las características más importantes de MySQL: 2 ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA 301127- Programación de sitios web Act 12: Lección Evaluativa 3 • Escrito en C y C++, testado con GCC 2.7.2.1. Usa GNU autoconf para portabilidad. • Clientes C, C++, Eiffel,PHP,Python,JAVA, Perl, TCL. • Multiproceso, es decir puede usar varias CPU si éstas están disponibles. • Puede trabajar en distintas plataformas y S.O. distintos. • Sistema de contraseñas y privilegios muy flexible y segura. • Todas la palabras de paso viajan encriptadas en la red. • Registros de longitud fija y variable. • 16 índices por tabla, cada índice puede estar compuesto de 1 a 15 columnas o partes de ellas con una longitud máxima de 127 bytes. • Todas las columnas pueden tener valores por defecto. • Utilidad Isamchk para chequear, optimizar y reparar tablas. • Todos los datos están grabados en formato ISO8859_1. • Los clientes usan TCP o UNIX Socket para conectarse al servidor. • Todos los comandos tienen -help o -? Para las ayudas. • Soporta diversos tipos de columnas como enteros de 1, 2, 3, 4, y 8 bytes, coma , flotante, doble precisión, carácter, fechas, enumerados, etc. • ODBC para Windows 95 (con fuentes), se puede utilizar ACCESS para conectar con el servidor. • Muy rápida usando joins, optimizada para un barrido multi-joins. Todas las funciones y operadores soportan en el SELECT y WHERE como partes de consultas. Ejemplo: • mysql> SELECT CONCAT(nombre," ",apellido) FROM nombre_tabla WHERE ingreso >10000 AND edad >30 Todas las clausulas SQL soportan GROUP BY y ORDER BY. 3 ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA 301127- Programación de sitios web Act 12: Lección Evaluativa 3 Funciones para el manejo de php con mysql mysql_connect ( ) Abre una conexión a un servidor MySQL int mysql_connect ([string hostname [:puerto] [:/camino/al/socket] [, string usuario [,string password]]]) Devuelve: Un identificador de enlace positivo si tiene exito, o falso si error. mysql_connect()establece una conexión a un servidor MySQL. Todos los argumentos son opcionales, y si no hay , se asumen los valores por defecto (’localhost’, usuario propietario del proceso del servidor, password vacia). El hostname puede incluir tambien un número de puerto . ej. "hostname:puerto"o un camino al socket ej. ":/camino/al/socket"para localhost. Nota: Soporte para ":puerto"fue añadido en PHP 3.0B4. Soporte para ":/camino/al/socket"fue añadido en PHP 3.0.10. En el caso de que se haga una llamada a mysql_connect() con los mismos argumentos, no se establecerá un nuevo enlace, sino que se devolverá el enlace ya abierto. El enlace al servidor sera cerrado tan pronto como la ejecución del script finalice, a menos que se cierre antes explicitamente llamando a mysql_close(). Ejemplo 1. Ejemplo de MySQL connect <?php $link = mysql_connect ("kraemer", "marliesle", "secret") { or die ("Could not connect"); } print ("Connected successfully"); mysql_close ($link); ?> mysql_select_db () Selecciona un base de datos MySQL 4 ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA 301127- Programación de sitios web Act 12: Lección Evaluativa 3 int mysql_select_db (string base_de_datos [, int identificador_de_enlace]) Devuelve : true si exito, false si error. mysql_select_db() establece la base activa que estara asociada con el identificador de enlace especificado. Si no se especifica un identificador de enlace, se asume el ultimo enlace abierto. Si no hay ningun enlace abierto, la función intentara establecer un enlace como si se llamara a mysql_connect(). Toda llamada posterior a mysql_query() utilizara la base activada. mysql_fetch_array() Extrae la fila de resultado como una matriz asociativa array mysql_fetch_array (int id_resultado [, int tipo_de_resultado]) Devuelve una matriz que corresponde a la sentencia extraida, o falso si no quedan más filas. mysql_fetch_array() es una versión extendida de mysql_fetch_row(). Además de guardar los datos en el indice numérico de la matriz, guarda también los datos en los indices asociativos, usando el nombre de campo como clave. Si dos o más columnas del resultado tienen el mismo nombre de campo, la última columna toma la prioridad. Para acceder a la(s) otra(s) columna(s) con el mismo nombre, se debe escificar el indice numerico o definir un alias para la columna. select t1.f1 as foo t2.f1 as bar from t1, t2 La función mysql_fetch_array() no es significativemente mas lenta que mysql_fetch_row(), sin embargo tiene un valor añadido importante. El segundo argumento opcional tipo_de_resultado en mysql_fetch_array() es una constante y puede tomar los valores siguientes: MYSQL_ASSOC, MYSQL_NUM, y MYSQL_BOTH. (Esta funcionalidad fue añadida en PHP 3.0.7) Ejemplo 1. mysql fetch array <?php mysql_connect($host,$user,$password); $result = mysql_db_query("database","select * from table"); while($row = mysql_fetch_array($result)) { echo $row["user_id"]; 5 ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA 301127- Programación de sitios web Act 12: Lección Evaluativa 3 echo $row["fullname"]; } mysql_free_result($result); ?> mysql_free_result () Libera la memoria del resultado int mysql_free_result (int id_resultado) mysql_free_result() solo necesita ser llamada si te preocupa usar demasiado memoria durante la ejecución de tu script. Toda la memoria del resultado especificado en el parametro del identificador de resultado sera automaticamente liberada. mysql_num_rows() Devuelve el numero de filas de un resultado int mysql_num_rows (int id_resultado) mysql_num_rows() Devuelve el numero de filas de un identificador de resultado. mysql_query () Envia una sentencia SQL a MySQL int mysql_query (string sentencia [, int identificador_de_enlace]) mysql_query() envia una sentencia a la base activa en el servidor asociado al identificador de enlace. Si no es especificado un identificador_de_enlace, se asumira el ultilmo enlace abierto. Si no hay ningun enlace abierto, la función intenta estalecer un enlace como si se llamara función mysql_connect() sin argumentos, y lo utiliza. La sentencia no puede terminar por punto y coma. mysql_query() devuelve TRUE (no-cero) o FALSE para indicar si la sentencia se ha ejecutado correctamente o no. Un valor TRUE significa que la sentencia era correcta y pudo ser ejecutada en el servidor. No indica nada sobre el numero de 6 ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA 301127- Programación de sitios web Act 12: Lección Evaluativa 3 fila devueltas. Es perfectamente posible que la sentencia se ejecute correctamente pero que no devuelve ninguna fila. La siguiente sentencia es invalida sintacticamente, asi que mysql_query() falla y devuelve FALSE: Ejemplo 1. mysql_query() <?php $result = mysql_query ("SELECT * WHERE 1=1") or die ("Invalid query"); ?> La siguiente sentencia es invalida semanticamente si my_col no es una columna de la tabla my_tbl, asi que mysql_query() falla y devuelve FALSE mysql_affected_rows() Devuelve el número de filas afectadas de la última operación MySQL int mysql_affected_rows ([int identificador_de_enlace]) mysql_affected_rows() devuelve el número de filas afectadas en la ultima sentencia INSERT, UPDATE o DELETE sobre el servidor asociado con el identificador de enlace especificado. Si el identificador de enlace no ha sido especificado, se asume por defecto el último enlace. Si la última sentencia fue un DELETE sin clausula WHERE, todos los registros han sido borrados de la tabla pero esta función devolvera cero. Este comando no es efectivo para las sentencias SELECT, sino sólo para las sentencias que modifican registros. Para conseguir el número de lineas devueltos por un SELECT, usar mysql_num_rows(). mysql_result () Devuelve datos de un resultado int mysql_result (int id_resultado, int numero_de_fila [, mixed campo]) mysql_result() devuelve el contenido de una celda de un resultado MySQL. El campo argumento puede ser el nombre del campo o el offset o tabla.nombre_del_campo. Si el nombre de la columna tiene un alias (’select foo as bar from...’), utilice el alias en lugar del nombre de la columna. 7 ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA 301127- Programación de sitios web Act 12: Lección Evaluativa 3 Cuando se trabaja un un gran resultado, debe considerarse la utilizacion de una funcion que devuelva una fila entera ya que estas funciones son MUCHO mas rapidas que mysql_result(). Tambien, especificando un offset numerico en lugar del nombre del campo, la ejecucion sera mas rapida. Las llamadas a mysql_result() no deben mezclarse con llamadas a las otras sentencias que trabajan con un identificador de resultado mysql_errno () Deuelve el número del mensaje de error de la última operación MySQL int mysql_errno ([int identificador_de_enlace]) Los errores devueltos por mySQL no indican los warnings. Usar estas funciones para encontrar el número de error. <?php mysql_connect("marliesle"); echo mysql_errno().": ".mysql_error()."<BR>"; mysql_select_db("nonexistentdb"); echo mysql_errno().": ".mysql_error()."<BR>"; $conn = mysql_query("SELECT * FROM nonexistenttable"); echo mysql_errno().": ".mysql_error()."<BR>"; ?> mysql_error () Devuelve el texto del mensaje de error de la última operación MySQL string mysql_error ([int identificador_de_enlace]) Los errores devueltos por mySQL no indican los warnings. Usar estas funciones para encontrar el número de error. <?php mysql_connect("marliesle"); echo mysql_errno().": ".mysql_error()."<BR>"; mysql_select_db("nonexistentdb"); echo mysql_errno().": ".mysql_error()."<BR>"; $conn = mysql_query("SELECT * FROM nonexistenttable"); echo mysql_errno().": ".mysql_error()."<BR>"; 8 ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA 301127- Programación de sitios web Act 12: Lección Evaluativa 3 ?> mysql_close ( ) cierra el enlace con MySQL int mysql_close ([int identificador_de_enlace]) Devuelve: verdadero si exito, falso si error. mysql_close() cierra el enlace con la base MySQL que esta asociada con el identificador de enlace especificado. Si no se especifica el identificador de enlace, se asume por defecto el último enlace. Nota: Normalmente no es necesario ya que la aperturas no-persistentes son cerradas automaticamente al final de la ejecución del script. mysql_close() no mysql_pconnect(). cerrará los enlaces persistentes Ejemplo 1. Ejemplo de MySQL close <?php $link = mysql_connect ("kraemer", "marliesle", "secret") { or die ("Could not connect"); 623 MySQL } print ("Connected successfully"); mysql_close ($link); ?> 9 generados con ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA 301127- Programación de sitios web Act 12: Lección Evaluativa 3 Sesiones ¿Qué son las sesiones?, básicamente una sesión es la secuencia de páginas que un usuario visita en un sitio web. Desde que entra en nuestro sitio, hasta que lo abandona. El término sesión en PHP, session en inglés, se aplica a esta secuencia de navegación, para ello crearemos un identificador único que asignamos a cada una de estas sesiones de navegación. A este identificador de sesión se le denomina, comúnmente, como la sesión. El proceso en cualquier lenguaje de programación podría ser algo así: ¿Existe una sesión?, si existe lo retomamos, si no existe la creamos y le damos un identificador único. Y para que no perdamos el hilo de la navegación del usuario deberemos asociar esta sesión a todas las direcciones (URLs) y acciones de formularios. Podemos también crear una cookie que incluya el identificador de sesión, pero es conveniente recordar que la disponibilidad o no de las cookies depende del usuario, y no es conveniente fiarse de lo que un usuario pueda o no tener habilitado. Lo contado hasta ahora es teoría pura y es aplicable a cualquier lenguaje de programación C, Perl, etc. Los que programamos en PHP4 tenemos la suerte de que toda la gestión de sesiones la hace el mismo PHP. Por lo tanto lo comentado aquí sobre sesiones es solo aplicable a PHP4. Inicialización de la sesión Para utilizar sesiones en PHP lo primero es inicializarlas. Podemos hacerlo explícitamente, mediante la función session_start(), o al registrar una variable en una sesión mediante session_register('miVariable'). En ambos casos se crea una nueva sesión, si no existe, o se retoma la sesión actual. Veamos un sencillo ejemplo: <?php session_start(); echo "Se inició la sesión"; 10 ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA 301127- Programación de sitios web Act 12: Lección Evaluativa 3 ?> Esta es la forma más básica, si el usuario tiene las cookies activadas, PHP habrá insertado de forma automática la sesión y ésta será pasada de una página a otra sin hacer nada más. Desde un punto de vista práctico la sesión es operativa, pero no vemos nada. Podemos obtener la sesión en cualquier momento mediante la función session_id(). <?php session_start(); echo 'La sesión actual es: '.session_id(); ?> En este caso session_start() comprueba en las cookies que existe una sesión y continua con ella, session_id() devuelve el identificador actual. Veamos otro ejemplo que, tal vez, te lo aclare un poco más: <?php session_register('contador'); echo '<a href="'.$PHP_SELF.'?'.$SID.'">Contador vale: '.++$contador.'</a>'; ?> Como dije anteriormente la sesión se crea si no existe o se recoge mediante session_start(), o también cuando se registra una variable de sesión mediante session_register(). Si no has utilizado nunca las sesiones, el concepto de variable de sesión, puede resultar un poco extraño. Básicamente es una variable, como cualquiera de las que gestiona PHP4, pero que reside en un espacio específico en el servidor, junto con el identificador de sesión, y que pertenece únicamente a un usuario. En nuestro ejemplo anterior, registramos la variable $contador en la primera línea del script. En la segunda línea, entre otras cosas, cada vez que recarguemos la 11 ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA 301127- Programación de sitios web Act 12: Lección Evaluativa 3 página o hagamos click sobre el enlace, el valor de $contador se incrementará en 1. En esta línea hacemos uso de la variable reservada $PHP_SELF, que hace referencia al propio script en ejecución y una constante propia de PHP4, $SID, que contiene el nombre de la sesión y el identificador de la misma. Podemos averiguar también el nombre de la sesión, o modificarlo, mediante la función session_name(). 12