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”
Deja tu comentario
El blog funciona con Wordpress y Simpla theme

August 31, 2007 a las 10:16 am
Extremadamente interesante, cambiar la manera de hacer las cosas para bien en lo mejor noo… y excelentes ejemplos como siempre… saludos de des panamá.
September 4, 2007 a las 2:57 am
[...] PHP5 y Bases de Datos La interface de acceso a datos de PHP5 [...]
September 4, 2007 a las 2:59 am
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
September 4, 2007 a las 10:04 am
Me alegro que les haya parecido util
#ImZyos!, una de las principales ventajas de PDO es que la puedes extender como cualquier otra clase
Saludos
September 4, 2007 a las 2:40 pm
¬¬ ahora solo pienso en por que no me cambie antes a php5, hoy por al tarde comenzare a escribirla, y ya veremos como va.
September 5, 2007 a las 3:05 am
Acá la Clase esta muy beta =S se aceptan sugerencias
http://rs208.rapidshare.com/files/53502226/pdo.php
September 5, 2007 a las 9:42 am
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
September 5, 2007 a las 12:34 pm
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.
September 6, 2007 a las 6:36 pm
Cuestion de gustos
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.
September 7, 2007 a las 2:14 am
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 ^^
September 11, 2007 a las 5:26 am
Como te dije en el blog de anieto2k, este es un muy buen aporte, muchas gracias por compartirlo
Saludos
September 11, 2007 a las 2:09 pm
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
December 22, 2007 a las 1:25 am
¿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
December 22, 2007 a las 1:31 am
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
December 23, 2007 a las 1:12 pm
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
December 23, 2007 a las 5:46 pm
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
Saludos.
March 14, 2008 a las 12:45 am
Deseo trabajar con PDO, ¿Como lo instalo en el APPSERV para windows?..gracias de antemano
March 14, 2008 a las 8:39 am
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
June 11, 2008 a las 11:38 pm
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.
July 7, 2008 a las 4:05 am
Hola, muy buen tutorial
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
August 22, 2008 a las 9:17 am
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
Acabo de terminar este articulo con los ejemplos que das para descargar, facilito para empezar
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
April 20, 2009 a las 8:25 pm
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???
April 20, 2009 a las 8:59 pm
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???
April 20, 2009 a las 9:00 pm
Ahhh y gracias por tomarte el tiempo de ayudarme a solucionar mis dudas.
July 28, 2009 a las 10:25 am
[...] Referencias | jourmoly.com.ar [...]
August 3, 2009 a las 11:29 pm
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 ¿?
November 19, 2009 a las 5:54 pm
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.
January 20, 2010 a las 2:37 pm
Muchas gracias por la explicacion me sirvio de mucho. Que bueno que sigan existiendo personas que teniendo el conocimiento accedan a compartirlo.
January 22, 2010 a las 7:45 pm
[...] informacion ha sido referenciada de Jourmoly los ultimos ejemplos fueron tomados del libro de Symfony 1.2 en [...]
June 16, 2010 a las 3:03 pm
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