Php orientado a objetos, parte 10: PDO, Conectarse a una base de datos

Un tema muy importante que aun no he tocado en estos posteos son las conexiones y consultas a una base de datos. Me he reservado este posteo para explicar cómo conectarse a una base de datos mediante PDO, una clase de PHP que permite crear objetos de conexión a una base de datos.

Para empezar crearemos una base de datos llamada ‘batman’, yo la crearé con código pero ustedes pueden hacerlo como quieran:

CREATE DATABASE batman;

Ahora que ya tenemos nuestra base de datos podemos comenzar intentando conectar PHP con la misma mediante un objeto PDO. Para ello necesitaremos 5 datos: El nombre de la base de datos con la que nos vamos a conectar, el servidor, el nombre de usuario y su contraseña. Pero también debemos indicar a qué tipo de base de datos nos conectaremos, en mi caso mysql, aunque también podría ser otra como por ejemplo oracle. Probemos conectarnos de esta forma:

<?php
 $pdo = new PDO('mysql:host=localhost;dbname=batman', 'root', '');
?>

Por empezar, la clase PDO no necesita ser incluida, la misma está disponible desde la versión 5 de PHP y existe en memoria. Al crear el objeto necesitará tres parámetros.

El primer parámetro será una cadena donde tendré que ingresar el tipo de base de datos, mysql por ejemplo; el host o servidor, acá será localhost o 127.0.0.1 y el nombre de la base de datos, en este caso ‘batman’. También puede agregarse el puerto, separado por punto y coma.

El segundo parámetro es el nombre del usuario y el tercero la contraseña. En mi caso el nombre de usuario es ‘root’ y la contraseña es una cadena vacía.

Existe un cuarto parámetro no obligatorio que es un array con opciones para la conexión, pero en este posteo lo omitiré.

Bueno, ahora siguiendo con el código, voy a aclarar algo que está faltando. Como dije en el posteo anterior, Php orientado a objetos, parte 9: Excepciones, hay ocasiones en que nuestro código puede lanzar errores aunque el código esté correcto. Por ejemplo, nosotros subimos nuestro sitio a un hosting y de pronto la base de datos deja de funcionar, algún dato cambia de nombre, etcétera. Para solucionar este problema usaremos la sentencia try catch, y de esta manera tendremos un control por si nuestro script pudiese tener problemas al conectarse con la base de datos:

<?php
 try{
    $pdo = new PDO('mysql:host=localhost;dbname=batman', 'root', '');
 }catch(PDOException $e){
    echo 'Error al conectarse con la base de datos: ' . $e->getMessage();
    exit;
 }
?>

Para probar el error pueden por ejemplo cambiar algún dato, como en el nombre de la base de datos poniendo un nombre que no existe, o apagar la base de datos y comprobarlo.

Ahora que ya sabemos cómo usar la clase PDO para conectarse a una base podríamos crear una clase propia que herede todos los métodos de la misma, pero que incluya dentro los datos necesarios para conectarse. De esta manera no tendríamos que ingresar todos los datos cada vez que en nuestro proyecto quisiéramos conectarnos a la base de datos. Creemos una clase llamada Conexion:

<?php 
 class Conexion extends PDO { 
   private $tipo_de_base = 'mysql';
   private $host = 'localhost';
   private $nombre_de_base = 'batman';
   private $usuario = 'root';
   private $contrasena = ''; 
   public function __construct() {
      //Sobreescribo el método constructor de la clase PDO.
      try{
         parent::__construct("{$this->tipo_de_base}:dbname={$this->nombre_de_base};host={$this->host};charset=utf8", $this->usuario, $this->contrasena);
      }catch(PDOException $e){
         echo 'Ha surgido un error y no se puede conectar a la base de datos. Detalle: ' . $e->getMessage();
         exit;
      }
   } 
 } 
?>

Cómo ven la clase es muy corta, hereda de PDO, y sobrescribe el constructor padre ingresando los datos para conectarse que están guardados en propiedades.

Entonces nosotros podemos conectarnos con:

<?php
 require_once 'clases/Conexion.php';
 $conexion = new Conexion();
?>

Ok, hasta acá todo. El próximo post publicaré cómo realizar consultas a una base de datos mediante métodos de la clase PDO.

Chau Chau Chau!

Anterior: Php orientado a objetos, parte 9: Excepciones

Siguiente: Php orientado a objetos, parte 11: PDO, Guardar registros en una base de datos


17 Respuestas a “Php orientado a objetos, parte 10: PDO, Conectarse a una base de datos”

  1. Amigo, si aun estas por ahí, como sería las funciones si fuera con postgres? cambia mucho?

    1. Para el que lo necesite!
      funciona para postgres perfecto, solo es cambiar
      private $tipo_de_base = ‘mysql’;
      por
      private $tipo_de_base = ‘pgsql’;

      Falta hacer que me funcionen las consultas 😀
      Siguiente capitulo!

  2. Buenas Noches quisiera saber como se haria para insertar en una base de datos de postgresql con lenguaje php orientado a objetos y el pdo, espero pronta repsuesta

    1. Así te conectás:

      $dbh = new PDO(«pgsql:dbname=$dbname;host=$host», $username, $password );

      Y después las consultas serían igual que como se hacen en esta publicación, pero con código postgree.

      Perdón, pero yo nunca trabajé con ese tipo de base de datos.

  3. hola, he tratado de hacer con cuidado tu consejo, sobre como conectarse a la DB, sin embargo al tratar de conectarme, me tira estos errores.
    Notice: Undefined property: ConexionController::$mysql in C:\AppServ\www\pacifico\default\app\controllers\conexion_controller.php on line 12

    Notice: Undefined property: ConexionController::$localhost in C:\AppServ\www\pacifico\default\app\controllers\conexion_controller.php on line 12

    Notice: Undefined property: ConexionController::$pacifico in C:\AppServ\www\pacifico\default\app\controllers\conexion_controller.php on line 12

    Notice: Undefined property: ConexionController::$root in C:\AppServ\www\pacifico\default\app\controllers\conexion_controller.php on line 12

    Notice: Undefined property: ConexionController::$culichi in C:\AppServ\www\pacifico\default\app\controllers\conexion_controller.php on line 12
    Ha surgido un error y no se puede conectar a la base de datos. Detalle: could not find driver….
    de antemo muchas gracias por tu apoyo…

  4. Hola mi amigo hay alguna forma de incluir en el constructor el metodo setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    para que no lo utilize fuera de la clase?

  5. Hola, necesito conectar 3 pc con una base de datos, 1era pc con PostgreSQL, 2da con MySQL y la 3era appserver u otro.
    Me podrian ayudar? Se los agradecería mucho

  6. Hola amigo, varios años despues, espero que lo veas, puedo conectarme con PDO a una base de datos sql server? Me podes dar una mano porque estoy trabado con eso.