Está en la página 1de 10

Inicio

Desarrollo Android
Datos
¿Como Conectar Php y Mysql a través de PDO y MySQLi?

¿Como Conectar Php y Mysql
a través de PDO y MySQLi?
James Revelo julio 19, 2014 Datos, Web Services 3 Comments
En este artículo veremos como integrar Php y Mysqlpara aumentar
la funcionalidad de nuestrosdesarrollos web. Primero veremos como
abrir la conexión en el servidor Mysql. Luegoejecutaremos
comandos en nuestra base de datos a través de nuestra aplicación y
finalmente aprenderemos a llamar procedimientos almacenados.
Actualmente Php ha
declarado
obsoleta
su API clásica
de
conexión MySQL para
proyectos
que
usen
versiones
de Php superiores a la 5.5.0. No obstante existen otras dos APIs de
integración, llamadas MySQLi y PDO_MySQL. En este artículo
cubriremos la acción de estas tres APIs para que veas las
características de codificación en cada una.

CADENAS DE CONEXIÓN ENTRE PHP Y MYSQL
Haremos exactamente lo mismo que con la conexión 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 conexión. Como medida de seguridad
puedes crear un archivo .php que guarde estos datos en variables
locales de forma externa.
<?php //Datos de conexión a la base de datos
$hostname = 'localhost';
$database = 'datos';
$username = 'usuario';
$password = 'contraseña';

$mysqli -> mysqli_connect_error()). //Manejo de errores if (!$con) die("Falló la conexión a MySQL: " . $username. } catch (PDOException $e) { print "¡Error!: " . $database).$password. //Conectando $con = mysql_connect($hostname. try { $con = new PDO('mysql:host='. else echo "Conexión exitosa!". $username. //MySQLi require_once 'mysql-login. //Seleccionar base de datos mysql_select_db($database) or die("Seleccion de base de datos fallida " .php'.'. ") " .php'. $password). mysql_error()). $database.php'. $e->getMessage() .$hostname. Para abrir la conexión emplearemos los siguientes fragmentos de código: //MySQL clásico require_once 'mysql-login. " ". . $username. $mysqli -> mysqli_connect_errno() . mysql_close(). $mysqli = new mysqli($hostname. print "Conexión exitosa!". die(). if ($mysqli -> connect_errno) { die( "Fallo la conexión a MySQL: (" . } $con =null. $password). //MySQL PDO require_once 'mysql-login. mysql_error()).dbname='.?> Luego incluiremos este archivo con la sentencia require_once en el archivo donde abriremos la conexión.

Como ejemplo actualizaremos el nombre de un Profesor cuyo código es 2 en la base de datos de una Universidad. new PDO: Crear un nuevo objeto de conexión con las cadenas de conexión. a diferencia de select que retorna resultados estructurados en forma de tabla. delete solo modifican la base de datos. . es importante elegir correctamente la forma en tratar ambas opciones. $mysqli -> mysqli_close(). Debido a esta situación. La cadena “mysql”: al inicio es un estándar de conexión. EJECUTAR COMANDOS MYSQL DESDE PHP Ya sabes que los comandos insert. Para cerrar la conexión asignas NULL al objeto de conexión creado. En el siguiente ejemplo estudiaremos como ejecutar los comandos que no retornan filas.} else echo "Conexión exitosa!". 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(): Función que cierra la conexión mysqli_close(): Método de la clasemysqli para cerrar la conexión. así que incluyela siempre. En la siguiente tabla veremos las características para realizar la conexión en las tres apis: MySQL clásica MySQLi PDO mysql_connect(): Función para abrir la conexión new mysqli: Crear nuevo objeto de conexión con las cadenas de conexión. update.

"Filas afectadas".$mysqli->error. else echo mysql_affected_rows(). //PDO $count = $con->exec("UPDATE PROFESOR SET NOMBRE ='Brenda' WHERE ID=2"). if(!$resultado) die("Fallo el comando:". exec(): Método de la clase PDO para ejecutar un comando que solo afecta la base de datos.mysql_error())." Filas afectadas"). El retorno de exec() es la cantidad de filas afectadas por la sentencia." Filas afectadas").//MySQL clásico $resultado = mysql_query("UPDATE PROFESOR SET NOMBRE ='Brenda' WHERE ID=2"). CONSULTAR BASE DE DATOS MYSQL DESDE PHP . query(): Método de la clasemysqli para ejecutar un comando. mysql_affected_rows(): Retorna en la cantidad de filas afectadas affected_rows: Atributo de la clase mysqli que guarda la cantidad de filas afectadas. //MySQLi if ($mysqli->query("UPDATE PROFESOR SET NOMBRE ='Brenda' WHERE ID=2") === TRUE) { printf($mysqli->affected_rows. La siguiente tabla muestra las características de ejecución en cada API: MySQL clásica MySQLi PDO mysql_query(): Función que ejecuta un comando en la base de datos. } else echo "Error al ejecutar el comando:". print($count.

$rows["DESCRIPCION"].$rows["ID"].MYSQL_ASSOC)){ print("<tr>").$rows["DESCRIPCION"]. while($rows = mysql_fetch_array($resultado. print("<td>". print("</tr>")."</td>").mysql_error()). print("<table>"). //MySQLi $query = "SELECT * FROM AVIONES". print("<td>". } mysql_free_result($resultado). $resultado =null. Por su parte. $resultado = mysql_query($query). print("<td>". print("<td>"."</td>")."</td>")."</td>"). //MySQL clásico $query = "SELECT * FROM AVIONES". } print("</table>"). if(!$resultado) die("Fallo el comando:".$rows["ID"]."</td>"). print("</tr>"). PDO emplea el método query() para obtener las filas.$rows["CAPACIDAD"]. //PDO $query = "SELECT * FROM AVIONES"."</td>").$rows["CAPACIDAD"]. A continuación veremos como consultar la tabla AVIONES del sistema de una Aerolínea. print("<table>"). $resultado = $con->query($query). foreach ( $resultado as $rows) { print("<tr>"). print("<td>".Para este caso el API MySQL clásico y MySQLi usan el mismo método anterior para tratarconsultas. . } print("</table>"). $resultado=$mysqli->query($query). print("<td>". else{ print("<table>").

SENTENCIAS PREPARADAS EN PHP Si recuerdas en los artículos anteriores sobre conexiones era común usar el carácter ‘?’ para indicar que un valor iba a ser variable dentro de una sentencia preparada. Observa el resumen te las características para ejecutar consultas con las extensiones: MySQL clásica mysql_fetch_array(): Función que obtiene una fila de la consulta.while ($rows = $resultado->fetch_assoc()) { print("<tr>").$rows["DESCRIPCION"]. MYSQL_ASSOC: Array de retorno con índices asociativos."</td>"). MYSQL_BOTH: Array de retorno con ambos tipos de índices. print("<td>". print("<td>". } print("</table>"). free(): Libera la memoria asociada Asigna NULL a la variable que recibió la referencia del resultado para liberar la memoria.fetch(): Método de la clase PDO para obtener una fila de una consulta. MYSQL_NUM: Array de retorno con índices numéricos.$rows["CAPACIDAD"]. es decir. mysql_free_result(): Libera la memoria hacia los resultados de la consulta MySQLi PDO fetch_assoc(): Método de la clase mysqli_result que obtiene una fila de la consulta en forma de array asociativo. . El parámetro indica que tipo de array será retornado. query(): Método de la clase PDO que retorna en un objeto PDOStatement que contiene los resultados de una consulta. $resultado->free()."</td>")."</td>"). print("<td>". Recorreremos cada elemento del objeto con un bucle foreach. print("</tr>").$rows["ID"]. que tomaría distintos valores según los datos que nosotros le asociáramos para ejecutar múltiples veces la sentencia pero con diferentes valores.

mysql_error()).$nombre. apellido.mysql_error()).mysql_error()). /* ejecutar la consulta */ $stmt->execute().?. /* cerrar sentencia */ $stmt->close().$email). Supón que has creado un formulario que recibe el nombre.$edad.'. Ahora deseas que cuando el usuario de clic en el botón de confirmación estos campos sean guardados en tu tabla USUARIO.$email.$apellido.?. Veamos como solucionarlo en los tres complementos.'"' . } . edad y el correo electrónico de un usuario. if(!mysql_query($query)) die("Error en EXECUTE:".?.'. $nombre. if(!$resultado) die("Fallo el comando:".?)") ){ /* ligar parámetros para marcadores */ $stmt->bind_param("ssds". if(!mysql_query($query)) die("Error en DEALLOCATE:".$apellido. las APIs de MySQL para Php utilizan este mismo formato para preparar un comando.$mysqli->error. } else{ echo "Error al ejecutar la sentencia preparada". $query = 'EXECUTE sentencia USING @nombre.@apellido ="'.?. $query = 'DEALLOCATE PREPARE sentencia'.@edad ='.?.?)"'.@email='. //MySQL clásico $query = 'PREPARE sentencia FROM "INSERT INTO usuario VALUES(NULL.Pues bien.mysql_error()). else{ print("PREPARE exitoso!</br>"). } //MySQLi if ($stmt = $mysqli->prepare("INSERT INTO usuario VALUES(NULL.$edad.@apellido.'.?. $query ='SET @nombre = "'. if(!mysql_query($query)) die("Error en SET: ".@edad'. $resultado = mysql_query($query).'"'.

bind_param(): Liga los parámetros 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 parámetros de una sentencia preparada. execute(): Ejecuta un comando preparado.$email)). EJECUTAR UN PROCEDIMIENTO ALMACENADO EN MYSQL . intentando simular el comportamiento genérico de un comando.?. $cmd->execute(array($nombre.Parámetro: Indica como se devuelven los datos.//PDO $cmd = $con->prepare('INSERT INTO usuario VALUES(NULL. si es que la sentencia retorna filas.$edad.?. La API clásica no soporta crear sentencias preparadas.?)'). PDO:FETCH_ASSOC: en forma de array asociativo.$apellido. el ejemplo que vimos fue el uso de la sentencia interna PREPARE de MySQL. prepare(): Método de la clase PDOpara crear una sentencia preparada.?.Parámetro 1: Índice del parámetro Parámetro 2: La variable relacionada al parámetro Parámetro 3: Tipo de dato Parámetro 4: Longitud del dato execute(): Ejecuta un comando preparado. Es posible vincular los parámetros en forma de array a través de este método. PDO:FETCH_OBJ: retorna las filas en forma de objetos. A continuación se observan las características para crear una sentencia preparada en las apis de conexión: MySQLi PDO prepare(): Método de la clase mysqli_stmt para preparar una sentencia genérica. get_result(): Obtiene los resultados de una sentencia preparada.Los parámetros se representan con el carácter ‘?’ o con una etiqueta “:label”. fetch(): Obtiene una fila de la consulta.

$rows["NO_ALUMNOS"])."</td>").$res->NOTA_MAX. Dependiendo de esa situación elegirás el método apropiado. $proc->execute(). print("<td>"."</td>"). $resultado = $stmt->get_result(). Se hace exactamente con los mismo que hemos venido estudiando en cada complemento. while($rows=$resultado->fetch_assoc()){ print("<tr>"). $proc->bindParam(1.$res->NO_ALUMNOS. while($res=$proc->fetch(PDO::FETCH_OBJ)){ print("<tr>"). print("</tr>").$res->NOTA_MEDIA. print("<table>"). ."</td>").Ejecutar un procedimiento con nuestras extensiones no requiere métodos nuevos ni adornos adicionales. /* ejecutar la consulta */ $stmt->execute(). PDO::PARAM_INT). print("<table>"). print("<td>". } print("</table>").$rows["NOTA_MAX"]). print("<td>". print("<td>". Lo único que debes tener en cuenta es si el procedimiento devuelve una tabla o solo afecta la base de datos. //MySQLi if ($stmt = $mysqli->prepare("CALL sp_estadistica_curso(?)") ){ /* ligar parámetros para marcadores */ $stmt->bind_param("d".$rows["NOTA_MEDIA"])."</td>").$res->NOTA_MIN. print("<td>". print("<td>". print("<td>". Se debe considerar que este método recibe como parámetro de entrada el ID del curso: //PDO $proc = $con->prepare('CALL sp_clientes_edad(?)'). print("<td>". $Id_curso). $var. A continuación veremos la invocación de un procedimiento que devuelve las estadísticas de unCurso Online realizado por tus Estudiantes llamado sp_estadistica_curso.$rows["NOTA_MIN"]).

Primero descarta el API clásica. . simplemente es usar la sentencia CALL y ejecutar normalmente el procedimientocomo si se tratase de un comando cualquiera. ¿CUÁL DEBES ELEGIR? Yo te diría que depende. MYSQLI. PDO VS. } Como ves. /* cerrar sentencia */ $stmt->close().print("</tr>"). Entre MySQLi y PDO también “depende” de las necesidades de tu proyecto. ya que será descontinuada y seria una perdida de recursos para tus proyectos futuros. de seguro te ayudará a sacar conclusiones. } print("</table>"). Te invito a que visites este link oficial del sitio de PHP para que veas un cuadro de comparación de beneficios entre las APIs.$mysqli->error. } else{ echo "Error al ejecutar el procedimiento".