PHP Data Objects – PDO

30 de August, 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.

Popularity: 26% [?]

Otros artículos

30 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

  22. abel Dijo:

    Una pregunta, estoy utilizando tu MVC con POO, al hacer las consultas como describiste en este articulo, el que yo tenga una clase SPDO no afecta a la manera como lo realizas aqui???

  23. abel Dijo:

    Ya pude ver mi error, pero ahora me surgio otra duda, la cual es la siguiente, si yo ejecuto una consulta y no me regresa nada, por ejemplo que busque un usuario mediante su cedula; si el usuario existe me regresa todos los campos que le solicite en la consulta pero si no existe que me retorna??? como puedo validar esto en mi capa de presentacion???

  24. abel Dijo:

    Ahhh y gracias por tomarte el tiempo de ayudarme a solucionar mis dudas.

  25. PDO: PHP Data objects Dijo:

    [...] Referencias | jourmoly.com.ar [...]

  26. Juan Carlos Dijo:

    Hola me parece muy interesante este blog. Tengo una duda cuando dices que nos olvidemos de las conexiones con cualquier motor de base de datos. Por ejemplo que pasaría si yo estoy desarrollando un carrito de comprar con una base de datos mysql. por ejemplo en la parte de listar los productos paginados. usaría un limit 0,10 , que pasaría si después cambio el motor de base de datos a sql server 200X, el limit tengo entendido que no funciona ahi. el PDO es suficientemente inteligente en usar el sql en todas las base de datos ??. sin cambiar nada. Solo cambiando la línea del driver por el sql server ¿?

  27. jose Dijo:

    hola!

    una pregunta, veo que en el ejemplo recurren a un bucle while, no es mejor usar un do-while ya que he visto que se usan mas para ciclos al buscar en BDs.

    saludos.

  28. Victor Dijo:

    Muchas gracias por la explicacion me sirvio de mucho. Que bueno que sigan existiendo personas que teniendo el conocimiento accedan a compartirlo.

  29. Abstraccion, ORM y PDO | J053D Dijo:

    [...] informacion ha sido referenciada de  Jourmoly los ultimos ejemplos fueron tomados del libro de Symfony 1.2 en [...]

  30. Cristina Dijo:

    Hola. Soy profesora y estoy intentando instalar Wordpress en un espacio que nos proporciona el MEC: php 4.3. y base datos SQLite. La cuestión es que para que funcione SQLite necesito instalar un PDO, y este sólo está soportado con PHP5 ¿no? ¿alguna idea?
    Gracias. Cristina

Deja tu comentario

XHTML: Puedes usar estos tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">

El blog funciona con Wordpress y Simpla theme