Você está na página 1de 10

Inicio

Desarrollo Android
Datos
Como Conectar Php y Mysql a travs de PDO y MySQLi?

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 Mysqlpara 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 MysqlJava 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
constructorPDO

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
una Universidad.

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

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

//MySQLi
if ($mysqli->query("UPDATE

PROFESOR

SET

NOMBRE

='Brenda'

WHERE

ID=2") === TRUE) {


printf($mysqli->affected_rows." Filas afectadas");
}
else
echo "Error al ejecutar el comando:".$mysqli->error;

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 PDO para
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
mysql_fetch_array():
Funcin que obtiene
una fila de la consulta.
El parmetro indica que
tipo de array ser
retornado.
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

MySQLi

PDO

fetch_assoc():
Mtodo de la
clase
mysqli_result que
obtiene una fila
de la consulta en
forma de array
asociativo.

query(): Mtodo de la clase


PDO que retorna en un objeto
PDOStatement que contiene
los resultados de una
consulta. Recorreremos 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 electrnico de 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 con el carcter ? o
con una etiqueta :label.

prepare(): Mtodo de la clase PDOpara


crear una sentencia preparada.

bind_param(): Liga los parmetros


de la sentencia preparada mediante
alguno de los siguientes indicadores
de tipo:i: Tipo entero
d: Tipo float
s: Tipo string
b: Tipo blob

bindParam(): Liga los parmetros de


una sentencia preparada.Parmetro 1:
ndice del parmetro
Parmetro 2: La variable relacionada al
parmetro
Parmetro 3: Tipo de dato
Parmetro 4: Longitud del dato

execute(): Ejecuta un comando


preparado.

execute(): Ejecuta un comando


preparado. Es posible vincular los
parmetros en forma de array a travs
de este mtodo.

get_result(): Obtiene los resultados


de una sentencia preparada, si es
que la sentencia retorna filas.

fetch(): Obtiene una fila de la


consulta.Parmetro: Indica como se
devuelven los datos.
PDO:FETCH_OBJ: retorna las filas en
forma de objetos.
PDO:FETCH_ASSOC: en forma de
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