PHP Data Objects - PDO

30 de Agosto, 2007

PDO es una interface de acceso a datos que nos permite, mediante varios drivers, conectarnos a diferentes bases de datos. Olvídate de esto, esto, esto e incluso de esto otro, ahora solo debes preocuparte por PDO. Esta librería escrita en C viene activada por defecto desde PHP 5.1 por lo cual la podrás utilizar en la mayoría de los servidores que actualmente soportan PHP5.

La conexión

Para todos los ejemplos utilizaré MySQL, pero también podria utilizar cualquier otra de las bases de datos soportadas adaptando un poco el código que sigue:

1
$db = new PDO('driver:host=servidor;dbname=bd', user, pass);

Y el ejemplo práctico:

1
$db = new PDO('mysql:host=localhost;dbname=pruebas', 'root', '');

Ahora en $db tenemos una instancia de PDO_MySQL

Primera consulta

Para la primer consulta haremos uso de prepare, execute y fetch.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
require 'conexion.php';
 
//Nos conectamos
$db = new PDO('mysql:host=' . $servidor . ';dbname=' . $bd, $usuario, $contrasenia);
 
//Preparamos la consulta para dejarla lista para su ejecución
$consulta = $db->prepare('SELECT * FROM items');
 
//Ejecutamos la consulta
$consulta->execute();
 
//Recorremos el set de resultados mostrando la información
while($fila = $consulta->fetch())
{
	echo $fila[0] . '  ' . $fila[1] . '<br />';
}
 
//Cerramos la conexión a la vez que destruimos nuestra instancia de PDO
$db = null;

Como verás no es nada complicado y es muy similar a lo que nos acostumbramos a hacer con las clásicas funciones mysql_.

Con las funciones MySQL también debíamos validar estrictamente los parámetros de entrada para evitar inyecciones SQL. En este caso, PDO lo hará por nosotros siempre y cuando utilicemos alguna de las varias formas que nos provee para realizar consultas parametrizadas. Este es un ejemplo:

1
2
3
4
5
//Preparamos la consulta marcando donde irán los parametros con ?
$consulta = $db->prepare('SELECT * FROM items WHERE id_item = ? OR id_item = ?');
 
//Ejecutamos la consulta incluyendo los parámetros en el mismo orden en el que deben incluirse
$consulta->execute(array(2, 4));

El ejemplo anterior generará una consulta de la siguiente manera:

1
SELECT * FROM items WHERE id_item = '2' OR id_item = '4'

Otra manera de hacer lo mismo:

1
2
3
4
5
6
7
8
9
10
$id = 6;
 
//Esta vez utilizamos un nombre-clave para cada parámetro
$consulta = $db->prepare('SELECT * FROM items WHERE id_item = :id');
 
//Con dicho nombre-clave, agregamos el valor del parámetro
$consulta->bindParam(':id', $id);
 
//Y ejecutamos la consulta
$consulta->execute();
1
SELECT * FROM items WHERE id_item = '6'

Ahora bien, si no confían, intenten inyectar SQL concatenando alguna sentencia en la variable $id y verán los resultados ;-)

Altas, Bajas y Modificaciones

El mecanismo sigue siendo el mismo que en las consultas anteriores, preparar la consulta, agregar los parámetros y ejecutar.

alta

1
2
3
4
5
6
$item = $_POST['item'];
 
$inserta = $db->prepare('INSERT INTO items (item) VALUES (:item)');
$inserta->bindParam(':item', $item);
 
$inserta->execute();

baja

1
2
3
4
5
6
$id = $_GET['id'];
 
$borra = $db->prepare('DELETE FROM items WHERE id_item = :id');
$borra->bindParam(':id', $id);
 
$borra->execute();

modificación

1
2
3
4
5
6
7
8
$item = $_POST['item'];
$id = $_POST['id'];
 
$actualiza = $db->prepare('UPDATE items SET item = :item WHERE id_item = :id');
$actualiza->bindParam(':item', $item);
$actualiza->bindParam(':id', $id);
 
$actualiza->execute();

Y esto es todo por el momento, solo un primer acercamiento a PDO. Podés bajarte todos estos ejemplos y varios mas desde aquí. Para que funcionen debes contar con un servidor que soporte PHP5 con las librerías PDO_MySQL instaladas, debes crear una base de datos, ejecutar el fichero items.sql y editar el archivo conexion.php con los datos que correspondan.

Articulos Relacionados

21 comentarios en “PHP Data Objects - PDO”

  1. Arcadio Dijo:

    Extremadamente interesante, cambiar la manera de hacer las cosas para bien en lo mejor noo… y excelentes ejemplos como siempre… saludos de des panamá.

  2. PHP5 y Bases de Datos « I’m Zyos Code Dijo:

    […] PHP5 y Bases de Datos La interface de acceso a datos de PHP5 […]

  3. ImZyos! Dijo:

    Wow, me acabas de ahorrar escribir código, hace cosa de dos días que migre a PHP5, me disponia a reescribir mi clase DATABASE, ahora creo que mejor empezare una nueva.

    Exelente articulo

  4. Federico Dijo:

    Me alegro que les haya parecido util :D

    #ImZyos!, una de las principales ventajas de PDO es que la puedes extender como cualquier otra clase

    Saludos

  5. ImZyos! Dijo:

    ¬¬ ahora solo pienso en por que no me cambie antes a php5, hoy por al tarde comenzare a escribirla, y ya veremos como va.

  6. ImZyos! Dijo:

    Acá la Clase esta muy beta =S se aceptan sugerencias

    http://rs208.rapidshare.com/files/53502226/pdo.php

  7. Federico Dijo:

    Tiene pinta ImZyos!, lo unico que yo probaria seria el tema de directamente extenderla. Y otra cosa, de pesado nomas, para el codigo me gusta mas CamelCase , pero eso va con los gustos :p

    Saludos

  8. ImZyos! Dijo:

    Jejeje, es una costumbre que odio, viene de el lenguaje que más he odiado… JAVA, en cuanto a extenderla directamente, lo hice, pero como me gusta dejarle los nombres originales a las funciones, aparte depurandola le encontre un error en la de fetch_all() no debe tener los parametros que tiene.

  9. Federico Dijo:

    Cuestion de gustos :D

    Con respecto a extender, si mal no recuerdo también podés conservar el nombre de los métodos. Algo asi como:


    function fetch($parametros)
    {
    //Aqui hago lo que quiero
    parent::fetch($parametros);
    }

    Yo de momento sigo con una clase compatible con PHP4, lamentablemente algunos de los host de los clientes no soportan PHP5 aun.

  10. ImZyos! Dijo:

    See, pero yo casi no desarrollo para web =S se oye raro, lo se, pero yo hago aplicaciones apra correr en severs locales, en cuanto lo de extender a la propia PDO ya esta ^^

  11. noth Dijo:

    Como te dije en el blog de anieto2k, este es un muy buen aporte, muchas gracias por compartirlo

    Saludos

  12. Federico Dijo:

    Me alegro que te guste y agradezco tus comentarios :-)

    Si eres de utilizar frameworks para php, es muy probable que inconcientemente tambien hayas usado PDO, por ejemplo Zend Framework la utiliza.

    Un saludo

  13. Laut Dijo:

    ¿No es casi igual que la librería ADODB? solo con la diferencia de que ADODB no es, justamente, una librería?
    a mi este me pareció más “complejo” ya que tenés que preparar la consulta, aunque también es verdad que con eso quitás el injection.
    Por favor, si alguien me puede recomendar ADODB o PDO.
    muchas gracias

  14. Federico Dijo:

    Laut, hasta donde yo se, ADODB de PHP es una librería escrita en PHP, creo haber leído alguna vez que también había una versión pre-compilada o algo por el estilo, pero no estoy seguro.

    Sin contas con PHP5 ni lo dudes, elige PDO… como comentaba en el post es una librería escrita en C lo que te asegura que es muchísimo mas rápida que cualquier otra escrita en PHP. Por otro lado, lo de “complejo” es un detalle solucionable porque al ser una o varias clases, las puedes extender para agregarles las funcionalidades que desees. En tu caso, saltar directo a la ejecución de la consulta sin tener que “prepararla”.

    Saludos

  15. Laut Dijo:

    Sin dudarlo lo voy a probar. Obviamente la velocidad se debe notar mucho, pero mi duda era si había algo en contra de PDO, pero si lo recomendás, pues… a testearlo.
    Muchas gracias

  16. Federico Dijo:

    En contra? mas bien mucho a favor. Para mi ADODB cumplió su ciclo y se ha quedado en PHP4. Ahora estamos en PHP5 y muy pronto se comenzara a ver PHP6, ahora ya es tiempo de PDO :-D

    Saludos.

  17. Victor Dijo:

    Deseo trabajar con PDO, ¿Como lo instalo en el APPSERV para windows?..gracias de antemano

  18. Federico Dijo:

    Hola Victor, no uso appserv pero se que te lo bajas, lo instalas y listo. Igual, mañana o pasado publicaré un articulo comentando sobre la instalacion de Apache + PHP + MySQL + SVN, si no tenes apuro, quizas te sirva.

    Saludos

  19. palotex Dijo:

    Como activar extensiones PDO en PHP5

    Las extensiones PHP Data Objects (PDO) son una interfaz para el acceso a distintas bases de datos soportadas por PHP. La ventaja de usar PDO es que se trabaja con cualquiera de las bases de datos soportadas de la misma forma y usando las mismas clases y funciones.

    De forma predeterminada, en nuestros servidores PDO está disponible en PHP5 y se incluyen los drivers para trabajar con MySQL y SQLite. De todas formas, PDO está desactivado y para usarlo es necesaria su activación.

    Para activar la extensión PDO en el PHP5 de tu cuenta de alojamiento debes añadir la siguiente línea al archivo etc/php5/php.ini de tu cuenta:

    extension=pdo.so

    Pero con esto no es suficiente, es necesario que cargues algunos de los drivers de base de datos. Para cargar MySQL añade la siguiente línea al mismo archivo php.ini:

    extension=pdo_mysql.so

    Por otro lado, para cargar el driver de SQLite añade la siguiente línea:

    extension=pdo_sqlite.so

    Evidentemente, es posible tener ambos drivers cargados, pero si no los vas a usar no los actives, ya que consumiría memoría y recursos para nada.

  20. frago Dijo:

    Hola, muy buen tutorial :D
    solo que tengo un problema para activar el PDO en windows, no logro hacerlo hacerlo funcionar. Agradecería mucho si me pudieran ayudar con esto.

    saludos

  21. osdave Dijo:

    Hola Federico,
    Despues de pasar 5 años con OScommerce con lo cual he aprendido a programar (mal) estoy ahora estudiando magento. Para eso tengo que aprender a programar bien, usando POO, MVC, etc…
    Buscando info en la web he llegado aqui y la verdad me parece que explicas muy bien estas cosas: me voy a repasar el blog entero :D
    Acabo de terminar este articulo con los ejemplos que das para descargar, facilito para empezar :P

    En el zip que nos propones, los 3 primeros links se llaman igual, “Consulta común 1″: si te apetece cambiarlo te he subido lo que he cambiado aqui: http://rs123.rapidshare.com/files/139235898/index.php

    Bueno, gracias por todo, ya me veras por aqui ;)
    saludos

Deja tu comentario

XHTML: Puedes usar estos tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>

El blog funciona con Wordpress y Simpla theme