Si programas en PHP y te has encontrado con la necesidad de acceder a Bases de datos te conviene leer este post. Para este ejercicio utilizaremos MySQL como BD, pero también están disponibles los drivers para MSSQL, POSTGRE entre otros.
¿Qué es PDO?
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. Además usarlo es más seguro, ya que todas las ejecuciones son sanitizadas para evitar inyecciones de código SQL hacia la BD.
Conexión Driver MySQL

 

try {
//Creamos nuestra nueva instancia de PDO
$conexion = new PDO("mysql:host=localhost;dbname=bd", "usuario", "contraseña");

//Habilitamos el modo de errores para visualizarlos
$conexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

//Configuramos el juego de caracteres UTF-8
$conexion->exec("set charset utf8");

//Atrapamos los posibles errores para evitar errores fatales en PHP
} catch (PDOException $e) {
echo "Error al conectar la base de datos" . $e->getMessage();
}

 

Realizando consultas a la BD


<pre>include("connection.php");
try {
//Preparamos nuestra consulta SQL mediante el método prepare de nuestra instancia
$query = $conexion->prepare("SELECT * FROM personas");

//Ejecutamos nuestra consulta
$query->execute();

//Mostramos todos los registros retornados con 'fetchAll', nótese que pasamos como
//paramétro 'PDO::FETCH_ASSOC'. Esto hará que recibamos el resultado en un arreglo
//de tipo asociativo
var_dump($query->fetchAll(PDO::FETCH_ASSOC));

//El método para retornar el primer registro sería '$query->fetch(PDO::FETCH_ASSOC)'

//El método para retornar un único valor es'$query->fetchColumn()'

//Si desean recibir el resultado en un arreglo clásico (tipo númerico), la variable
//para hacerlo es 'PDO::FETCH_NUM'

//Si desean recibir el resultado en forma de objeto stdClass, el parametro a pasar es: 'FETCH_OBJ'

} catch (PDOException $e) {
die($e->getMessage());
}</pre>

Realizando inserciones a la BD


<pre>include("connection.php");
try {
//Definimos las variables a utilizar
$nombre = "Hiram Guerrero";
$edad = 25;
$genero = "Masculino";
//Definimos el query para la inserción a través del metodo prepare
$query = $conexion->prepare("INSERT INTO personas (nombre, edad, genero) VALUES (:nombre, :edad, :genero)");
//Ahora ataremos los paramétros al query mediante el método bindParam
$query->bindParam(":nombre", $nombre);
$query->bindParam(":edad", $edad);
$query->bindParam(":genero", $genero);
//Ejecutamos la inserción
$query->execute();

//Si deseamos verificar el número de filas que fueron insertadas o modificadas podemos usar la funcion rowCount(), como se muestra a continuación.
var_dump($query->rowCount());

} catch (PDOException $e) {
die($e->getMessage());
}</pre>

Realizando actualizaciones a la BD


<pre>try {
 Definimos las variables a utilizar
 $id = 1;
 $nombre = "Pedro Martinez";
 $edad = 30;
 $genero = "Masculino";

 Definimos el query para la actualización a través del metodo prepare
 $query = $conexion->prepare("UPDATE personas SET
 nombre = :nombre,
 edad = :edad,
 genero = :genero
 WHERE id = :id");

 Ahora ataremos los paramétros al query mediante el método bindParam
 $query->bindParam(":nombre", $nombre);
 $query->bindParam(":edad", $edad);
 $query->bindParam(":genero", $genero);
 $query->bindParam(":id", $id);

 Ejecutamos la actualización
 $query->execute();
 
 Si deseamos verificar el número de filas que fueron insertadas o modificadas podemos usar la funcion rowCount(), como se muestra a continuación.
 var_dump($query->rowCount());
 
} catch (PDOException $e) {
 die($e->getMessage());
}
</pre>

Configuraciones adicionales
[output]Si quisiéramos que todas las consultas hechas sobre una instancia de PDO fueran de tipo array asociativo, podemos definirlo como un atributo desde la creación con el siguiente método:
$conexion->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

En cambio si deseamos que la respuesta llegara en un array númerico, definimos:
$conexion->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_NUM);

Otro dato importante es también obtener el id de la última fila insertada, ejecutamos el método getLastId sobre la INSTANCIA de pdo como se muestra a continuación:
var_dump($conexion->lastInsertId());[/output]

Conexión Driver Postgres

Como comentabamos anteriormente otra de las ventajas de usar PDO es que cuenta con drivers para múltiples motores de BD. Por ejemplo si quisiéramos conectarnos a un motor postgre nuestro archivo de conexión sería:


<pre>try {
//Creamos nuestra nueva instancia de PDO con el driver de Postgres
 $conexion = new PDO("pgsql:dbname=postgres;host=localhost;user=postgres;password=contraseña");

//Habilitamos el modo de errores para visualizarlos
 $conexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

//Definimos el tipo de respuesta para todas las consultas realizadas sobre esta instancia
 $conexion->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

} catch (PDOException $e) {
 die("Error : " . $e->getMessage() . "<br/>");
 }</pre>

Más información
Necesitas otras funciones? Toda esta información la puedes encontrar en el siguiente enlace
Documentación oficial PDO
Todos los archivos y la tabla utilizada los puedes encontrar en el siguiente enlace, en la carpeta php-pdo
Repositorio blog hoclabs

Leave a Reply