Blog de Gonzalo

Blog de programación de Gonzalo López

PDO

PHP

La extensión pdo, php Data Objects (Objetos de Datos de php), es una capa de abstracción que permite conectar con diferentes bases de datos usando las mismas funciones facilitando su portabilidad. Pero hay que tener cuidado ya que el sql de cada base de datos puede variar.
PDO está muy bien si vamos a realizar un proyecto que van a usar varios clientes y cada cliente tiene una base de datos diferente o por ejemplo, se usa en los diferentes frameworks/ disponibles.
Para cada base de datos existe un driver específico, que debe estar habilitado en el archivo de configuración php.ini. Cada base de datos tiene su fichero pdo por ejemoplo MySQL es php_pdo_mysql, Oracle es php_pdo_oci.
Para conectarnos a nuestra base de datos se necesitan 5 datos:

Ejemplo sencillo:

 $conn = new PDO('mysql:host=localhost;dbname=pruebas', 'root', '');
//Donde tenemos el tipo de base de datos, el servidor, el nombre de la base de datos, el usuario y la contraseña.
// Si tenéis un proyecto con MySQL y por una razón u otra tenéis que cambiar a Oracle la conexión seria:
$conn = new PDO('oracle:host=localhost;dbname=pruebas', 'root', '');
//Las consultas se realizan de la siguiente manera:
$consulta = "SELECT COUNT(*) FROM usuarios WHERE nombre=:nombre AND apellidos=:apellidos";
$result = $conn->prepare($consulta);
$result->execute(array(":nombre" => $nombre, ":apellidos" => $apellidos));

La función prepare() se utiliza para evitar la
inyección de SQL.
Si no hace falta preparar la consulta basta con $conn->query($consulta);
Ahora os voy a comentar como se hace cuando se recuperan datos:
  • Cuando solo se devuelve un dato: "$result = $conn->fetch();" con las siguientes opciones:
    • PDO::FETCH_ASSOC: Devuelve un array indexado por los nombres de las columnas del conjunto de resultados.
    • PDO::FETCH_BOTH (predeterminado): Devuelve un array indexado tanto por nombre de columna, como numéricamente con índice de base 0 tal como fue devuelto en el conjunto de resultados.
    • PDO::FETCH_BOUND: Devuelve TRUE y asigna los valores de las columnas del conjunto de resultados a las variables de PHP a las que fueron vinculadas con el método PDOStatement::bindColumn().
    • DO::FETCH_CLASS: Devuelve una nueva instancia de la clase solicitada, haciendo corresponder las columnas del conjunto de resultados con los nombres de las propiedades de la clase.
    • PDO::FETCH_INTO: Actualiza una instancia existente de la clase solicitada, haciendo coincidir el nombre de las columnas con los nombres de las propiedades de la clase.
    • PDO::FETCH_LAZY: Combina PDO::FETCH_BOTH y PDO::FETCH_OBJ, creando los nombres de la variables del objeto tal como se accedieron.
    • PDO::FETCH_NAMED: Devuelve un array con la misma forma que PDO::FETCH_ASSOC, excepto que si hubiera múltiples columnas con el mismo nombre, el valor al que hace referencia dicha clave será un array con todos los valores de la fila de tuviera ese nombre de columna.
    • PDO::FETCH_NUM: Devuelve un array indexado por el número de columna tal como fue devuelto en el conjunto de resultados, comenzando por la columna 0.
    • PDO::FETCH_OBJ: Devuelve un objeto anónimo con nombres de propiedades que se corresponden a los nombres de las columnas devueltas en el conjunto de resultados.
  • Cuando se lanza una query con varios resultados se usa la función $result = $sth->fetchAll(); con las siguientes opciones:
    • PDO::FETCH_ASSOC: devuelve un array indexado por los nombres de las columnas del conjunto de resultados.
    • PDO::FETCH_COLUMN: Devuelve la columna con el índice indicado basado en 0.
    • PDO::FETCH_CLASS: Devuelve instancias de la clase especificada, haciendo corresponder las columnas de cada fila con las propiedades con nombre de la clase.
    • PDO::FETCH_FUNC: Devuelve el resultado de llamar a la función especificada, usando cada columna de fila como parámetro de la llamada.
Para conectar con diferentes bases de datos no solo hace falta tener activa la extensión pdo en php sino la extensión pdo de cada base de datos:
  • pdo_firebird controlador para el acceso desde php a bases de datos de Firebird.
  • pdo_mysql controlador para el acceso desde php a bases de datos de MySQL.
  • pdo_oci controlador para el acceso desde php a bases de datos de Oracle.
  • pdo_odbc controlador para el acceso desde php a bases de datos de ODBC o de DB2
  • pdo_pgsql controlador para el acceso desde php a bases de datos de PostgreSQL.
  • pdo_sqlite controlador para el acceso desde php a bases de datos de SQlite.
Sino se tienen activas no se podrá conectar mediente pdo a dichas bases de datos.

Compartir en twitter