Está en la página 1de 14

PDO vs MySQLi – Conexión a MySQL con PHP

4
Shares
211

Aprovechando la preparación de varias publicaciones sobre el desarrollo de un proyecto PHP CRUD vamos a ver unos ejemplos sencillos sobre como
conectarnos a una base de datos o como hacer una consulta entre otras cosas. Hoy explicaremos como conectarnos a MySQL y que
clases PHP podemos utilizar para establecer esta conexión.

PHP es un lenguaje de programación del lado del servidor que nos permite interactuar con el código HTML para mostrar los datos en el lado cliente, fue
uno de los primeros lenguajes en hacerlo. En esta introducción a su uso con bases de datos veremos los siguientes puntos:

Conexión a MySQL con PHP

1. INTRODUCCIÓN Y NECESIDADES
2. CONEXIÓN CON PDO::__construct()
3. CONEXIÓN CON mysqli_connect()
4. CONSULTA BÁSICA MySQL
5. DOCUMENTACIÓN

Software utilizado

 Apache: el proyecto Apache HTTP Server es un esfuerzo por desarrollar y mantener un servidor HTTP de código abierto para sistemas operativos
modernos, incluyendo UNIX y Windows.
 MySQL: base de datos que utilizamos para ver las conexiones.
 PHP: lenguaje de programación del lado del servidor que vamos a ver.
 Netbeans: IDE multilenguaje que integra entre otros PHP
 Atom: editor de texto con múltiples plugins y soporte para muchos lenguajes como PHP.
 Ubuntu: en mi caso uso Linux en particular Ubuntu para los desarrollos.

1. INTRODUCCIÓN Y NECESIDADES
Antes de empezar necesitaremos tener instalado un servidor web con la conexión a MySQL y las extensiones de PHP, puedes utilizar una instalación
automática de este software, por ejemplo con: XAMPP o EasyPHP, o si quieres hacer una instalación paso a paso de cada una de las
partes consulta mi tutorial: Instalación LAMP (Linux + Apache + MySQL + PHP) en Ubuntu 15.10.

Instalación LAMP en Ubuntu 15.10


Así el software básico que utilizamos en nuestro ejemplos es:

 Instalamos Apache: servidor web HTTP que interpretará nuestro código HTML y donde integramos PHP
 Instalamos MySQL: necesitamos una base de datos para las pruebas
 Instalamos PHP: necesitamos instalar PHP para que nuestro servidor web sea capaz de interpretar el código.

2. CONEXIÓN CON PDO


Crea una instancia de PDO que representa una conexión a una base de datos y que devolverá en caso de éxito un objetoPDO que nos permitirá
el acceso a los métodos para crear y ejecutarla las consultas a la base de datos, este es el constructor que utilizamos para la conexión:

1 public PDO::__construct ( string $dsn


2 [, string $username [, string $<span id="IL_AD9" class="IL_AD">password</span> [, array $options ]]] )
En la
documentación de la clase PDO que representa una conexión entre PHP y un servidor de bases de datos nos explican los métodos principales que nos
proporciona esta clase para la conexión y consulta a una base de datos.

Vamos a ver los parámetros básicos del constructor que vamos a utilizar:

 DSN (Data Source Name): nombre del origen de los datos contiene la información requerida para conectarse a labase de datos. Un DSN consiste
en el nombre del controlador de PDO, seguido por dos puntos, seguido por la sintaxis específica del controlador de PDO para la conexión. Así
para MySQL lo formaremos por:
 El nombre del PDO: mysql seguido por :
 El host: el host ya sea el nombre correspondiente o la IP directamente, para este sencillo ejemplo, utilizo unabase de datos en local con lo que el
host se definiría así: host=127.0.0.1
 La base de datos: el nombre de la base de datos a la que nos queremos conectar en mi caso: dbname=customerdb, introducimos como separado un
; antes de dbname
 El DSN del ejemplo que vamos a ver será el siguiente: mysql:host=127.0.0.1;dbname=customerdb($dsn=$dbsystem.’:host=’.$host.’;dbname=’.
$dbname;)
 username: nombre del usuario para la conexión a la base de datos especificada en el DSN.
 password contraseña asociada la usuario que definimos para la conexión
 options: array de la forma clave=>valor con opciones de conexión específicas del controlador.
El parámetro DSN admite tres métodos diferentes de especificar los parámetros requeridos para crear la conexión a labase de datos: invocación del
controlador con el DSN completo, invocación del URI DSN y mediante un alias.

Lo bueno que tiene el uso de la clase PDO es que variando el DSN en función de la base de datos nos permitiría hacer un cambio de unas base de
datos a otra de forma muy sencilla.

Así, con esta información creamos la página PHP: ejemploConexionMySQL.php donde introducimos el código PHP para la conexión que quedaría de la
siguiente manera:

?
1
2 <?php
3 $dbsystem='mysql';
4 $host='127.0.0.1';
5 $dbname='customerdb';
$dsn=$dbsystem.':host='.$host.';dbname='.$dbname;
6 $username='xulescode';
7 $passwd='xulescode';
8 $connection = null;
9 try {
10 echo 'Conexión a la base de datos: '.$dsn.'<br /><br />';
$connection = new PDO($dsn, $username, $passwd);
11 echo '<h4>Conexión con éxito</h4> <br />';
12 } catch (PDOException $pdoExcetion) {
13 $connection = null;
14 echo 'Error al establecer la conexión: '.$pdoExcetion;
}
15
?>
16
17

Para presentar el código directamente en una página web mostrando el resultado le añadimos un código HTML sencillo para mostrar los datos, y
hacemos pruebas, comprobando el funcionamiento tanto si tiene éxito como si no:

?
1 <!DOCTYPE html>
<html>
2
<head>
3 <meta charset="UTF-8">
4 <title>Ejemplo de conexión a la base de datos MySQL</title>
5 </head>
6
7
8 <body>
9 <h2>Ejemplo de conexión a la base de datos MySQL</h2>
10 <?php
$dbsystem='mysql';
11
$host='127.0.0.1';
12 $dbname='customerdb';
13 $dsn=$dbsystem.':host='.$host.';dbname='.$dbname;
14 $username='xulescode';
15 $passwd='xulescode';
$connection = null;
16 try {
17 echo 'Conexión a la base de datos: '.$dsn.'<br /><br />';
18 $connection = new PDO($dsn, $username, $passwd);
19 echo '<h4>Conexión con éxito</h4> <br />';
20 } catch (PDOException $pdoExcetion) {
$connection = null;
21 echo 'Error al establecer la conexión: '.$pdoExcetion;
22 }
23 ?>
24 </body>
</html>
25
26
27

Si la conexión tiene éxito la web se mostrará así:

PHP Database – Conexión PDO con éxito


Para comprobar el lanzamiento de la excepción simplemente introduce cualquier error en el DSN para que se muestre en la web el mensaje, en mi caso
voy a cambiar el nombre de la base de datos por: customerdb5, que no existe en mi servidor MySQL, el error con la traza de la excepción:

PHP Database – Error en la conexión PDO

3. CONEXIÓN CON mysqli_connect()


Esta conexión abre una conexión al Servidor de MySQL que está en ejecución, como puedes ver esta clase es específica para MySQL a diferencia de
la conexión PDO que nos servía para múltiples bases de datos.

Para establecer una conexión con mysqli_connect() solo necesitamos hacer una llamada al constructor o al procedimiento con los parámetros de host,
usuario, password y nombre de la base de datos, como es específico deMySQL la especificación del DSN se hace internamente:

1 mysqli::__construct ([ string $host = ini_get("mysqli.default_host")


Estilo [, string $username = ini_get("mysqli.default_user") [, string $passwd = ini_get("mysqli.default_pw") orientado a
2 [, string $dbname = "" [, int $port = ini_get("mysqli.default_port") [, string $socket =
objetos
3 ini_get("mysqli.default_socket") ]]]]]] )

Estilo por procedimientos


1 mysqli mysqli_connect ([ string $host = ini_get("mysqli.default_host")
[, string $username = ini_get("mysqli.default_user") [, string $passwd = ini_get("mysqli.default_pw")
2 [, string $dbname = "" [, int $port = ini_get("mysqli.default_port") [, string $socket =
3 ini_get("mysqli.default_socket") ]]]]]] )

En este caso, a diferencia del ejemplo anterior que utilizamos un constructor vamos a establecer una conexión utilizando el procedimiento, este sería el
código PHP:

?
1
2 <?php
$dbsystem='mysql';
3 $host='127.0.0.1';
4 $dbname='customerdb7';
5 $username='xulescode';
6 $passwd='xulescode';
7 echo 'Conexión a la base de datos: '.$dsn.'<br /><br />';
$connection = mysqli_connect($host, $username, $passwd, $dbname);
8 if ($connection){
9 echo '<h4>Conexión con éxito: '.mysqli_get_host_info($connection).'</h4> <br />';
10 }else{
11 echo 'Error al establecer la conexión ('.mysqli_connect_errno().'): '.mysqli_connect_error().' <br
/>';
12 exit();
13 }
14 ?>
15

Como puedes ver los parámetros que hemos utilizado son:

 El host: el host ya sea el nombre correspondiente o la IP directamente, para este sencillo ejemplo, utilizo una base de datos en local con lo que el
host se definiría así: host=127.0.0.1 .
 La base de datos: el nombre de la base de datos a la que nos queremos conectar en mi caso: dbname=customerdb.
 username: nombre del usuario para la conexión.
 password contraseña asociada al usuario que definimos para la conexión.

Ahora incluimos nuestro código PHP dentro de una estructura sencilla HTML para mostrar los resultados en nuestro servidor:

?
1 <html>
<head>
2
<meta charset="UTF-8">
3
4
5
6 <title>Ejemplo de conexión a la base de datos MySQL</title>
</head>
7 <body>
8
9 <h2>Ejemplo de conexión a la base de datos MySQL</h2>
10
11 <?php
12 $dbsystem='mysql';
$host='127.0.0.1';
13 $dbname='customerdb';
14 $username='xulescode';
15 $passwd='xulescode';
16 echo 'Conexión a la base de datos: '.$dsn.'<br /><br />';
17 $connection = mysqli_connect($host, $username, $passwd, $dbname);
if ($connection){
18 echo '<h4>Conexión con éxito: '.mysqli_get_host_info($connection).'</h4> <br />';
19 }else{
20 echo 'Error al establecer la conexión ('.mysqli_connect_errno().'): '.mysqli_connect_error().' <br />';
21 exit();
}
22 ?>
23 </body>
24 </html>
25
26

Ahora ejecutamos nuestro código para comprobar la conexión:

PHP Database – Conexión mysqli_connect con éxito


Modificamos el nombre de la base de datos, por ejemplo ponemos customerdbotra, para forzar la muestra del mensaje de error:

PHP Database – Error en la conexión mysqli_connect

mysql_connect — Antes se utilizaba para abrir una conexión al servidor MySQL


Advertencia – Antes se utilizaba la clase mysql_connect esta extensión fue declarada obsoleta en PHP 5.5.0 y eliminada en PHP
7.0.0. en su lugar debemos utilizar las extensiones MySQLiPDO_MySQL.

4. CONSULTA BÁSICA CON PHP A MySQL


Una vez que ya hemos creado nuestra conexión vamos a hacer una pequeña consulta para ello utilizamos una tabla básica del proyecto Learning
Project que próximamente publicaremos un tutorial de su desarrollo con PHP CRUD, el desarrollo sobre MySQL (MariaDB) lo puedes consultar
aquí: Creando la primera tabla cb_language , de todas formas lo que necesitas es este código para crear la tabla en la base de datos.
Creación de la tabla:

?
1 CREATE TABLE cb_language
2 (
idlanguage VARCHAR(6) NOT NULL COMMENT 'Como clave primaria usamos la codificación del idioma i18n e i10n, las principales: es_ES y en_EN, que serán las que s
3 defecto.',
4 namelanguage VARCHAR(60) NOT NULL COMMENT 'Nombre del idioma en el idioma por defecto del sistema (castellano).',
5
6
7
8
9 isactive VARCHAR(1) NOT NULL DEFAULT 'N',
languageiso VARCHAR(2),
1 countrycode VARCHAR(2),
0 isbaselanguage VARCHAR(1) NOT NULL DEFAULT 'N',
1 issystemlanguage VARCHAR(1) NOT NULL DEFAULT 'N',
1 CONSTRAINT pk_cb_language PRIMARY KEY (idlanguage),
1 CONSTRAINT u_cb_language_namelanguage UNIQUE (namelanguage)
)
2 ENGINE = InnoDB
1 COMMENT='Como clave primaria usamos la codificación del idioma i18n e i10n, las principales: es_ES y en_EN, que serán las que se usarán por defecto.';
3 GRANT ALL ON TABLE cb_language TO xulescode;
1
4
1
5

Población de datos sencilla:

?
1
2 INSERT INTO cb_language( idlanguage, isactive, namelanguage, languageiso, countrycode, isbaselanguage, issystemlanguage )
3 VALUES ('es_ES', 'Y', 'Spanish (Spain)', 'es', 'ES', 'N', 'N' );
4 INSERT INTO cb_language( idlanguage, isactive, namelanguage, languageiso, countrycode, isbaselanguage, issystemlanguage )
5 VALUES ('da_DK', 'Y', 'Danish (Denmark)', 'da', 'DK', 'N', 'N' );
INSERT INTO cb_language( idlanguage, isactive, namelanguage, languageiso, countrycode, isbaselanguage, issystemlanguage )
6 VALUES ('de_AT', 'Y', 'German (Austria)', 'de', 'AT', 'N', 'N' );
7 INSERT INTO cb_language( idlanguage, isactive, namelanguage, languageiso, countrycode, isbaselanguage, issystemlanguage )
8 VALUES ('de_DE', 'Y', 'German (Germany)', 'de', 'DE', 'N', 'N' );
9 INSERT INTO cb_language( idlanguage, isactive, namelanguage, languageiso, countrycode, isbaselanguage, issystemlanguage )
10 VALUES ('en_GB', 'Y', 'English (United Kingdom)', 'en', 'GB', 'N', 'N' );
INSERT INTO cb_language( idlanguage, isactive, namelanguage, languageiso, countrycode, isbaselanguage, issystemlanguage )
11 VALUES ('en_IE', 'Y', 'English (Ireland)', 'en', 'IE', 'N', 'N' );
12 INSERT INTO cb_language( idlanguage, isactive, namelanguage, languageiso, countrycode, isbaselanguage, issystemlanguage )
13 VALUES ('es_AR', 'Y', 'Spanish (Argentina)', 'es', 'AR', 'N', 'N' );
14 INSERT INTO cb_language( idlanguage, isactive, namelanguage, languageiso, countrycode, isbaselanguage, issystemlanguage )
15 VALUES ('es_UY', 'Y', 'Spanish (Uruguay)', 'es', 'UY', 'N', 'N' );
16

Ahora mostremos los resultados con PHP.


Consulta usando PDO

Con PDO vamos a crear la consulta utilizando en primer lugar el método prepare para preparar un sentencia para su ejecución:

?
1 public PDOStatement PDO::prepare ( string $statement [, array $driver_options = array() ] )

Como puedes ver este nos devuelve un objeto del tipo PDOStatement que ya podemos ejecutar para después acceder a sus resultados usando el
método execute que devuelve true si todo fue bien:

?
1 public bool PDOStatement::execute ([ array $input_parameters ] )

Finalmente, creamos el código donde usamos el método para fetchAll(\PDO::FETCH_OBJ) para recorrer las filas con los registros con un bucle:

?
1
2 try{
3 $query="SELECT * FROM cb_language;";
$statement = $connection->prepare($query);
4 $result = $statement->execute();
5 $rows = $statement->fetchAll(\PDO::FETCH_OBJ);
6 echo '<br />LANGUAGE | NAME | IS ACTIVE? | LANGUAGE ISO | COUNTRY CODE | IS BASE? | IS SYSTEM LANGUAGE?';
7 foreach ($rows as $row) {
8 echo '<br />'.$row->idlanguage.' | '.$row->namelanguage.' | '.$row->isactive
.' | '.$row->languageiso.' | '.$row->countrycode.' | '.$row->isbaselanguage.' | '.$row->issystemlanguage;
9 }
10 } catch (PDOException $pdoExcetion) {
11 echo 'Error hacer la consulta: '.$pdoExcetion->getMessage();
12 }
13

Incluimos el código a continuación de la conexión a la base de datos del apartado anterior el resultado sería:
PHP Database – PDO Resultado de la consulta

¿Qué pasa si tenemos mal la consulta? Tal y como tenemos el código no detectaríamos el error en la excepción ya que no le hemos indicado al PDO que
los tiene que mostrar para conseguirlo simplemente incluimos esta línea después de hacer la conexión:

1 $connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Si por ejemplo ponemos el nombre de una tabla de la base de datos que no existe, en mi caso he puesto:cb_language_error, este sería el resultado:
PHP Database – PDO error en la consulta

Consulta usando mysqli_connect()

Con mysqli_connect() utilizaremos simplemente dos métodos, uno para hacer la consulta mysqli_query($connection, $query) y otro para obtener las
filas y mostrar los resultados mysqli_fetch_assoc($result):

 mysqli_query($connection, $query): mysqli::query — mysqli_query — Realiza una consulta a la base de datos para consultas que distintas de
INSERT, UPDATE o DELETE.
 mysqli_fetch_assoc($result): mysqli_result::fetch_assoc — mysqli_fetch_assoc — obtenemos una fila de resultado como un array asociativo o null si
no hubiese resultado.

Así, el código que tenemos que añadir es el siguiente:

?
1 $query="SELECT * FROM cb_language;";
2 $result = mysqli_query($connection, $query);
3 echo '<br />LANGUAGE | NAME | IS ACTIVE? | LANGUAGE ISO | COUNTRY CODE | IS BASE? | IS SYSTEM LANGUAGE?';
4 while($row = mysqli_fetch_assoc($result)):
5 echo '<br />'.$row['idlanguage'].' | '.$row['namelanguage'].' | '.$row['isactive']
.' | '.$row['languageiso'].' | '.$row['countrycode'].' | '.$row['isbaselanguage'].' | '.$row['issystemlanguage'];
6 endwhile;
7
Como puedes ver el resultado es el mismo que en el caso anterior en caso de éxito, aquí solo buscamos enseñar como se hace la consulta con PHP la
base de datos, por eso hacemos esta presentación tan sencilla.

Para detectar los errores SQL y mostrar la traza del error, modificamos un poco el código, ya que ahora simplemente no se mostrarían los datos:

?
1
2 $query="SELECT * FROM cb_language;";
$result = mysqli_query($connection, $query);
3 if ($result){
4 echo '<br />LANGUAGE | NAME | IS ACTIVE? | LANGUAGE ISO | COUNTRY CODE | IS BASE? | IS SYSTEM LANGUAGE?';
5 while($row = mysqli_fetch_assoc($result)){
6 echo '<br />'.$row['idlanguage'].' | '.$row['namelanguage'].' | '.$row['isactive']
7 .' | '.$row['languageiso'].' | '.$row['countrycode'].' | '.$row['isbaselanguage'].' | '.$row['issystemlanguage'];
}
8 }else{
9 echo 'Error al hacer la consulta ('.mysqli_sqlstate($connection).'):'.mysqli_error($connection);
10 }
11

Este sería el resultado si introducimos por ejemplo el nombre de una base de datos que no existe:

PHP Database – mysqli_connect Error al hacer la consulta

También podría gustarte