Você está na página 1de 11

Como Conectar Php y Mysql a

travs de PDO y MySQLi?


James Revelo julio 19, 2014 Datos, Web Services 3 Comments
En este artculo veremos como integrar Php y Mysql para aumentar la
funcionalidad de nuestrosdesarrollos web. Primero veremos como abrir la
conexin en el servidor Mysql. Luegoejecutaremos comandos en nuestra
base de datos a travs de nuestra aplicacin y finalmente aprenderemos a
llamar procedimientos almacenados.
Actualmente Php ha
declarado
obsoleta
su API clsica
de
conexin MySQL para proyectos que usen versiones de Php superiores a
la 5.5.0. No obstante existen otras dos APIs de integracin,
llamadas MySQLi y PDO_MySQL. En este artculo cubriremos la accin de
estas tres APIs para que veas las caractersticas de codificacin en cada una.

CADENAS DE CONEXIN ENTRE PHP Y MYSQL


Haremos exactamente lo mismo que con la conexin Mysql-Java y Sql
Server-C#. Usaremos las cadenas que indiquen el servidor, el nombre de
la base de datos y el usuario que vamos a emplear para abrir la conexin.
Como medida de seguridad puedes crear un archivo .php que guarde estos
datos en variables locales de forma externa.

<?php //Datos de conexin a la base de datos


$hostname = 'localhost';
$database = 'datos';
$username = 'usuario';
$password = 'contrasea';
?>

Luego incluiremos este archivo con la sentencia require_once en el archivo donde


abriremos la conexin. Para abrir la conexin emplearemos los siguientes fragmentos
de cdigo:

//MySQL clsico
require_once 'mysql-login.php';
//Conectando
$con = mysql_connect($hostname, $username, $password);
//Manejo de errores
if (!$con)
die("Fall la conexin a MySQL: " . mysql_error());
else
echo "Conexin exitosa!";
//Seleccionar base de datos
mysql_select_db($database)
or die("Seleccion de base de datos fallida " . mysql_error());
mysql_close();

//MySQL PDO
require_once 'mysql-login.php';
try {
$con =
new PDO('mysql:host='.$hostname.';dbname='.
$database, $username, $password);
print "Conexin exitosa!";
}
catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "
";
die();
}
$con =null;

//MySQLi
require_once 'mysql-login.php';
$mysqli =
new mysqli($hostname, $username,
$password, $database);
if ($mysqli -> connect_errno) {
die( "Fallo
la
conexin
a
MySQL:
(" . $mysqli > mysqli_connect_errno()
. ") " . $mysqli -> mysqli_connect_error());
}
else
echo "Conexin exitosa!";
$mysqli -> mysqli_close();

En la siguiente tabla veremos las caractersticas para realizar la


conexin en las tres apis:
MySQL clsica

MySQLi

PDO

mysql_connect():
Funcin para abrir
la conexin

new mysqli: Crear


nuevo objeto de
conexin con las
cadenas de
conexin.

new PDO: Crear un nuevo


objeto de conexin con las
cadenas de conexin. La
cadena mysql: al inicio es
un estndar de conexin,
as que incluyela siempre.

mysql_select_db():
Selecciona la base
de datos

La base de datos es
seleccionada en el
constructor PDO

La base de datos es
seleccionada en el
constructor PDO

Usar retorno
booleano de
mysql_connect()

Usa el atributo
connect_errno para
comprobar la
existencia de errores

Usaremos try-catch para


manejar las excepciones de
tipo PDOException

mysql_close():
Funcin que cierra
la conexin

mysqli_close():
Mtodo de la
clasemysqli para
cerrar la conexin.

Para cerrar la conexin


asignas NULL al objeto de
conexin creado.

EJECUTAR COMANDOS MYSQL DESDE PHP


Ya sabes que los comandos insert, update, delete solo modifican la
base de datos, a diferencia de select que retorna resultados
estructurados en forma de tabla. Debido a esta situacin, es
importante elegir correctamente la forma en tratar ambas opciones.
En el siguiente ejemplo estudiaremos como ejecutar los comandos
que no retornan filas. Como ejemplo actualizaremos el nombre de
un Profesor cuyo cdigo es 2 en la base de datos de
unaUniversidad.

//MySQL clsico
$resultado = mysql_query("UPDATE
PROFESOR
='Brenda' WHERE ID=2");
if(!$resultado)
die("Fallo el comando:".mysql_error());
else
echo mysql_affected_rows()."Filas afectadas";

SET

NOMBRE

//PDO
$count = $con->exec("UPDATE PROFESOR SET NOMBRE ='Brenda'
WHERE ID=2");
print($count." Filas afectadas");

//MySQLi
if ($mysqli->query("UPDATE PROFESOR SET NOMBRE
WHERE ID=2") === TRUE) {
printf($mysqli->affected_rows." Filas afectadas");
}
else
echo "Error al ejecutar el comando:".$mysqli->error;

='Brenda'

La siguiente tabla muestra las caractersticas de ejecucin en cada


API:
MySQL clsica

MySQLi

PDO

mysql_query(): Funcin
que ejecuta un comando
en la base de datos.

query(): Mtodo de la
clasemysqli para
ejecutar un comando.

exec(): Mtodo de
la clase PDOpara
ejecutar un
comando que solo

afecta la base de
datos.

mysql_affected_rows():
Retorna en la cantidad de
filas afectadas

affected_rows: Atributo
de la clase mysqli que
guarda la cantidad de
filas afectadas.

El retorno de exec()
es la cantidad de
filas afectadas por
la sentencia.

CONSULTAR BASE DE DATOS MYSQL DESDE PHP


Para este caso el API MySQL clsico y MySQLi usan el mismo
mtodo anterior para tratarconsultas. Por su parte, PDO emplea el
mtodo query() para obtener las filas. A continuacin veremos como
consultar la tabla AVIONES del sistema de una Aerolnea.

//MySQL clsico
$query = "SELECT * FROM AVIONES";
$resultado = mysql_query($query);
if(!$resultado)
die("Fallo el comando:".mysql_error());
else{
print("<table>");
while($rows = mysql_fetch_array($resultado,MYSQL_ASSOC)){
print("<tr>");
print("<td>".$rows["ID"]."</td>");
print("<td>".$rows["CAPACIDAD"]."</td>");
print("<td>".$rows["DESCRIPCION"]."</td>");
print("</tr>");
}
print("</table>");
}
mysql_free_result($resultado);

//PDO
$query = "SELECT * FROM AVIONES";
print("<table>");
$resultado = $con->query($query);
foreach ( $resultado as $rows) {
print("<tr>");
print("<td>".$rows["ID"]."</td>");
print("<td>".$rows["CAPACIDAD"]."</td>");
print("<td>".$rows["DESCRIPCION"]."</td>");
print("</tr>");
}
print("</table>");
$resultado =null;

//MySQLi
$query = "SELECT * FROM AVIONES";
$resultado=$mysqli->query($query);
print("<table>");
while ($rows = $resultado->fetch_assoc()) {
print("<tr>");
print("<td>".$rows["ID"]."</td>");
print("<td>".$rows["CAPACIDAD"]."</td>");
print("<td>".$rows["DESCRIPCION"]."</td>");
print("</tr>");
}
print("</table>");
$resultado->free();

Observa el resumen te las caractersticas para ejecutar consultas con


las extensiones:
MySQL clsica

MySQLi

PDO

mysql_fetch_array():
Funcin que obtiene
una fila de la consulta.
El parmetro indica que
tipo de array ser
retornado.

fetch_assoc():
Mtodo de la
clase
mysqli_result que
obtiene una fila
de la consulta en

query(): Mtodo de la
clase PDO que retorna en
un objeto PDOStatement
que contiene los
resultados de una
consulta. Recorreremos

MYSQL_NUM: Array de
retorno con ndices
numricos.
MYSQL_ASSOC: Array
de retorno con ndices
asociativos.
MYSQL_BOTH: Array de
retorno con ambos
tipos de ndices.
mysql_free_result():
Libera la memoria hacia
los resultados de la
consulta

forma de array
asociativo.

cada elemento del objeto


con un bucle
foreach.fetch(): Mtodo
de la clase PDO para
obtener una fila de una
consulta.

free(): Libera la
memoria asociada

Asigna NULL a la variable


que recibi la referencia
del resultado para liberar
la memoria.

SENTENCIAS PREPARADAS EN PHP


Si recuerdas en los artculos anteriores sobre conexiones era
comn usar el carcter ? para indicar que un valor iba a ser variable
dentro de una sentencia preparada, es decir, que tomara distintos
valores segn los datos que nosotros le asociramos para ejecutar
mltiples veces la sentencia pero con diferentes valores.
Pues bien, las APIs de MySQL para Php utilizan este mismo formato
para preparar un comando.
Supn
que
has
creado
un formulario que
recibe
el nombre, apellido, edad y el correo electrnicode un usuario.
Ahora deseas que cuando el usuario de clic en el botn de
confirmacin estos campos sean guardados en tu tabla USUARIO.
Veamos como solucionarlo en los tres complementos.

//MySQL clsico
$query = 'PREPARE
sentencia
FROM
"INSERT
INTO
usuario
VALUES(NULL,?,?,?,?)"';
$resultado = mysql_query($query);
if(!$resultado)
die("Fallo el comando:".mysql_error());
else{
print("PREPARE exitoso!</br>");
$query ='SET @nombre = "'.$nombre.'"'.',@apellido ="'.$apellido.'"'
.',@edad ='.$edad.',@email='.$email;
if(!mysql_query($query))
die("Error en SET: ".mysql_error());
$query = 'EXECUTE sentencia USING @nombre,@apellido,@edad';
if(!mysql_query($query))
die("Error en EXECUTE:".mysql_error());
$query = 'DEALLOCATE PREPARE sentencia';
if(!mysql_query($query))
die("Error en DEALLOCATE:".mysql_error());
}

//MySQLi
if ($stmt = $mysqli->prepare("INSERT
INTO
usuario
VALUES(NULL,?,?,?,?)") ){
/* ligar parmetros para marcadores */
$stmt->bind_param("ssds", $nombre,$apellido,$edad,$email);
/* ejecutar la consulta */
$stmt->execute();
/* cerrar sentencia */
$stmt->close();
}
else{
echo "Error al ejecutar la sentencia preparada".$mysqli->error;
}

//PDO
$cmd = $con->prepare('INSERT INTO usuario VALUES(NULL,?,?,?,?)');
$cmd->execute(array($nombre,$apellido,$edad,$email));

A continuacin se observan las caractersticas para crear una


sentencia preparada en las apis de conexin:

MySQLi

PDO

prepare(): Mtodo de la clase


mysqli_stmt para preparar una sentencia
genrica.Los parmetros se representan

prepare(): Mtodo de la

con el carcter ? o con una etiqueta

clase PDOpara crear una sentencia

:label.

preparada.

bind_param(): Liga los parmetros de la

bindParam(): Liga los parmetros de

sentencia preparada mediante alguno de

una sentencia preparada.Parmetro

los siguientes indicadores de tipo:i: Tipo

1: ndice del parmetro

entero

Parmetro 2: La variable relacionada

d: Tipo float

al parmetro

s: Tipo string

Parmetro 3: Tipo de dato

b: Tipo blob

Parmetro 4: Longitud del dato


execute(): Ejecuta un comando
preparado. Es posible vincular los

execute(): Ejecuta un comando

parmetros en forma de array a

preparado.

travs de este mtodo.


fetch(): Obtiene una fila de la
consulta.Parmetro: Indica como se
devuelven los datos.
PDO:FETCH_OBJ: retorna las filas

get_result(): Obtiene los resultados de

en forma de objetos.

una sentencia preparada, si es que la

PDO:FETCH_ASSOC: en forma de

sentencia retorna filas.

array asociativo.

La API clsica no soporta crear sentencias preparadas, el ejemplo


que vimos fue el uso de la sentencia interna PREPARE de MySQL,
intentando simular el comportamiento genrico de un comando.

EJECUTAR UN PROCEDIMIENTO ALMACENADO EN MYSQL


Ejecutar un procedimiento con nuestras extensiones no requiere
mtodos nuevos ni adornos adicionales. Se hace exactamente con los
mismo que hemos venido estudiando en cada complemento. Lo nico
que debes tener en cuenta es si el procedimiento devuelve
una tabla o solo afecta la base de datos. Dependiendo de esa
situacin elegirs el mtodo apropiado.
A continuacin veremos la invocacin de un procedimiento que
devuelve las estadsticas de unCurso Online realizado por
tus Estudiantes llamado sp_estadistica_curso. Se debe considerar
que este mtodo recibe como parmetro de entrada el ID del curso:

//PDO
$proc = $con->prepare('CALL sp_clientes_edad(?)');
$proc->bindParam(1, $var, PDO::PARAM_INT);
$proc->execute();
print("<table>");
while($res=$proc->fetch(PDO::FETCH_OBJ)){
print("<tr>");
print("<td>".$res->NO_ALUMNOS."</td>");
print("<td>".$res->NOTA_MEDIA."</td>");
print("<td>".$res->NOTA_MAX."</td>");
print("<td>".$res->NOTA_MIN."</td>");
print("</tr>");
}
print("</table>");

//MySQLi
if ($stmt = $mysqli->prepare("CALL sp_estadistica_curso(?)") ){
/* ligar parmetros para marcadores */
$stmt->bind_param("d", $Id_curso);

/* ejecutar la consulta */
$stmt->execute();
$resultado = $stmt->get_result();
print("<table>");
while($rows=$resultado->fetch_assoc()){
print("<tr>");
print("<td>".$rows["NO_ALUMNOS"]);
print("<td>".$rows["NOTA_MEDIA"]);
print("<td>".$rows["NOTA_MAX"]);
print("<td>".$rows["NOTA_MIN"]);
print("</tr>");
}
print("</table>");
/* cerrar sentencia */
$stmt->close();
}
else{
echo "Error al ejecutar el procedimiento".$mysqli->error;
}

Como ves, simplemente es usar la sentencia CALL y ejecutar


normalmente el procedimientocomo si se tratase de un comando
cualquiera.

PDO VS. MYSQLI, CUL DEBES ELEGIR?


Yo te dira que depende. Primero descarta el API clsica, ya que ser
descontinuada y seria una perdida de recursos para tus proyectos
futuros.
Entre MySQLi y PDO tambin
depende
de
las
necesidades de tu proyecto. Te invito a que visites este link oficial del
sitio de PHP para que veas un cuadro de comparacin de beneficios
entre las APIs, de seguro te ayudar a sacar conclusiones.

Você também pode gostar