3 métodos correctos de conexión a base de datos MySQL con php

Conexión a base de datos de 3 formas distintas, objeto PDO Mysqli y funciones mysql

conexión php PDO bases de datos

Cuando nos embarcamos en proyectos web que se componen de páginas dinámicas es inevitable acudir a la lectura y escritura de datos, almacenarlos y conseguir una persistencia, y esto generalmente se realiza en una base de datos.

La conexión a la base de datos desde PHP es sencilla a la par que mecánica, simplemente requiere entender las partes de la conexión y como utilizarlas. En las siguientes líneas voy a centrarme en la conexión a MySQL, siendo la conexión a otras base de datos similar incluso casi idéntica.

Formas de conectarse al SGBD.

Hay distintas formas de conectarse a la base de datos MySQL (últimamente MariaDB) y esto se debe en su mayoría el uso extendido de este SGBD (Sistema de gestión de base de datos).  Su versatilidad, facilidad de uso, el hecho de ser gratuita y tener un rendimiento bueno para bases de datos pequeñas y medianas la ha convertido en la número uno.

Un sistema gestor de base de datos (SGBD) es un conjunto de programas que permiten el almacenamiento, modificación y extracción de la información en una base de datos, además de proporcionar herramientas para añadir, borrar, modificar y analizar los datos. Los usuarios pueden acceder a la información usando herramientas específicas de interrogación y de generación de informes, o bien mediante aplicaciones al efecto.

Formas de conectarnos a la base de datos tenemos varias y voy a explicar dos: por objetos y por funciones.

Conexión a MySQL mediante el objeto PDO

Para esta primera conexión voy a explicar mi favorita, la conexión mediante el objeto PDO. El objeto PDO proporciona una capa de abstracción de acceso a datos, lo que significa que, independientemente de la base de datos que se esté utilizando, se emplean las mismas funciones para realizar consultas y obtener datos. En cristiano, para que nos entendamos, quiere decir que este mismo objeto te sirve para conectarte tanto a MySQL como PostgreSQL u otros SGBD

Para conectarnos a MySQL y usar una base de datos llamada Test con el usuario root y contraseña root haremos lo siguiente en PHP:

$objetoPDO = new PDO('mysql:host=localhost;dbname=Test', 'root', 'root');

Esta línea nos creara un objeto de clase PDO que manipulará la conexión a la base de datos. Hay que tener en cuenta que si los datos de la conexión son erróneos se producirá un error y nuestro código dejará de funcionar. Para evitar esto haremos uso de la captura de excepciones con try y catch:

try{
     $objetoPDO = new PDO('mysql:host=localhost;dbname=Test', 'root', 'root');
}catch (PDOException $e) {
      echo "¡Error!: " . $e->getMessage();
      die();
}

Ya tenemos nuestra preciada conexión a la base de datos, ahora de forma fácil podremos enviar las consultas SQL como si las escribiéramos directamente en nuestro cliente de la base de datos. Por ejemplo, para un SELECT de una tabla "usuario":

$query = "SELECT * FROM usuario;";
$sth = $objetoPDO->prepare($query);
$resultado = $sth->execute();

En $resultado tendremos el resultado de la consulta en la base de datos y en caso que no devuelva "false" podremos recuperar todas las filas/tuplas con:

if($resultado != false){
      $array_filas = $resultado->fetchAll();
}else{
      echo "La consulta ha producido un error, revisala";
}

Ahora tenemos el resultado de la consulta, es decir, las filas que ha devuelto el SELECT en $array_filas. Para recorrer los valores será como recorrer cualquier otro array, ya sea mediante un bucle foreach, o otro bucle. Para terminar, continuando con el ejemplo anterior de la tabla Usuario una solución para mostrar la información de las columnas nombre, apellidos, dni, id será:

foreach( $array_filas as $fila_usuario){
     echo 'Usuario con nombre y apellidos  ' . $fila_usuario['nombre'];
     echo ' ' . $fila_usuario['apellidos'] . ' DNI: ' . $fila_usuario['dni'];
     echo ' y id: ' . $fila_usuario['id'];
}

Conexión a base de datos mediante objeto Mysqli

A mi gusto la segunda opción, y también con objetos, en este caso de la clase Mysqli. Como esta clase está dirigida única y exclusivamente a conectarse a base de datos MySQL (o MariaDB) su uso es sencillo pero "limitado" con respecto a PDO, de ahí mi segunda opción.

Conectarse como en el caso anterior a una base de datos Test con usuario root y contraseña root sería:

$objeto_mysqli = new mysqli('localhost', 'root', 'root', 'test');

Una vez inicializada la conexión mediante la creación del objeto, si queremos realizar una consulta podremos hacerlo de la siguiente manera:

$query = "SELECT nombre, apellidos, dni, id FROM usuario";
$resultado = $objeto_mysqli->query($query);

$resultado en caso de éxito de la consulta será un objeto de la clase mysqli_result que tratará los datos del resultado de la consulta, en caso contrario, es decir, si se ha producido un error al ejecutar la consulta, el valor de $resultado será false. 

if($resultado != false){
     //hacemos lo que queramos con el resultado de la consulta si procede
}else{
    echo 'La consulta ha producido un error';
}

Una vez tratado el posible error podemos extraer la información de las filas que contiene el objeto $resultado. Hay unos cuantos métodos disponibles en la clase mysqli_result para la extracción de las filas. Primero deberemos recorrer las filas resultado, para esto nos podemos ayudar usando el atributo público num_rows.  pero yo voy a comentar los dos que más me gustan.

Ejemplo con fetch_assoc:

for($i=0;$i < $resultado->num_rows; $i++){
     $fila_usuario = $resultado->fetch_assoc();
     echo 'Usuario con nombre y apellidos  ' . $fila_usuario['nombre'];
     echo ' ' . $fila_usuario['apellidos'] . ' DNI: ' . $fila_usuario['dni'];
     echo ' y id: ' . $fila_usuario['id'];
}

Ejemplo con fetch_row:

for($i=0;$i < $resultado->num_rows; $i++){
     $fila_usuario = $resultado->fetch_row();
     echo 'Usuario con nombre y apellidos  ' . $fila_usuario[0]; // 0 => primera columna del select
     echo ' ' . $fila_usuario[1] . ' DNI: ' . $fila_usuario[2];
     echo ' y id: ' . $fila_usuario[3]; // 3 => último columna del select
}

Por último, en el caso de esta clase Mysqli hay que recordar cerrar siempre la conexión con la base de datos. Siempre que termine nuestro código de lectura o escritura sobre la base de datos tendremos que llamar al método close().

$objeto_mysqli->close();

Conexión a base de datos con funciones mysql

Usando funciones se puede realizar lo mismo que en los casos anteriores, el resultado final es parecido, pero mi predilección por el uso de objetos y sobretodo de la versatilidad de PDO hace que mi última opción sea esta.

Aplicando el mismo ejemplo anterior (base de datos local, usuario root, contraseña root y base de datos test) para conexión realizaremos:

$conexion = mysqli_connect('localhost', 'root', 'root');
mysqli_select_db('test', $conexion); //selecciona la base de datos

Una vez conectados vamos a realizar nuestra consulta sobre una tabla usuario con columnas nombre, apellidos, dni, id:

$query = "SELECT nombre, apellidos, dni, id FROM usuario";
$resultado = mysqli_query($query, $conexion);

En este caso el resultado de la query será un false si la consulta ha producido un error o un recurso que apunta a las filas resultado. Para poder leer esta información y además ver un posible error en la consulta:

if($resultado == false){
    echo 'ERROR! CODIGO: ' . mysqli_errno($conexion) . ' mensaje:'  . mysqli_error($conexion);
}else{
    $array_filas = mysql_fetch_assoc($resultado);
    foreach($array_filas as $fila_usuario){
     echo 'Usuario con nombre y apellidos  ' . $fila_usuario['nombre'];
     echo ' ' . $fila_usuario['apellidos'] . ' DNI: ' . $fila_usuario['dni'];
     echo ' y id: ' . $fila_usuario['id'];
   }
}

 ¿Y hemos terminado? Pues casi, no podemos olvidar cerrar la conexión a la base de datos:

mysqli_close($conexion);

Sobre el autor

Javier Gómez Redactor en Srcodigofuente.es

Javier Gómez

Ingeniero técnico en informática de gestión. Desarrollador web freelance y profesor de desarrollo web a partes iguales. Testarudo autodidacta, creativo, perfeccionista y alma libre.

Cargando comentarios

Utilizamos "cookies" para información estadística. Si continúas navegando aceptas su uso.