Blog de Gonzalo

PDO

La extensión pdo es una capa de abastracció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 bases 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:

  • Tipo de base de datos, como MySQL, Oracle, PostgreSQL, etc..
  • El servidor (host)
  • El nombre de la base de datos con la que nos vamos a conectar
  • El nombre de usuario
  • La contraseña
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.

    Compartir en twitter