<p>Hola gente, en <a title="Ir a foros del web" href="http://www.forosdelweb.com/f18/aporte-clase-base-datos-para-mysql-postgresql-etc-875844/" target="_self">forosdelweb.com</a> postie ayer una clase para poder interactuar con la base de datos, la comparto también aquí.</p> <h3>características:</h3> <ul> <li>Impide la <a href="http://es.wikipedia.org/wiki/Inyecci%C3%B3n_SQL" target="_self">inyección SQL</a></li> <li>Funciona para MySQL, Oracle, PostgreSQL, SQLite, Microsoft SQL Server, etc...</li> </ul> <h2>Forma de uso (ejemplo)</h2> <p>Un formulario que permite recuperar información a través del correo y la contraseña.</p> <p> </p> <pre><?php<br />// incluir archivos<br />include_once 'alguna_ruta/BD.php';<br />include_once 'alguna_ruta/configuracion.php';<br /> <br />// Instancer la clase<br />$bd = new BD();<br /> <br />// Hacer una consulta<br />$resp = $bd->preparar('SELECT nombre, ciudad, genero<br /> FROM usuarios<br /> WHERE (correo = ?) AND (clave = ?)');<br /> <br />// Ejecutar la consulta<br />$resp->ejecutar($_POST['correo'], $_POST['clave']);<br /> <br />// Recoje la información en forma de matriz.<br />$info = $resp->getMatriz();<br /> <br />// Usar la información de alguna forma.<br />foreach ($info as $fila) {<br /> echo '<h2>Tus datos</h2> <ul>';<br /> echo '<li> nombre: ', $fila['nombre'], '</li>';<br /> echo '<li> ciudad: ', $fila['ciudad'], '</li>';<br /> echo '<li> genero: ', $fila['genero'], '</li>';<br /> echo '</ul>';<br />}<br />?><br /><html><br /> <head><br /> <title>Test</title><br /> </head><br /> <body><br /> <form action="test.php" method="post"><br /> <label for="correo">Correo: </label><br /> <input type="text" name="correo" id="correo" /><br /> <label for="clave">Clave: </label><br /> <input type="password" name="clave" id="clave"/><br /> <input type="submit" value="OK" /><br /> </form><br /> </body><br /></html></pre> <h2>Clase Principal</h2> <p>Esta clase contiene el constructor que permite hacer el "new BD()"</p> <p>Guardarlo en un alguna carpeta dentro del proyecto.</p> <p> </p> <pre><?php<br /> <br />/**<br /> * Este proyecto esta bajo la licencia<br /> * Creative Commons Atribucion-NoComercial-LicenciarIgual 3.0<br /> * ver http://creativecommons.org/licenses/by-nc-sa/3.0/deed.es<br /> */<br /> <br />// Importar la clase BdSentencia.<br />include 'BdSentencia.php';<br /> <br />/**<br /> * BD es una capa de abstracción para usar bases de datos de manera más cómoda.<br /> * Utiliza PDO.<br /> *<br /> * @author <a mailto="rodrigo.gonzlez@gmail.com">Rodrigo González</a><br /> */<br />class BD extends PDO {<br /> <br /> /**<br /> * El constructor.<br /> * @param <string> $nombre el nombre de la base de datos, en el caso de que<br /> * esté vacío toma el valor del archivo de configuración (configuracion.php)<br /> * correspondiente a BD_PRINCIPAL_NOM.<br /> */<br /> public function BD($nombre = BD_PRINCIPAL_NOM) {<br /> <br /> // (Data Source Name)<br /> $dsn = BD_MOTOR . ':host=' . BD_HOST . ';dbname=' . BD_PREFIJO_NOM . $nombre;<br /> <br /> // Instancear la conexión con la base de datos.<br /> parent::__construct($dsn, BD_USUARIO_NOM, BD_USUARIO_CLAVE);<br /> <br /> // Asigna la clase BdSentencia para crear los objetos que representen<br /> // sentencias y que heredan de PDOStatement.<br /> parent::setAttribute(PDO::ATTR_STATEMENT_CLASS, array('BdSentencia', array($this)));<br /> <br /> // Hace que se lancen errores, en caso de que se produzcan.<br /> parent::setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);<br /> <br /> // Cambiar el juego de caracteres de la conexión a UTF-8, no se<br /> // hace a través de MYSQL_ATTR_INIT_COMMAND por un bug en PHP 3.0 y 3.1<br /> parent::exec('SET NAMES \'utf8\'');<br /> <br /> }<br /> <br /> /**<br /> * Prepara una sentencia SQL para ser ejecutada posteriormente, puede aceptar<br /> * parametros ? que se reemplazarán con la función enlazarParametro.<br /> * @param <string> $sql una sentencia SQL.<br /> */<br /> public function preparar($sql) {<br /> return parent::prepare($sql);<br /> }<br /> <br /> /**<br /> * Envía una consulta no preparada a la base de datos. Equivale a la<br /> * función query.<br /> * @param string $sql la consulta SQL.<br /> * @return <BdSentencia> el objeto que representa la respuesta.<br /> */<br /> public function consultar($sql) {<br /> return parent::query($sql);<br /> }<br /> <br /> /**<br /> * Ejecuta una sentencia SQL. No se use para SELECT, para tales casos<br /> * está consultar, o preparar, para preparar sentencias.<br /> * @param <string> $sql la sentencia SQL.<br /> * @return <int> el numero de filas afectadas por esta acción.<br /> */<br /> public function ejecutarRapido($sql) {<br /> return parent::exec($sql);<br /> }<br /> <br />}<br /> <br />?></pre> <h2>Clase "Interna"</h2> <p>Esta clase representa la sentencia preparada SQL.</p> <p>Guardarla en la misma carpeta que la clase principal.</p> <p> </p> <p> </p> <pre><?php<br /> <br />/**<br /> * Este proyecto esta bajo la licencia<br /> * Creative Commons Atribucion-NoComercial-LicenciarIgual 3.0<br /> * ver http://creativecommons.org/licenses/by-nc-sa/3.0/deed.es<br /> */<br /> <br />/**<br /> * Representa una sentencia preparada según la clase BD.<br /> *<br /> * @author <a mailto="rodrigo.gonzlez@gmail.com">Rodrigo González</a><br /> */<br />class BdSentencia extends PDOStatement {<br /> <br /> /**<br /> * Una referencia al objeto BD.<br /> * @var <BD> la base de datos.<br /> */<br /> private $pdo;<br /> <br /> /**<br /> * Constructor.<br /> * @param <BD> $pdo una referencia a la base de datos.<br /> */<br /> protected function BdSentencia($pdo) {<br /> $this->pdo = $pdo;<br /> }<br /> <br /> /**<br /> * Ejecuta una sentencia preparada, si se le pasan argumentos entonces estos<br /> * se reemplazan en los '?' de la sentencia preparada en el mismo orden.<br /> * @param <string [,string[,...]]> los argumentos a reemplazar.<br /> * @return <bool> true si la acción fue exitosa, false caso contrario.<br /> */<br /> public function ejecutar() {<br /> // Si hay argumentos entonces pasarselos como array al método nativo<br /> // execute.<br /> if (func_num_args() > 0) {<br /> return parent::execute(func_get_args());<br /> }<br /> return parent::execute();<br /> }<br /> <br /> /**<br /> *<br /> * @return <string[]> una matriz que representa la tabla consultada en la<br /> * base de datos.<br /> */<br /> public function getMatriz() {<br /> return parent::fetchAll(PDO::FETCH_ASSOC);<br /> }<br /> <br /> /**<br /> *<br /> * @return <object[]> un vector de objetos en donde cada posición es un<br /> * objeto que representa una fila de la tabla (producto de la consuta a la<br /> * base de datos), y cada atributo de los objetos son los correspondientes a<br /> * las columnas de dicha tabla.<br /> */<br /> public function getObjetos() {<br /> return parent::fetchObject();<br /> }<br /> <br /> /**<br /> *<br /> * @return <int> el número de filas de la consulta.<br /> */<br /> public function contarFilas() {<br /> return parent::rowCount();<br /> }<br /> <br />}<br /> <br />?></pre> <h2>Archivo de configuración</h2> <p>Contiene constantes sobre el entorno de la base de datos. Ponerla en cualquier parte y llamarla junto con la clase principal en un include.</p> <pre><?php<br /> <br />/**<br /> * Este proyecto esta bajo la licencia<br /> * Creative Commons Atribucion-NoComercial-LicenciarIgual 3.0<br /> * ver http://creativecommons.org/licenses/by-nc-sa/3.0/deed.es<br /> */<br /> <br /> <br />// Datos para la base de datos.<br /> <br />/**<br /> * El motor de la base de datos, puede ser<br /> * 'mysql', 'postgresql', 'orale', etc.<br /> */<br />define('BD_MOTOR', 'mysql');<br /> <br />/**<br /> * El host.<br /> */<br />define('BD_HOST', 'localhost');<br /> <br />/**<br /> * Algunos host compartidos tienen un prefijo para sus bases de datos.<br /> */<br />define('BD_PREFIJO_NOM', '');<br /> <br />/**<br /> * El nombre de la base de datos del sistema.<br /> */<br />define('BD_PRINCIPAL_NOM', 'sistema');<br /> <br />/**<br /> * El nombre del usuario.<br /> */<br />define('BD_USUARIO_NOM', 'admin');<br /> <br />/**<br /> * La clave del usuario.<br /> */<br />define('BD_USUARIO_CLAVE', 'macoy123');<br /> <br />/**<br /> * Texto que se agrega a los hash para aumentar su seguridad.<br /> * En el caso de que se transporte el sistema y se use el instalador, es<br /> * necesario copiar este valor, de otro modo las contraseñas no funcionarán.<br /> */<br />define('HASH_SALT', 'd+ñsdop'); // Aún no implementado.<br /> <br />?></pre> <p>Eso. Porfavor, comenten cualquier duda o sugerencia para poder mejorarla.</p> <p>Saludos</p>
o salir
¡Amigo! te demorarás 10 segundos en crear tu cuenta.
Crear cuenta o acceder
Nick o e-mail Es el nombre visible de tu cuenta y te servirá para acceder a ella. Permitido espacios y cualquier caracter.
Contraseña Una clave única para acceder a tu cuenta.
Transcribe el código en la dirección indicada con el fin de evitar el SPAM.
Identificación Tu identificación es el nick o el e-mail de tu cuenta.
Contraseña La clave de tu cuenta. ¿No la recuerdas?
Recordar por diez días
Disfrutarás de todos los beneficios de DocumentoWeb.
Twitter Facebook Feed RSS
www.DocumentoWeb.com - Licencia Creative Commons