Vous êtes sur la page 1sur 8

PDO (PHP Data Objects).

Capa de Abstraccin de acceso a Bases de Datos (Primera parte)


mircoles, octubre 07, 2009 Arley Triana Morn

PDO (PHP Data Objects) es una extensin nativa de PHP5, consiste en una interface uniforme para acceder a varias bases de datos. PDO provee una capa de abstraccin de acceso a bases de datos (BD), que permite al desarrollador abstraerse de la BD de una aplicacin. As, si en alguna fase de desarrollo del proyecto se necesita cambiar de BD, esto no afectara la lgica de la aplicacin.

Actualmente los siguientes drivers implementan la Interface PDO:


Nombre del Driver --------Base de Datos soportadas PDO_DBLIB ------------------ FreeTDS / Microsoft SQL Server / Sybase PDO_FIREBIRD -------------Firebird/Interbase 6 PDO_IBM --------------------IBM DB2 PDO_INFORMIX ------------IBM Informix Dynamic Server PDO_MYSQL ----------------MySQL 3.x/4.x/5.x PDO_OCI ---------------------Oracle Call Interface PDO_ODBC ------------------- ODBC v3 (IBM DB2, unixODBC and win32 ODBC) PDO_PGSQL -----------------PostgreSQL PDO_SQLITE ----------------SQLite 3 and SQLite 2 PDO_4D ---------------------4D

Acceso a bases de datos en PHP5 con PDO


La extensin php_pdo para el trabajo con bases de datos esta compuesta por tres clases: PDO: Representa una conexin entre PHP y un servidor de bases de datos. PDOStatement: Representa una instruccin preparada y despus que la instruccin es ejecutada, una result set. PDOException: Representa un error lanzado por PDO. La Sinopsis clase PDO

2 3 [, 4 5 6 7 8 9 10 11 12 [, 13 14 [, 15 16 17

PDO { __construct ( string $dsn [, string $username string $password [, array $driver_options ]]] ) bool beginTransaction ( void ) bool commit ( void ) mixed errorCode ( void ) array errorInfo ( void ) int exec ( string $statement ) mixed getAttribute ( int $attribute ) array getAvailableDrivers ( void ) string lastInsertId ([ string $name = NULL ] ) PDOStatement prepare ( string $statement array $driver_options = array() ] ) PDOStatement query ( string $statement ) string quote ( string $string int $parameter_type = PDO::PARAM_STR ] ) bool rollBack ( void ) bool setAttribute ( int $attribute , mixed $value ) }

Mtodos 1. PDO::beginTransaction Inicializa una transaccin. 2. PDO::commit Commits una transaccin. 3. PDO::__construct Crea una instancia PDO que representa una conexin a una base de datos. 4. PDO::errorCode Recupera el SQLSTATE asociado con la ltima operacin en la base de datos. 5. PDO::errorInfo Recupera informacin extendida del error asociado con la ultima operacin en la base de datos. 6. PDO::exec Ejecuta una instruccin SQL y retorna el nmero de filas afectadas. 7. PDO::getAttribute Recupera un atributo de conexin a base de dato. 8. PDO::getAvailableDrivers Retorna un array (arreglo) de los drivers disponibles en la extensin PDO. 9. PDO::lastInsertId Retorna el ID (identificador) de la ltima fila insertada o secuencia de valores. 10. PDO::prepare Prepara una instruccin para ejecucin y retorna un objeto de tipo PDOStatement. 11. PDO::query Ejecuta una instruccin SQL, retornando un resul set como un objeto de tipo PDOStatement. 12. PDO::quote Quotes (Pone entre comillas simples un string) para uso en una query (consulta). 13. PDO::rollBack Rolls back una transaccin. 14. PDO::setAttribute Modifica un atributo. La Sinopsis
2 3 [, 4 [, [, PDOStatement implements Traversable { bool bindColumn ( mixed $column , mixed &$param int $type [, int $maxlen [, mixed $driverdata ]]] ) bool bindParam ( mixed $parameter , mixed &$variable int $data_type [, int $length mixed $driver_options ]]] )

clase

PDOStatement

5 [, 6 7 8 9 10 11 12 [, 13 [, 14 15 [, 16 17 18 19 20 21 22

bool bindValue ( mixed $parameter , mixed $value int $data_type ] ) bool closeCursor ( void ) int columnCount ( void ) bool debugDumpParams ( void ) string errorCode ( void ) array errorInfo ( void ) bool execute ([ array $input_parameters = array() ] ) mixed fetch ([ int $fetch_style = PDO::FETCH_BOTH [, int $cursor_orientation = PDO::FETCH_ORI_NEXT int $cursor_offset = 0 ]]] ) array fetchAll ([ int $fetch_style = PDO::FETCH_BOTH int $column_index [, array $ctor_args = array() ]]] ) string fetchColumn ([ int $column_number = 0 ] ) mixed fetchObject ([ string $class_name array $ctor_args ]] ) mixed getAttribute ( int $attribute ) array getColumnMeta ( int $column ) bool nextRowset ( void ) int rowCount ( void ) bool setAttribute ( int $attribute , mixed $value ) bool setFetchMode ( int $mode ) }

Mtodos 1. PDOStatement->bindColumn Sustituye el valor de una columna de la base de datos a una variable PHP. 2. PDOStatement->bindParam Sustituye el valor de un parmetro (argumento), a el nombre de variable especificada. 3. PDOStatement->bindValue Sustituye un valor como parmetro. 4. PDOStatement->closeCursor Cierra el cursor, habilitando la instruccin a ser ejecutada otra vez. 5. PDOStatement->columnCount Retorna el numero de columnas en el result set. 6. PDOStatement->debugDumpParams Dump un commando SQL preparado. 7. PDOStatement->errorCode Recupera el SQLSTATE asociado con la ltima operacin realizada en la base de datos. 8. PDOStatement->errorInfo Recupera informacin de error extendida asociada con la ultima operacin realizada en la base de datos. 9. PDOStatement->execute Ejecuta una instruccin preparada. 10. PDOStatement->fetch Recupera la siguiente fila de una result set. 11. PDOStatement->fetchAll Retorna un array conteniendo todas las filas del resul set. 12. PDOStatement->fetchColumn Retorna una nica columna de la siguiente fila de un result set. 13. PDOStatement->fetchObject Recupera la siguiente fila y la retorna como un objeto. 14. PDOStatement->getAttribute Recupera una atributo. 15. PDOStatement->getColumnMeta Retorna metadatos de una columna en un resul set. 16. PDOStatement->nextRowset Avanza a la siguiente Rowset en un multirowset. 17. PDOStatement->rowCount Retorna el numero de filas afectadas por la ltima instruccin SQL.

18. PDOStatement->setAttribute Modifica un atributo. 19. PDOStatement->setFetchMode Modifica el valor por defecto para recuperar datos de la base de datos para la instruccin actual.

Los pasos bsicos para interactuar con una base de datos desde PHP son los siguientes:
1. Conectar con el servidor de bases de datos. 2. Enviar la instruccin SQL a la base de datos. 3. Obtener y procesar los resultados. A continuacin vemos los mtodos concretos con los que realizaremos estas operaciones: 1. Conectar con el servidor de bases de datos (Crear el objeto PDO): Descripcin
PDO::__construct ( string $dsn [, string $username [, string $password [, array $driver_options ]]] )

Lista de parmetros DNS: (Data Source Name), contiene la informacin requerida para conectarse a la base de datos. username: El nombre de usuario. Este parmetro es opcional para algunos PDO drivers . password: La contrasea. Este parmetro es opcional para algunos PDO drivers. driver_options: Una llave=>valor del arreglo de opciones con driver de conexin especifico. Valores retornados En caso de xito retorna un objeto PDO. Errores/Excepciones PDO::__construct() dispara un PDOException si el intento de conexin a la base de datos falla. 2. Enviar la instruccin SQL a la base de datos: Descripcin
PDOStatement PDO::query ( string $statement ) PDOStatement PDO::query ( string $statement , int $PDO::FETCH_COLUMN , int $colno ) PDOStatement PDO::query ( string $statement , int $PDO::FETCH_CLASS, string $classname , array $ctorargs )

PDOStatement PDO::query ( string $statement , int $PDO::FETCH_INTO , object $object )

Lista de parmetros Instruccin SQL. Valores retornados PDO::query() retorna un objeto PDOStatement. 3. Obtener y procesar los resultados. Descripcin
mixed PDOStatement::fetchObject ([ string $class_name [, array $ctor_args ]] )

Lista de parmetros class_name: Nombre de la clase a crear, por defecto utiliza stdClass. ctor_args: Elementos de este arreglo son pasados al constructor. Valores retornados Retorna una instancia de la clase requerida, con el nombre de las propiedades correspondiente a los nombres de las columnas o false in caso de un error.

Ejemplo completo
view plaincopy to clipboardprint? 1. <?php 2. /* 1. Conexin a la base de datos */ 3. 4. $dsn = 'mysql:dbname=noticias;host=127.0.0.1'; 5. $user = 'dbuser'; 6. $password = 'dbpass'; 7. try 8. { 9. $dbh = new PDO($dsn, $user, $password); 10. } 11. catch (PDOException $e) 12. { 13. echo 'Connection failed: ' . $e->getMessage(); 14. } 15. 16. /* Creacin la tabla noticias */ 17. 18. $dbh->query('CREATE TABLE IF NOT EXISTS `noticia` (

19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43.

`id` int(11) NOT NULL AUTO_INCREMENT, `titulo` varchar(50) NOT NULL, `texto` varchar(500) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2'); /* Insertando datos en la tabla noticias */ $dbh->query("INSERT INTO `noticia` (`titulo`, `texto`) VALUES ('PHP5 ', 'PHP5 y la POO.')"); /* 2. Enviar la instruccin SQL a la base de datos */ $resulset = $dbh->query('SELECT `titulo`,`texto` FROM `noticia` ORDER BY `titulo`'); /* 3. Obtener y procesar los resultados */ $noticia = $resulset->fetchObject(); echo $noticia->titulo; echo $noticia->texto; ?>

<?php<br /> /* 1. Conexin a la base de da $dsn = 'mysql:dbname=dbtest;h 'dbuser';<br /> $passw ord = 'db

Conclusin
PDO cumple con una premisa del diseo Orientado a Objetos: No dependas de implementaciones concretas, solo de implementaciones abstractas[1] PDO es una implementacin abstracta, un paso a mejorar el performance de nuestras aplicaciones con desarrollos ms portables y escalables.

Artculos relacionados
1. PDO (PHP Data Objects). Capa de Abstraccin de acceso a Bases de Datos utilizando el Patrn de diseo Singleton (Segunda parte)

Referencias Bibliogrficas

[1] Enrique Place, (mayo 25, 2006). Comentarios sobre: "Cual es la mejor capa de abstraccin?". Consultado el 1 de octubre del 2009.

Bibliografa
Colaboradores de Wikipedia. Capa de abstraccin [en lnea]. Wikipedia, La enciclopedia libre, 2009 [fecha de consulta: 17 de julio del 2009]. Disponible en <http://es.wikipedia.org/w/index.php?title=Capa_de_abstracci %C3%B3n&oldid=28148126>. 5 comentarios: m[cun] dijo... hola dos cosas: primero que me parecen excelentes tus artculos, y segundo que tiene un pequeo error en el script. en la linea n4 Connection failed: SQLSTATE[42000] [1049] Unknown database 'dbtest' $dsn = 'mysql:dbname=dbtest;host=127.0.0.1'; debe ser $dsn = 'mysql:$dbname=$dbtest;host=127.0.0.1'; asi funciona ;) gracias por todo 14 de octubre de 2010 23:52 Arley Triana Morn dijo... Hola m[cun]: Primero, gracias por tu comentario. Segundo, no estas en un error, como est el cdigo funciona perfectamente. El error que te est dando es que no conoce a una base de datos llamada 'dbtest'. Crea esta una base de datos llamada 'dbtest', sustituye en el dns y corre y el ejemplo. Saludos.

15 de octubre de 2010 08:43 Arley Triana Morn dijo... El problema es el cdigo anterior, es solo un ejemplo y normalmente en una aplicaron web real las bases de datos no se crean con php. Es decir primero normalmente diseamos nuestra base de datos con herramientas ms especializadas y despus la usamos con php o el lenguaje de programacin usado. El constructor de PDO uno de los parmetros es el dns, ejemplo: 'mysql:dbname=dbtest;host=127.0.0.1'; El contenido de la variable $dns del ejemplo que se le pasa como argumento al primer parmetro de la clase PDO, le dice al constructor que tiene que crear una instancia del driver de MySQL y conectarse a una base de datos llamada "dbtest" que esta en localhost. Al tu poner $dbtest en el string de configuracin del DNS, php lo interpreta como una variable de valor nulo y el script a continuacin lo que hace es conectarse al servidor MySQL solamente, no a una base de datos en concreto y no te da error. Para mayor claridad del script voy a eliminar la parte donde creo la base de datos noticias. 16 de octubre de 2010 19:42 m[cun] dijo... Muy buena tu explicacin, tan buena como tus artculos.... Gracias nuevamente 16 de octubre de 2010 23:37 Arley Triana Morn dijo... Saludos y suerte. 17 de octubre de 2010 13:49

Vous aimerez peut-être aussi