PHP-PDO es una clase que nos permitirá manejar con suma facilidad todas nuestras operaciones relativas a cualquier base de datos MySQL (u otra) en cualquier aplicación PHP, usando la Clase PDO.
Esta clase aprovecha varias de las ventajas de la Programación Orientada a Objetos (POO).
Para poner un ejemplo muy simple: imaginemos una aplicación que en sus orígenes podría ser pequeña y va creciendo con el tiempo, o una aplicación extensa desde sus orígenes. Es posible que en varias partes de esa aplicación necesitemos conectarnos a la base de datos para consultarla, insertar o actualizar datos. ¿Qué pasa si nos conectamos directamente allí donde lo necesitamos, pasándole las credenciales y creando nuestro nuevo objeto conexión? Aparentemente no pasa nada... pero con el tiempo, tendremos por todas partes conexiones así. Pero... ¿qué ocurrirá si se decide cambiar la contraseña de la base de datos? ¡Habrá que ir en busca de todas las partes del código en la que hemos decidido crear nuestro objeto conexión directamente y cambiar la contraseá!, de lo contrario, tendremos errores por todas partes. En cambio, tener una clase de conexión nos permite tener todo lo relativo a la conexión en un solo lugar. Cuando sea necesario cambiar algo, sólo tendremos que cambiarlo en ese lugar.
Esto es algo quizá banal. Pues pueden ocurrir cosas peores, como que en una de esas muchas partes donde creamos nuestro objeto conexión nos olvidemos de algo importante con respecto a la seguridad, y tengamos en nuestra aplicación, por descuido, algunas conexiones que sean inseguras. Tener un único objeto de conexión bien configurado, nos evitará situaciones de ese tipo que podrían ser muy peligrosas.
La POO ofrece otras ventajas, mucho más importantes. Pero no considero necesario ahondar ahora en eso.
Lo más complicado, sobre todo si estás iniciando en PHP, es configurar adecuadamente la clase. Afortunadamente esto sólo tienes que hacerlo una sola vez y no es tan complicado como parece.
Necesitaremos solamente dos archivos para tener nuestra clase funcionando.
Para darle más seguridad a las credenciales de conexión, la clase almacena dichos datos en un solo archivo de credenciales. Si por algún motivo hay que cambiar la contraseña u otros elementos de la conexión sólo habría que cambiarlos en ese archivo, como comentaba en la introducción.
Para preparar nuestro archivo de configuración sólo tendremos que seguir dos sencillos pasos:
-
Crear un archivo llamado
bd.php.ini
en una carpeta fuera del root. En este caso se usa una carpeta llamada.credenciales
. El punto.
delante crea una carpeta oculta, la cual, al estar situada fuera del root impide que se pueda acceder al archivo de configuración por url, aunque de todos modos el archivo no muestra nada. -
Copiar en
bd.php.ini
el contenido de: db.php.ini y actualizarlo con las credenciales propias. La primera línea es para evitar que, en caso de que alguien pueda acceder al archivo por url, no pueda ver nada de lo que hay dentro del archivo... Aunque es imposible acceder, porque estaría fuera del root. Si la contraseña de la base de datos contiene caracteres como comillas simples u otros, debe ponerse entre comillas, de lo contrario habrá conflictos a la hora de autentificar. No dejar espacios entre los signos de =
Copiar el archivo DbPDO.class.php en la carpeta que deseemos. Generalmente se suele tener una carpeta dedicada a las clases. Es más fácil luego cargarlas con Autoloader.
Cada vez que necesitemos usar la clase necesitaremos:
-
Incluir el archivo antes de crear una nueva instancia con
new
(a no ser que estemos cargando clases con Autoloader, pues en ese caso no haría falta incluir la clase). -
Usamos el objeto instanciado para pasar las consultas y manejar los datos. Nótese que la clase funciona del mismo modo para cualquier tipo de consulta:
SELECT, INSERT, UPDATE, DELETE ...
se trata de escribir en cada caso la consulta preparada y pasar los parámetros usando el estilo que más nos convenga. Aunque los ejemplos citados más abajo se usan con consultasSELECT
, servirían para los otros tipos de consultas.
Teniendo las credenciales correctas en nuestro archivo db.php.ini
y nuestro archivo de conexión, para usar la clase procedemos como de costumbre: lo primero es incluir la clase. Como dije antes, se puede hacer por Autoloader o con require
o requiere_once
. Luego se crea una instancia de la clase con new
require_once("DbPDO.class.php");
$mipdo=new DbPDO();
Creada la instancia de la conexión, podremos empezar a usarla. La clase tiene los métodos principales para los que necesitamos acceder a la base de datos. Se usan además consultas preparadas que previenen de la Inyección SQL.
Veamos sólo algunos ejemplos de uso.
$datos = $mipdo->query("SELECT * FROM padres");
Por lo general necesitamos aplicar filtros a las consultas. Un grave peligro es la Inyección SQL. Para prevenirla se recomienda usar consultas preparadas que envían separados la consulta y los datos del filtro. La clase proporciona varias formas de hacer esto.
a. Haciendo el binding uno por uno:
$mipdo->bind("idprovincia","1");
$mipdo->bind("idestado","5");
$datos=$db->query("SELECT * FROM tabla WHERE id_provincia = :idprovincia AND id_estado = :idestado");
b. Haciendo el binding mediante el método bindMas:
Nótese que la consulta aquí no cambia, sólo la forma de hacer el binding.
$mipdo->bindMas(array("id_provincia"=>"1","id_estado"=>"5"));
$datos=$mipdo->query("SELECT * FROM tabla WHERE id_provincia = :idprovincia AND id_estado = :idestado");
c. Enviando el binding directamente al método:
La SQL y los parámetros van por separado, aunque son enviados con una sola llamada al método
$datos=$mipdo->query(
"SELECT * FROM tabla WHERE id_provincia = :idprovincia AND id_estado = :idestado",
array("id_provincia"=>"1","id_estado"=>"5")
);
Veamos sólo algunas posibilidades de cómo obtener los datos obtenidos en la consulta y presentarlos en pantalla.
La clase devuelve por defecto un arreglo asociativo con el conjunto de los datos. Es quizá la forma más práctica, de todos modos la clase se puede modificar creando métodos que devuelvan los datos como nosotros los querramos.
En un código como éste (y en cualquier consulta SELECT con o sin parámetros), tendremos en la variable $datos
un arreglo asociativo con los datos de la tabla que cumplan el criterio.
$datos=$mipdo->query("SELECT * FROM padres;");
Resultado almacenado en la variable $datos
usando print_r()
Array
(
[0] => Array
(
[id_padre] => 1
[padre] => Juan Crisóstomo
[id_grupo] => 1
)
[1] => Array
(
[id_padre] => 2
[padre] => Agustín
[id_grupo] => 1
)
[2] => Array
(
[id_padre] => 3
[padre] => Teofilacto
[id_grupo] => 1
)
)
Resultado almacenado en la variable $datos
representado en una tabla
id_padre | padre | id_grupo |
---|---|---|
1 | Juan Crisóstomo | 1 |
2 | Agustín | 1 |
3 | Teofilacto | 1 |
Si queremos obtener un columna en específico, podríamos enviar una consulta como esta. Como hemos dicho antes, se pueden pasar en una sola llamada, mediante el método column
tanto la instrucción SQL como los parámetros. El hecho de que se pasen en una sola llamada, no significa que se pasen juntos, la clase se encarga de separarlos, para cumplir con los criterios de consultas preparadas.
$columna=$mipdo->column("SELECT padre FROM padres WHERE id_padre = :id_padre", array("id_padre"=>"50"));
Resultado almacenado en la variable $columna
usando print_r()
Array
(
[0] => Pascasio Radberto
)
Resultado almacenado en la variable $columna
representado en una tabla
padre |
---|
Pascasio Radberto |
Si queremos obtener un fila en específico, podríamos enviar una consulta como esta. También aquí podemos pasar en una sola llamada, mediante el método row
tanto la instrucción SQL como los parámetros.
$fila=$mipdo->row("SELECT id_padre, padre FROM padres WHERE id_padre = :id_padre", array("id_padre"=>"70");
Resultado almacenado en la variable $fila
usando print_r()
Array
(
[id_padre] => 70
[padre] => Alfonso María de Ligorio
)
Resultado almacenado en la variable $fila
representado en una tabla
id_padre | padre |
---|---|
70 | Alfonso María de Ligorio |
La clase tiene más métodos y usos interesantes. Puedes modificarla a tu gusto...
Continuará...