Características:
- Anti SQL Injection
- Soporta MySQL, PostgreSQL, Oracle y cualquier otra que el driver PDO soporte.
Ustedes me han ayudado mucho así que hago este aporte, aprovecho de solicitar críticas, para poder mejorarla.
Ejemplo de forma de uso:
Código PHP:
Ver original<?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
Código PHP:
Ver original<?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.
*
*/
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" que representa a la sentencia preparada.
Código PHP:
Ver original<?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.
*
*/
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.
}
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
Código PHP:
Ver original<?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.
*/
/**
* El host.
*/
define('BD_HOST', 'localhost');
/**
* Algunos host compartidos tienen un prefijo para sus bases de datos.
*/
/**
* 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.
?>