Clase PDO
PDO, escrita desde PHP 5.1 da un salto inmenso en el manejo de las bases de datos por PHP. Sencilla, elegante y poderosa capa de abstraccion de acceso a datos. La posibilidad de hacer uso de las mismas funciones para obtener y persistir datos no importa con quién estemos lidiando. Mysql, postgree, SQL server y más nunca había sido tán fácil como ahora, embebido en el lenguaje sin necesidad de librerías externas.
Orientada a objetos permite mediante una isntancia a la clase PDO acceder a todo un mundo de posibilidades. Soporta los siguientes controladores:
PDO_DBLIB: FreeTDS / Microsoft SQL Server / Sybase
PDO_FIREBIRD: Firebird / Interbase 6
PDO_IBM: IBM DB2
PDO_INFORMIX: IBM Informix Dynamic Server
PDO_SQLSRV: Microsoft SQL Server
PDO_MYSQL: MySQL 3.x/4.x/5.x
PDO_OCI: Oracle Call Interface
PDO_ODBC: ODBC v3 (IBM DB2, unixODBC y win32 ODBC)
PDO_PGSQL: PostgreSQL
PDO_SQLITE: SQLite 3 y SQLite 2.
Otra manera de conocer los controladores soportados por tu sistema es la siguiente print_r(PDO::getAvailableDrivers());
Como la usamos? sencillo. El objeto PDO debe ser instanciado, necesita solo los parámetros de conexión ya conocidos en cualquier librería de acceso a bases de datos.
Veamos un ejemplo de como crear una clase para conectarnos a nuestra base de datos utilizando PDO.
Clase conexion con PDO.
<?php
/**
* @author Mariano Z
* @copyright 2017
*/
class Conexion extends PDO {
private $tipo_de_base = 'mysql';
private $host = 'localhost';
private $nombre_de_base = 'mibasededatos';
private $usuario = 'root';
private $contrasena = '';
public function __construct() {
//Sobreescribo el método constructor de la clase PDO.
try{
parent::__construct($this->tipo_de_base.':host='.$this->host.';dbname='.$this->nombre_de_base, $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;
}
}
}
?>
Modelo Clase Usuario
La primera parte consta de la definicion de la clase con sus propiedades y atributo, Gets and Sets y el constructor de la clase __construct(). Incluimos el archivo donde esta definida la clase conexion con PDO utilizando require_once (requerido una vez), y al hacerlo ya tenemos acceso a el metodo que esta definido dentro.
Luego cree dos metodos uno para actualizar y otro para guardar, el funcionamiento es sencillo si hay un ID es por que el usuario existe y se actualiza por ejemplo: cambion de contraseña, nombre, mail apellido.. etc. En cambio si el id es null es por que se va a registrar entonces en un solo metodo podemos agrupar dos acciones.
<?php
require_once('conexion.php');
/**
*
*/
class Usuario
{
private $nombre;
private $apellido;
private $email;
private $clave;
private $id;
const TABLA = "usuarios";
function __construct($nombre, $apellido, $email, $clave, $id=null)
{
$this->nombre = $nombre;
$this->apellido = $apellido;
$this->email = $email;
$this->clave = $clave;
$this->id = $id;
}
public function getId() {
return $this->id;
}
public function getNombre()
{
return $this->nombre;
}
public function getApellido()
{
return $this->apellido;
}
public function getEmail()
{
return $this->email;
}
public function getClave()
{
return $this->clave;
}
public function setNombre($nombre)
{
$this->nombre =$nombre;
}
public function setEmail($email)
{
$this->email =$email;
}
public function setClave($clave)
{
$this->pass =$clave;
}
public function setApellido($apellido)
{
$this->apellido =$apellido;
}
public function guardar(){
$conexion = new Conexion();
if($this->id) /*Modifica*/ {
$consulta = $conexion->prepare('UPDATE ' . self::TABLA .' SET nombre = :nombre, apellido = :apellido WHERE id = :id');
$consulta->bindParam(':nombre', $this->nombre);
$consulta->bindParam(':apellido', $this->apellido);
$consulta->bindParam(':id', $this->id);
$consulta->execute();
}else /*Inserta*/ {
$consulta = $conexion->prepare('INSERT INTO ' . self::TABLA .' (nombre, apellido, email, clave) VALUES(:nombre, :apellido, :email, :clave)');
$consulta->bindParam(':nombre', $this->nombre);
$consulta->bindParam(':apellido', $this->apellido);
$consulta->bindParam(':email', $this->email);
$consulta->bindParam(':clave', $this->clave);
$consulta->execute();
$this->id = $conexion->lastInsertId();
}
$conexion = null;
}
}
?>
Controlador
Mi controlador es sencillo simplemente es para implementar la clase y crear el objeto siempre se puede mejorar mas, veran que solo incluyo la clase se puede usar requiere_once(); tambien. En esta parte recibo los datos del formulario creo el objeto y llamo al metodo guardar para registrar un nuevo usuario.
<?php
include('../clases/Usuario.php');
$nombre= $_POST['nombre'] ;
$apellido =$_POST['apellido'];
$email = $_POST['email'];
$clave =md5($_POST['pass']);
$id = null;
$Ousuario = new Usuario($nombre,$apellido,$email,$clave,$id);
$Ousuario->guardar();
echo $Ousuario->getNombre() . ' se ha guardado correctamente con el id: ' . $Ousuario->getId();
?>
Formulario HTML
Y por último dejo el codigo del formulario recuerden que esta para ser enlazado con Bootstrap CSS para que lograr un estilo visual mas amigable.
<!DOCTYPE html>
<html>
<head>
<!-- Aca deberia enlazar mi CSS de bootstrap -->
</head>
<body>
<div class="container">
<form class="form-horizontal" method="post" action="register">
<div class="form-group">
<label>Nombre</label>
<input type="text" name="nombre" class="form-control" required="" placeholder="Ingrese su nombre" />
</div>
<div class="form-group">
<label>Apellido</label>
<input type="text" name="apellido" class="form-control" required="" placeholder="Ingrese su apellido" />
</div>
<div class="form-group">
<label>Correo electronico</label>
<input type="email" name="email" class="form-control" required="" placeholder="Ingrese su email" />
</div>
<div class="form-group">
<label>Clave</label>
<input type="password" name="pass" class="form-control" required="" placeholder="Escriba una clave" />
</div>
<div class="form-group">
<label>Repita su clave</label>
<input type="password" name="repass" class="form-control" required="" placeholder="Repita su clave" />
</div>
<div class="form-group">
<button type="submit" class="btn btn-success">Registrarme</button>
</div>
</form>
</div>
</body>
</html>
Y la vista desde el navegador seria la siguiente:
Para visualizarlo mejor pueden visitar mi pagina web
PDO, escrita desde PHP 5.1 da un salto inmenso en el manejo de las bases de datos por PHP. Sencilla, elegante y poderosa capa de abstraccion de acceso a datos. La posibilidad de hacer uso de las mismas funciones para obtener y persistir datos no importa con quién estemos lidiando. Mysql, postgree, SQL server y más nunca había sido tán fácil como ahora, embebido en el lenguaje sin necesidad de librerías externas.
Orientada a objetos permite mediante una isntancia a la clase PDO acceder a todo un mundo de posibilidades. Soporta los siguientes controladores:
PDO_DBLIB: FreeTDS / Microsoft SQL Server / Sybase
PDO_FIREBIRD: Firebird / Interbase 6
PDO_IBM: IBM DB2
PDO_INFORMIX: IBM Informix Dynamic Server
PDO_SQLSRV: Microsoft SQL Server
PDO_MYSQL: MySQL 3.x/4.x/5.x
PDO_OCI: Oracle Call Interface
PDO_ODBC: ODBC v3 (IBM DB2, unixODBC y win32 ODBC)
PDO_PGSQL: PostgreSQL
PDO_SQLITE: SQLite 3 y SQLite 2.
Otra manera de conocer los controladores soportados por tu sistema es la siguiente print_r(PDO::getAvailableDrivers());
Como la usamos? sencillo. El objeto PDO debe ser instanciado, necesita solo los parámetros de conexión ya conocidos en cualquier librería de acceso a bases de datos.
Veamos un ejemplo de como crear una clase para conectarnos a nuestra base de datos utilizando PDO.
Clase conexion con PDO.
<?php
/**
* @author Mariano Z
* @copyright 2017
*/
class Conexion extends PDO {
private $tipo_de_base = 'mysql';
private $host = 'localhost';
private $nombre_de_base = 'mibasededatos';
private $usuario = 'root';
private $contrasena = '';
public function __construct() {
//Sobreescribo el método constructor de la clase PDO.
try{
parent::__construct($this->tipo_de_base.':host='.$this->host.';dbname='.$this->nombre_de_base, $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;
}
}
}
?>
Modelo Clase Usuario
La primera parte consta de la definicion de la clase con sus propiedades y atributo, Gets and Sets y el constructor de la clase __construct(). Incluimos el archivo donde esta definida la clase conexion con PDO utilizando require_once (requerido una vez), y al hacerlo ya tenemos acceso a el metodo que esta definido dentro.
Luego cree dos metodos uno para actualizar y otro para guardar, el funcionamiento es sencillo si hay un ID es por que el usuario existe y se actualiza por ejemplo: cambion de contraseña, nombre, mail apellido.. etc. En cambio si el id es null es por que se va a registrar entonces en un solo metodo podemos agrupar dos acciones.
<?php
require_once('conexion.php');
/**
*
*/
class Usuario
{
private $nombre;
private $apellido;
private $email;
private $clave;
private $id;
const TABLA = "usuarios";
function __construct($nombre, $apellido, $email, $clave, $id=null)
{
$this->nombre = $nombre;
$this->apellido = $apellido;
$this->email = $email;
$this->clave = $clave;
$this->id = $id;
}
public function getId() {
return $this->id;
}
public function getNombre()
{
return $this->nombre;
}
public function getApellido()
{
return $this->apellido;
}
public function getEmail()
{
return $this->email;
}
public function getClave()
{
return $this->clave;
}
public function setNombre($nombre)
{
$this->nombre =$nombre;
}
public function setEmail($email)
{
$this->email =$email;
}
public function setClave($clave)
{
$this->pass =$clave;
}
public function setApellido($apellido)
{
$this->apellido =$apellido;
}
public function guardar(){
$conexion = new Conexion();
if($this->id) /*Modifica*/ {
$consulta = $conexion->prepare('UPDATE ' . self::TABLA .' SET nombre = :nombre, apellido = :apellido WHERE id = :id');
$consulta->bindParam(':nombre', $this->nombre);
$consulta->bindParam(':apellido', $this->apellido);
$consulta->bindParam(':id', $this->id);
$consulta->execute();
}else /*Inserta*/ {
$consulta = $conexion->prepare('INSERT INTO ' . self::TABLA .' (nombre, apellido, email, clave) VALUES(:nombre, :apellido, :email, :clave)');
$consulta->bindParam(':nombre', $this->nombre);
$consulta->bindParam(':apellido', $this->apellido);
$consulta->bindParam(':email', $this->email);
$consulta->bindParam(':clave', $this->clave);
$consulta->execute();
$this->id = $conexion->lastInsertId();
}
$conexion = null;
}
}
?>
Controlador
Mi controlador es sencillo simplemente es para implementar la clase y crear el objeto siempre se puede mejorar mas, veran que solo incluyo la clase se puede usar requiere_once(); tambien. En esta parte recibo los datos del formulario creo el objeto y llamo al metodo guardar para registrar un nuevo usuario.
<?php
include('../clases/Usuario.php');
$nombre= $_POST['nombre'] ;
$apellido =$_POST['apellido'];
$email = $_POST['email'];
$clave =md5($_POST['pass']);
$id = null;
$Ousuario = new Usuario($nombre,$apellido,$email,$clave,$id);
$Ousuario->guardar();
echo $Ousuario->getNombre() . ' se ha guardado correctamente con el id: ' . $Ousuario->getId();
?>
Formulario HTML
Y por último dejo el codigo del formulario recuerden que esta para ser enlazado con Bootstrap CSS para que lograr un estilo visual mas amigable.
<!DOCTYPE html>
<html>
<head>
<!-- Aca deberia enlazar mi CSS de bootstrap -->
</head>
<body>
<div class="container">
<form class="form-horizontal" method="post" action="register">
<div class="form-group">
<label>Nombre</label>
<input type="text" name="nombre" class="form-control" required="" placeholder="Ingrese su nombre" />
</div>
<div class="form-group">
<label>Apellido</label>
<input type="text" name="apellido" class="form-control" required="" placeholder="Ingrese su apellido" />
</div>
<div class="form-group">
<label>Correo electronico</label>
<input type="email" name="email" class="form-control" required="" placeholder="Ingrese su email" />
</div>
<div class="form-group">
<label>Clave</label>
<input type="password" name="pass" class="form-control" required="" placeholder="Escriba una clave" />
</div>
<div class="form-group">
<label>Repita su clave</label>
<input type="password" name="repass" class="form-control" required="" placeholder="Repita su clave" />
</div>
<div class="form-group">
<button type="submit" class="btn btn-success">Registrarme</button>
</div>
</form>
</div>
</body>
</html>
Y la vista desde el navegador seria la siguiente:
Para visualizarlo mejor pueden visitar mi pagina web