Foros del Web » Programando para Internet » PHP »

PHP OO [Aporte] Clase de base de datos (para MySQL, PostgreSQL, etc)

Estas en el tema de [Aporte] Clase de base de datos (para MySQL, PostgreSQL, etc) en el foro de PHP en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 12/01/2011, 02:46
 
Fecha de Ingreso: diciembre-2009
Ubicación: dirname(__FILE__)
Mensajes: 149
Antigüedad: 13 años
Puntos: 11
[Aporte] Clase de base de datos (para MySQL, PostgreSQL, etc)

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
  1. <?php
  2. // incluir archivos
  3. include_once 'alguna_ruta/BD.php';
  4. include_once 'alguna_ruta/configuracion.php';
  5.  
  6. // Instancer la clase
  7. $bd = new BD();
  8.  
  9. // Hacer una consulta
  10. $resp = $bd->preparar('SELECT nombre, ciudad, genero
  11.    FROM usuarios
  12.    WHERE (correo = ?) AND (clave = ?)');
  13.  
  14. // Ejecutar la consulta
  15. $resp->ejecutar($_POST['correo'], $_POST['clave']);
  16.  
  17. // Recoje la información en forma de matriz.
  18. $info = $resp->getMatriz();
  19.  
  20. // Usar la información de alguna forma.
  21. foreach ($info as $fila) {
  22.     echo '<h2>Tus datos</h2> <ul>';
  23.     echo '<li> nombre: ', $fila['nombre'], '</li>';
  24.     echo '<li> ciudad: ', $fila['ciudad'], '</li>';
  25.     echo '<li> genero: ', $fila['genero'], '</li>';
  26.     echo '</ul>';
  27. }
  28. ?>
  29. <html>
  30.     <head>
  31.         <title>Test</title>
  32.     </head>
  33.     <body>
  34.         <form action="test.php" method="post">
  35.             <label for="correo">Correo: </label>
  36.             <input type="text" name="correo" id="correo" />
  37.             <label for="clave">Clave: </label>
  38.             <input type="password" name="clave" id="clave"/>
  39.             <input type="submit" value="OK" />
  40.         </form>
  41.     </body>
  42. </html>

==============================
Clase principal

Código PHP:
Ver original
  1. <?php
  2.  
  3. /**
  4.  * Este proyecto esta bajo la licencia
  5.  * Creative Commons Atribucion-NoComercial-LicenciarIgual 3.0
  6.  * ver http://creativecommons.org/licenses/by-nc-sa/3.0/deed.es
  7.  */
  8.  
  9. // Importar la clase BdSentencia.
  10. include 'BdSentencia.php';
  11.  
  12. /**
  13.  * BD es una capa de abstracción para usar bases de datos de manera más cómoda.
  14.  * Utiliza PDO.
  15.  *
  16.  * @author <a mailto="[email protected]">Rodrigo González</a>
  17.  */
  18. class BD extends PDO {
  19.  
  20.     /**
  21.      * El constructor.
  22.      * @param <string> $nombre el nombre de la base de datos, en el caso de que
  23.      * esté vacío toma el valor del archivo de configuración (configuracion.php)
  24.      * correspondiente a BD_PRINCIPAL_NOM.
  25.      */
  26.     public function BD($nombre = BD_PRINCIPAL_NOM) {
  27.  
  28.         // (Data Source Name)
  29.         $dsn = BD_MOTOR . ':host=' . BD_HOST . ';dbname=' . BD_PREFIJO_NOM . $nombre;
  30.  
  31.         // Instancear la conexión con la base de datos.
  32.         parent::__construct($dsn, BD_USUARIO_NOM, BD_USUARIO_CLAVE);
  33.  
  34.         // Asigna la clase BdSentencia para crear los objetos que representen
  35.         // sentencias y que heredan de PDOStatement.
  36.         parent::setAttribute(PDO::ATTR_STATEMENT_CLASS, array('BdSentencia', array($this)));
  37.  
  38.         // Hace que se lancen errores, en caso de que se produzcan.
  39.         parent::setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  40.  
  41.         // Cambiar el juego de caracteres de la conexión a UTF-8, no se
  42.         // hace a través de MYSQL_ATTR_INIT_COMMAND por un bug en PHP 3.0 y 3.1
  43.         parent::exec('SET NAMES \'utf8\'');
  44.  
  45.     }
  46.  
  47.     /**
  48.      * Prepara una sentencia SQL para ser ejecutada posteriormente, puede aceptar
  49.      * parametros ? que se reemplazarán con la función enlazarParametro.
  50.      * @param <string> $sql una sentencia SQL.
  51.      */
  52.     public function preparar($sql) {
  53.         return parent::prepare($sql);
  54.     }
  55.  
  56.     /**
  57.      * Envía una consulta no preparada a la base de datos. Equivale a la
  58.      * función query.
  59.      * @param string $sql la consulta SQL.
  60.      * @return <BdSentencia> el objeto que representa la respuesta.
  61.      */
  62.     public function consultar($sql) {
  63.         return parent::query($sql);
  64.     }
  65.  
  66.     /**
  67.      * Ejecuta una sentencia SQL. No se use para SELECT, para tales casos
  68.      * está consultar, o preparar, para preparar sentencias.
  69.      * @param <string> $sql la sentencia SQL.
  70.      * @return <int> el numero de filas afectadas por esta acción.
  71.      */
  72.     public function ejecutarRapido($sql) {
  73.         return parent::exec($sql);
  74.     }
  75.  
  76. }
  77.  
  78. ?>

Clase "interna" que representa a la sentencia preparada.
Código PHP:
Ver original
  1. <?php
  2.  
  3. /**
  4.  * Este proyecto esta bajo la licencia
  5.  * Creative Commons Atribucion-NoComercial-LicenciarIgual 3.0
  6.  * ver http://creativecommons.org/licenses/by-nc-sa/3.0/deed.es
  7.  */
  8.  
  9. /**
  10.  * Representa una sentencia preparada según la clase BD.
  11.  *
  12.  * @author <a mailto="[email protected]">Rodrigo González</a>
  13.  */
  14. class BdSentencia extends PDOStatement {
  15.  
  16.     /**
  17.      * Una referencia al objeto BD.
  18.      * @var <BD> la base de datos.
  19.      */
  20.     private $pdo;
  21.  
  22.     /**
  23.      * Constructor.
  24.      * @param <BD> $pdo una referencia a la base de datos.
  25.      */
  26.     protected function BdSentencia($pdo) {
  27.         $this->pdo = $pdo;
  28.     }
  29.  
  30.     /**
  31.      * Ejecuta una sentencia preparada, si se le pasan argumentos entonces estos
  32.      * se reemplazan en los '?' de la sentencia preparada en el mismo orden.
  33.      * @param <string [,string[,...]]> los argumentos a reemplazar.
  34.      * @return <bool> true si la acción fue exitosa, false caso contrario.
  35.      */
  36.     public function ejecutar() {
  37.         // Si hay argumentos entonces pasarselos como array al método nativo
  38.         // execute.
  39.         if (func_num_args() > 0) {
  40.             return parent::execute(func_get_args());
  41.         }
  42.         return parent::execute();
  43.     }
  44.  
  45.     /**
  46.      *
  47.      * @return <string[]> una matriz que representa la tabla consultada en la
  48.      * base de datos.
  49.      */
  50.     public function getMatriz() {
  51.         return parent::fetchAll(PDO::FETCH_ASSOC);
  52.     }
  53.  
  54.     /**
  55.      *
  56.      * @return <object[]> un vector de objetos en donde cada posición es un
  57.      * objeto que representa una fila de la tabla (producto de la consuta a la
  58.      * base de datos), y cada atributo de los objetos son los correspondientes a
  59.      * las columnas de dicha tabla.
  60.      */
  61.     public function getObjetos() {
  62.         return parent::fetchObject();
  63.     }
  64.  
  65.     /**
  66.      *
  67.      * @return <int> el número de filas de la consulta.
  68.      */
  69.     public function contarFilas() {
  70.         return parent::rowCount();
  71.     }
  72.  
  73. }
  74.  
  75. ?>




Archivo de configuración
Código PHP:
Ver original
  1. <?php
  2.  
  3. /**
  4.  * Este proyecto esta bajo la licencia
  5.  * Creative Commons Atribucion-NoComercial-LicenciarIgual 3.0
  6.  * ver http://creativecommons.org/licenses/by-nc-sa/3.0/deed.es
  7.  */
  8.  
  9.  
  10. // Datos para la base de datos.
  11.  
  12. /**
  13.  * El motor de la base de datos, puede ser
  14.  * 'mysql', 'postgresql', 'orale', etc.
  15.  */
  16. define('BD_MOTOR', 'mysql');
  17.  
  18. /**
  19.  * El host.
  20.  */
  21. define('BD_HOST', 'localhost');
  22.  
  23. /**
  24.  * Algunos host compartidos tienen un prefijo para sus bases de datos.
  25.  */
  26. define('BD_PREFIJO_NOM', '');
  27.  
  28. /**
  29.  * El nombre de la base de datos del sistema.
  30.  */
  31. define('BD_PRINCIPAL_NOM', 'sistema');
  32.  
  33. /**
  34.  * El nombre del usuario.
  35.  */
  36. define('BD_USUARIO_NOM', 'admin');
  37.  
  38. /**
  39.  * La clave del usuario.
  40.  */
  41. define('BD_USUARIO_CLAVE', 'macoy123');
  42.  
  43. /**
  44.  * Texto que se agrega a los hash para aumentar su seguridad.
  45.  * En el caso de que se transporte el sistema y se use el instalador, es
  46.  * necesario copiar este valor, de otro modo las contraseñas no funcionarán.
  47.  */
  48. define('HASH_SALT', 'd+ñsdop'); // Aún no implementado.
  49.  
  50. ?>

Última edición por RodrigoG; 12/01/2011 a las 02:48 Razón: agregar PHP OO
  #2 (permalink)  
Antiguo 23/03/2012, 19:17
 
Fecha de Ingreso: marzo-2012
Mensajes: 1
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: [Aporte] Clase de base de datos (para MySQL, PostgreSQL, etc)

Probado y Funcionando con MySQL, falta probar en Oracle, SQL Server y Postgres... Una duda, como podría hacerse que si se genera un error en el Query, por ejemplo un nombre de columna que no existe, o una llave duplicada este error se muestre, hice la prueba y simplemente se para la ejecución del script y se reporta el error al log de apache, pero sería muy util mostrarlo en pantalla.
Un Saludo!
  #3 (permalink)  
Antiguo 09/09/2012, 14:02
 
Fecha de Ingreso: julio-2011
Ubicación: cucuta
Mensajes: 26
Antigüedad: 11 años, 5 meses
Puntos: 0
Pregunta Respuesta: [Aporte] Clase de base de datos (para MySQL, PostgreSQL, etc)

me genera error



lo unico q hice fue cambiar el nombre de la base de datos y los campos

Etiquetas: clase, mysql, postgresql, aportes
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 2 personas




La zona horaria es GMT -6. Ahora son las 14:58.