CLIENTES WEB Conexión entre PHP y MySQL USAR MYSQL EN PHP PHP tiene una librería de funciones nativas para conectarse a las base de datos MySQL. Por un lado reconoce la librería mysql y por otro mysqli. Se recomienda el uso de mysqli dado que las funciones que giran en torno a mysql serán eliminadas en próximas versiones de PHP como anuncian en su página oficial: Esta extensión está obsoleta a partir de PHP 5.5.0, y será eliminada en el futuro Cualquiera sea la librería que se implemente (nosotros usaremos mysqli), para iniciar una conexión MySQL es necesario indicarle a PHP 4 datos importantes: 1. Dónde se encuentra la base de datos: Es decir, en que servidor o IP. 2. Cuál es MI usuario de conexión al MySQL: Como todo sistema, tiene usuarios con más permisos que otros. El usuario principal –el administrador total- es el usuario root. 3. Cuál es la clave de conexión de este usuario. 4. De todas las bases de datos que puede tener ese sistema, cuál deseo utilizar para hacer las consultas. Por lo general, la conexión al MySQL será única, salvo que me encuentre trabajando con múltiples servidores a la vez (por ejemplo: haciendo una transferencia en tiempo real de un servidor a otro). Para conectarnos a algún servidor MySQL, debemos usar la función mysqli_connect y pasar como argumentos de la función los cuatro datos: servidor, usuario, clave, base a usar. Esta función nos devuelve un RECURSO, el cual deberemos usar luego para hacer cualquier transacción con la base de datos (para que sepa en qué conexión de todas las que puedo tener, estoy trabajando). Nuestros datos de conexión en nuestra máquina local son los siguientes: $servidor = 'localhost'; // localhost como cadena de texto. $usuario = 'root'; // vamos a usar el usuario principal del mysql $clave = ''; // el wamp instala un mysql con usuario root pero con clave vacía, así que es una cadena de texto vacía. $base = 'BLOG'; // asumimos que en el MySQL ya hemos creado una base llamada BLOG con sus respectivas tablas. $conexion = mysqli_connect( $servidor , $usuario , $clave ); Podemos tener distintas conexiones en simultáneo, en distintos servidores o con distintos usuarios. Lo importante es tener presente que cada una se guarda en una variable distinta y usaremos esa variable para hacer todas las transacciones que correspondan a esa combinación de servidor-usuario-clave. Prof. Germán Rodríguez – grodriguez@escueladavinci.net 1 CLIENTES WEB Conexión entre PHP y MySQL Desde este momento cualquier llamada a MySQL que se realice sobre $conexion se va a realizar en la base BLOG dentro de LOCALHOST como ROOT sin clave. PRIMERAS CONSULTAS Para empezar a hacer consultas en MySQL debemos separar nuestra mente en dos instancias distintas: La consulta y el resultado. La consulta en sí que vamos a escribir, para PHP no significa nada, es solo una variable de tipo 'texto' (o String). Para que PHP nos devuelva de la base de datos un registro de datos (los resultados) debemos usar una serie de funciones que se encargarán de mandar esa cadena de texto a PHP y devolver un objeto (de tipo Object) que será lo que la base de datos nos devuelva en base a dicho string. El flujo de trabajo de PHP con respecto a una solicitud de datos al MySQL es el siguiente: 1. Se escribe una cadena de texto (fija o con el uso de variables) que será lo que pediremos. 2. Se le pide a PHP que mande esa cadena de texto a MySQL y devuelva un Objeto que representa TODAS las filas encontradas, este objeto no tiene formato y no tenemos – todavía- manera de acceder a su contenido. 3. Se le pide a PHP que convierta CADA FILA de ese objeto en un array asociativo (del tipo $registro_actual['COLUMNA'] ) que devolverá como índice asociativo los nombres de todas las columnas que devolvió el MySQL. 4. Si hubiese más de un resultado (o registro) se le pide que recorra todos los contenidos hasta que no haya más datos. La ventaja de esta solicitud es que corta automáticamente cuando ya no quedan registros. Ejemplo: Consulta que devolverá DOS columnas (nombre y teléfono) de UN único registro: //Para PHP esto no es nada más que una cadena de texto. $consulta = "SELECT nombre, telefono FROM usuarios WHERE id = 3"; //La función mysqli_query manda una cadena de texto al MySQL y devuelve un objeto. $filas = mysqli_query( $conexion , $consulta ); echo $filas; // Object ID con un numero de objeto, tenemos que trabajarlo como Array. $columnas = mysqli_fetch_assoc( $filas ); //mysqli_fetch_assoc mueve el cursor a la próxima fila y devuelve las columnas pedidas a modo de array asociativo $columnas['COLUMNA_PEDIDA'] ; echo $columnas ; //muestra Array echo $columnas['nombre'] ; // muestra el nombre del usuario con ID 3 echo $columnas['telefono'] ; // muestra el teléfono del usuario con ID 3 Prof. Germán Rodríguez – grodriguez@escueladavinci.net 2 CLIENTES WEB Conexión entre PHP y MySQL MYSQLI FETCH ASSOC La función mysqli_fetch_assoc recibe como único argumento un objeto que sea el resultado de un mysqli_query, y si ese objeto se pudo procesar, devolverá un array asociativo cuyos índices serán las columnas que haya solicitado el mysqli_query. Además, una vez que haya procesado los datos, moverá el cursor hacia abajo en el juego de registros (es decir a la próxima fila del query). Llegado el caso que se acaben las filas, devolverá un valor booleano false (y no un array). Por lo cual si pedimos DOS usuarios, podemos usar el mysqli_fetch_assoc para pedir los datos del primer usuario y volver a usarlo para pedir los datos del segundo usuario. $query = "SELECT nombre FROM usuarios WHERE ID=3 or ID=4"; //Pido el 3 y 4 $filas = mysqli_query($conexion, $query ); //Traigo el objeto $columnas = mysqli_fetch_assoc( $filas ); //Mueve el cursor a la fila 1 y trae las columnas como Array Asociativo var_dump( $columnas ); //Muestra en pantalla Array y el índice ‘nombre’ de ese usuario echo $columnas['nombre']; //Muestra el nombre del usuario 1 $columnas = mysqli_fetch_assoc( $filas ); //Mueve el cursor a la fila 2 y trae las columnas como Array Asociativo var_dump( $columnas ); //Muestra en pantalla Array y el índice nombre de ese usuario echo $columnas['nombre']; //Muestra el nombre del usuario 2 $columnas = mysqli_fetch_assoc( $filas ); //Mueve el cursor a la fila 3 que no existe, porque solo pedimos 2 datos var_dump( $columnas ); //Muestra en pantalla false Claro está que este esquema es un tanto engorroso si se desean mostrar los últimos 100 productos de un catálogo online. Entonces si pudiésemos hacer más óptima esta consulta, podríamos mostrar TODOS los resultados sin importar si son 1, 100 o 5000. Eso lo podemos hacer aprovechando ese último valor que vimos en pantalla (el false). Prof. Germán Rodríguez – grodriguez@escueladavinci.net 3 CLIENTES WEB Conexión entre PHP y MySQL MOSTRAR MÚLTIPLES RESULTADOS Para mostrar un juego de resultados, independientemente de su cantidad de registros, debemos usar una combinación de las técnicas aprendidas. 1. En primera instancia le vamos a pedir al mysqli_fetch_assoc que nos devuelva una de dos opciones: o Array –si hay registros- o false –cuando se acabe el juego de datos-. 2. En segunda instancia, esa petición la vamos a utilizar como condición de un ciclo de repetición abierto, es decir que termine sólo cuando se acaben los datos. En este caso vamos a usar un while. Nuestra condición se limita a: mientras las filas digan que hay datos (que no sea false), repetir. $consulta = "SELECT nombre FROM usuarios"; //Como no pongo un filtro where, trae todos… los que sean $filas = mysqli_query( $consulta , $conexion ) ; while( $columnas = mysqli_fetch_assoc( $filas ) ){ echo $columnas['nombre'] .' <br />' ; //Muestro cada nombre y un salto de línea. } Analizando el código podemos darnos cuenta por qué esta estructura funciona perfectamente. 1. Tenemos la función mysqli_fetch_assoc como condición del while, y la guardamos en la variable $columnas. 2. Como las asignaciones se resuelven antes que la condición del while (por precedencia de operadores), PRIMERO se intenta convertir el objeto $filas en array. 3. Si puede convertirlo, devuelve un tipo de dato Array. 4. Para las evaluaciones booleanas, un array tiene contenido, así que se comporta como true. Se ejecuta el while. 5. Vuelve a intentar convertirse el objeto $filas en array. 6. En tanto y en cuanto devuelva un tipo de dato array, queda claro que seguirá moviéndose por todo el juego de filas. 7. Cuando ya no pueda convertir a array, va a devolver false. 8. Cuando un while encuentra un valor de tipo false, corta toda la repetición. Por ende, este ciclo de repetición va a funcionar con uno, mucho o ningún resultado (si MySQL no devuelve datos, el objeto no se puede convertir; en la primera vuelta da false, termina el ciclo sin hacer ninguna vuelta). Prof. Germán Rodríguez – grodriguez@escueladavinci.net 4 CLIENTES WEB Conexión entre PHP y MySQL OTRAS FUNCIONES IMPORTANTES Algunas funciones que van a ser útiles para la interacción con MySQL son: mysqli_error(); - si hubo un error en el formato de la consulta, indicará claramente el error (ejemplo: UNKNOWN COLUMN nombres - no existe la columna nombres) mysqli_num_rows( $filas ); - devuelve un valor numérico que representa la cantidad de filas que devolvió la consulta mysql, recibe como argumento el OBJETO que devolvió el query. mysqli_fetch_row( $filas ); - hace lo mismo que mysqli_fetch_assoc, pero no devuelve un array asociativo, sino uno numérico del tipo $columnas[0] etc. Recibe como argumento las filas. mysqli_insert_id( $conexion ); - Después de hacer una consulta de tipo INSERT INTO devuelve el ID que generó el MySQL para ese registro. Esta función es muy útil cuando se inserta un registro en una tabla y ese valor ingresado se tiene que asociar con otra tabla más (por ejemplo en una relación N-N). Recibe como argumento la conexión. mysqli_free_result( $filas ); - borra de la memoria los registros que devolvió una consulta MySQL anterior. mysqli_close( $conexion ); - cierra la conexión al MySQL para no seguir consumiendo recursos. Prof. Germán Rodríguez – grodriguez@escueladavinci.net 5