- 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. * * @author <a mailto="[email protected]">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. // 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 } /** * 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) { } } ?>
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. * * @author <a mailto="[email protected]">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. } 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. */ /** * Algunos host compartidos tienen un prefijo para sus bases de datos. */ /** * El nombre de la base de datos del sistema. */ /** * El nombre del usuario. */ /** * La clave del usuario. */ /** * 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. */ ?>