PHP » Clase para interactuar con bases de datos (cualquiera)

Hola gente, en forosdelweb.com postie ayer una clase para poder interactuar con la base de datos, la comparto también aquí.

características:

Forma de uso (ejemplo)

Un formulario que permite recuperar información a través del correo y la contraseña.

 

<?php
// incluir archivos
include_once 'alguna_ruta/BD.php';
include_once 'alguna_ruta/configuracion.php';
 
// Instancer la clase
$bd = new BD();
 
// Hacer una consulta
$resp = $bd->preparar('SELECT nombre, ciudad, genero
    FROM usuarios
    WHERE (correo = ?) AND (clave = ?)');
 
// Ejecutar la consulta
$resp->ejecutar($_POST['correo'], $_POST['clave']);
 
// Recoje la información en forma de matriz.
$info = $resp->getMatriz();
 
// Usar la información de alguna forma.
foreach ($info as $fila) {
    echo '<h2>Tus datos</h2> <ul>';
    echo '<li> nombre: ', $fila['nombre'], '</li>';
    echo '<li> ciudad: ', $fila['ciudad'], '</li>';
    echo '<li> genero: ', $fila['genero'], '</li>';
    echo '</ul>';
}
?>
<html>
    <head>
        <title>Test</title>
    </head>
    <body>
        <form action="test.php" method="post">
            <label for="correo">Correo: </label>
            <input type="text" name="correo" id="correo" />
            <label for="clave">Clave: </label>
            <input type="password" name="clave" id="clave"/>
            <input type="submit" value="OK" />
        </form>
    </body>
</html>

Clase Principal

Esta clase contiene el constructor que permite hacer el "new BD()"

Guardarlo en un alguna carpeta dentro del proyecto.

 

<?php
 
/**
 * Este proyecto esta bajo la licencia
 * Creative Commons Atribucion-NoComercial-LicenciarIgual 3.0
 * ver http://creativecommons.org/licenses/by-nc-sa/3.0/deed.es
 */
 
// Importar la clase BdSentencia.
include 'BdSentencia.php';
 
/**
 * BD es una capa de abstracción para usar bases de datos de manera más cómoda.
 * Utiliza PDO.
 *
 * @author <a mailto="rodrigo.gonzlez@gmail.com">Rodrigo González</a>
 */
class BD extends PDO {
 
    /**
     * El constructor.
     * @param <string> $nombre el nombre de la base de datos, en el caso de que
     * esté vacío toma el valor del archivo de configuración (configuracion.php)
     * correspondiente a BD_PRINCIPAL_NOM.
     */
    public function BD($nombre = BD_PRINCIPAL_NOM) {
 
        // (Data Source Name)
        $dsn = BD_MOTOR . ':host=' . BD_HOST . ';dbname=' . BD_PREFIJO_NOM . $nombre;
 
        // Instancear la conexión con la base de datos.
        parent::__construct($dsn, BD_USUARIO_NOM, BD_USUARIO_CLAVE);
 
        // Asigna la clase BdSentencia para crear los objetos que representen
        // sentencias y que heredan de PDOStatement.
        parent::setAttribute(PDO::ATTR_STATEMENT_CLASS, array('BdSentencia', array($this)));
 
        // Hace que se lancen errores, en caso de que se produzcan.
        parent::setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 
        // Cambiar el juego de caracteres de la conexión a UTF-8, no se
        // hace a través de MYSQL_ATTR_INIT_COMMAND por un bug en PHP 3.0 y 3.1
        parent::exec('SET NAMES \'utf8\'');
 
    }
 
    /**
     * Prepara una sentencia SQL para ser ejecutada posteriormente, puede aceptar
     * parametros ? que se reemplazarán con la función enlazarParametro.
     * @param <string> $sql una sentencia SQL.
     */
    public function preparar($sql) {
        return parent::prepare($sql);
    }
 
    /**
     * Envía una consulta no preparada a la base de datos. Equivale a la
     * función query.
     * @param string $sql la consulta SQL.
     * @return <BdSentencia> el objeto que representa la respuesta.
     */
    public function consultar($sql) {
        return parent::query($sql);
    }
 
    /**
     * Ejecuta una sentencia SQL. No se use para SELECT, para tales casos
     * está consultar, o preparar, para preparar sentencias.
     * @param <string> $sql la sentencia SQL.
     * @return <int> el numero de filas afectadas por esta acción.
     */
    public function ejecutarRapido($sql) {
        return parent::exec($sql);
    }
 
}
 
?>

Clase "Interna"

Esta clase representa la sentencia preparada SQL.

Guardarla en la misma carpeta que la clase principal.

 

 

<?php
 
/**
 * Este proyecto esta bajo la licencia
 * Creative Commons Atribucion-NoComercial-LicenciarIgual 3.0
 * ver http://creativecommons.org/licenses/by-nc-sa/3.0/deed.es
 */
 
/**
 * Representa una sentencia preparada según la clase BD.
 *
 * @author <a mailto="rodrigo.gonzlez@gmail.com">Rodrigo González</a>
 */
class BdSentencia extends PDOStatement {
 
    /**
     * Una referencia al objeto BD.
     * @var <BD> la base de datos.
     */
    private $pdo;
 
    /**
     * Constructor.
     * @param <BD> $pdo una referencia a la base de datos.
     */
    protected function BdSentencia($pdo) {
        $this->pdo = $pdo;
    }
 
    /**
     * Ejecuta una sentencia preparada, si se le pasan argumentos entonces estos
     * se reemplazan en los '?' de la sentencia preparada en el mismo orden.
     * @param <string [,string[,...]]> los argumentos a reemplazar.
     * @return <bool> true si la acción fue exitosa, false caso contrario.
     */
    public function ejecutar() {
        // Si hay argumentos entonces pasarselos como array al método nativo
        // execute.
        if (func_num_args() > 0) {
            return parent::execute(func_get_args());
        }
        return parent::execute();
    }
 
    /**
     *
     * @return <string[]> una matriz que representa la tabla consultada en la
     * base de datos.
     */
    public function getMatriz() {
        return parent::fetchAll(PDO::FETCH_ASSOC);
    }
 
    /**
     *
     * @return <object[]> un vector de objetos en donde cada posición es un
     * objeto que representa una fila de la tabla (producto de la consuta a la
     * base de datos), y cada atributo de los objetos son los correspondientes a
     * las columnas de dicha tabla.
     */
    public function getObjetos() {
        return parent::fetchObject();
    }
 
    /**
     *
     * @return <int> el número de filas de la consulta.
     */
    public function contarFilas() {
        return parent::rowCount();
    }
 
}
 
?>

Archivo de configuración

Contiene constantes sobre el entorno de la base de datos. Ponerla en cualquier parte y llamarla junto con la clase principal en un include.

<?php
 
/**
 * Este proyecto esta bajo la licencia
 * Creative Commons Atribucion-NoComercial-LicenciarIgual 3.0
 * ver http://creativecommons.org/licenses/by-nc-sa/3.0/deed.es
 */
 
 
// Datos para la base de datos.
 
/**
 * El motor de la base de datos, puede ser
 * 'mysql', 'postgresql', 'orale', etc.
 */
define('BD_MOTOR', 'mysql');
 
/**
 * El host.
 */
define('BD_HOST', 'localhost');
 
/**
 * Algunos host compartidos tienen un prefijo para sus bases de datos.
 */
define('BD_PREFIJO_NOM', '');
 
/**
 * El nombre de la base de datos del sistema.
 */
define('BD_PRINCIPAL_NOM', 'sistema');
 
/**
 * El nombre del usuario.
 */
define('BD_USUARIO_NOM', 'admin');
 
/**
 * La clave del usuario.
 */
define('BD_USUARIO_CLAVE', 'macoy123');
 
/**
 * Texto que se agrega a los hash para aumentar su seguridad.
 * En el caso de que se transporte el sistema y se use el instalador, es
 * necesario copiar este valor, de otro modo las contraseñas no funcionarán.
 */
define('HASH_SALT', 'd+ñsdop'); // Aún no implementado.
 
?>

Eso. Porfavor, comenten cualquier duda o sugerencia para poder mejorarla.

Saludos

roro89

Publicado el 12 de Enero del 2011 por roro89

2739 visitas, 2 mensajes y 2 ediciones

Mensajes

roro89 roro89 el 12 de Enero del 2011: 0

Nota: Esta pensada para una tabla en utf-8. Es decir, no hay problemas con letras chinas ni nada.

Diego Escares Diego Escares el 19 de Enero del 2011: 0

Aún no pruebo tu código :(
algún día será! :D

¡Amigo! te demorarás 10 segundos en crear tu cuenta.

Disfrutarás de todos los beneficios de DocumentoWeb.

Twitter Twitter Facebook Facebook Feed RSS Feed RSS

www.DocumentoWeb.com Licencia Creative Commons