InicioHazlo Tu MismoAplicando POO en PHP para conectar a base de datos mysql

Aplicando POO en PHP para conectar a base de datos mysql

Hazlo Tu Mismo11/2/2013


Lo que vamos a hacer es un código sencillo para conectar a una base de datos mysql, la cual nos evitara tener que repetir una y otra ves el mismo código en cada archivo. Utilizaremos el paradigma orientado a objetos y la extensión mysqli, no la extensión mysql vamos a explicar que es esto.

APIs de PHP para acceder a las bases de datos de MySQL

¿Qué es una API?

Una Interfaz de Programación de Aplicaciones (o API de sus siglas en inglés), define las clases, métodos, funciones y variables que la aplicación necisita llamar para realizar una tarea. En el caso de aplicaciones de PHP que necesiten comunicarse con bases de datos, las APIs necesarias normalmente son expuestas mediante extensiones de PHP.

Las APIs pueden ser procedimentales y orientadas a objetos. Con una API procedimental se llaman a funciones para realizar tareas, con una API orientada a objetos se instancian clases y luego se llamana métodos sobre los objetos resultantes. De las dos, la última normalmente es la interfaz preferida, ya que es más moderna y conduce a un código mejor organizado.

Al escribir aplicaciones de PHP que necesitan conectarse a un servidor de MySQL, existen varias opciones de APIs disponibles.

¿Que API elegir?



PHP ofrece 3 APIs diferentes ellas son mysql, mysqli, y PDO, este ultimo es una capa de abstraccion. Esta es la recomendacion de PHP:

Se recomienda usar las extensiones mysqli o PDO_MySQL. No se recomienda usar la extensión mysql antigua para nuevos desarrollos, ya que ha sido declarada obsoleta a partir de PHP 5.5.0 y será eliminada en el futuro. El rendimiento global de las tres extensiones se considera aproximadamente el mismo. Aunque el rendimiento de la extensión aporta solamente una fracción del total del tiempo de ejecución de una consulta web de PHP. A menudo el impacto es tan bajo como 0.1%.



La extensión mysql es aquella que empieza con mysql_*. Por ejemplo mysql_select_db(), mysql_query(), mysql_real_scape_string(), etc.

Yo usare para este post mysqli, la "i" al final significa improvement es decir es el mysql mejorado. Una de las ventajas es que me permite usar el estilo orientado a objetos. Para mas información miren la documentación: http://www.php.net/manual/es/book.mysqli.php

Implementación



El código no es muy complejo pero si se requiere tener por lo menos conocimiento de POO. Lo primero que haremos sera crear un archivo config.php donde definiremos constantes para configurar la conexión.

config.php

<?php
        define
('DB_HOST','localhost');
    
define('DB_USER','root');
    
define('DB_PASS','');
    
define('DB_NAME','');
    
define('DB_CHARSET','utf-8');
?>


Esto es solo para evitar tener que navegar por todo el código para configurar nuestra conexión. Lo siguiente sera crear una clase que llamare modelo, servirá de plantilla para otras clases, tendrá un atributo que sera una instancia de la clase mysqli.

modelo.php

<?php 
require_once "config.php";

class 
Modelo
{
    protected 
$_db;

    public function 
__construct()
    {
        
$this->_db = new mysqli(DB_HOSTDB_USERDB_PASSDB_NAME);

        if ( 
$this->_db->connect_errno )
        {
            echo 
"Fallo al conectar a MySQL: "$this->_db->connect_error;
            return;    
        }

        
$this->_db->set_charset(DB_CHARSET);
    }
}
?>


En la primer linea incluimos nuestro archivo config.php. El constructor de esta clase iniciara la variable $_db la cual sera una instancia de mysqli. Podemos ver lo que significa que mysqli permite el estilo orientado objetos, ya que alguno de sus métodos son set_charset(), query(), prepare(),etc, también vemos que accedemos a un atributo connect_errno.


Aplicación

La idea es que crear clases que hereden de la clase Modelo, para poder heredar sus atributos($_db) y métodos(__construct). No solamente eso sino que para tener un código mas reutilizable, prolijo y fácil de mantener queremos que las clases realicen tareas especificas, lo que no queremos es código html en esta parte, ni código que se encargue de tareas que pueden hacerse luego, para ser mas específicos solo queremos usar código para traer, modificar, borrar, agregar datos a la base de datos.

Por ejemplo tenemos un tabla usuarios en nuestra base de datos, crearemos un clase usuario que hará tareas referidas al usuario, como traer todos los usuarios, traer un usuario particular, borrar un usuario, editar un usuario, encontrar un usuario por id especifico, etc.

usuariosModelo.php

<?php 
require_once "Modelo.php";

class 
usuariosModelo extends Modelo
{    
    public function 
__construct()
    {
        
parent::__construct();
    }

    public function 
get_users()
    {
        
$result $this->_db->query('SELECT * FROM usuarios');
        
        
$users $result->fetch_all(MYSQLI_ASSOC);
        
        return 
$users;
    }
}
  
?>


Por simplicidad solo cree un método get_users() que como verán solo devuelve un array y nada mas, esta porción de código es muy probable que se use en varias partes y si tenemos que cambiar algo lo haremos en un solo lugar.

Cuando hagamos new usuariosModelo() este llamara al constructor de su padre que ya comentamos que es lo que hace. La herencia nos permite tambien acceder al atributo $_db que, vuelvo a repetir, es una instancia de mysqli por lo tanto podemos hacer uso de su metodo query y fetch_all que nos devuelve un array con los resultados obtenidos por la consulta colocada en query.

Ok entonces yo tengo un archivo que tiene que mostrar todos los usuarios, ¿como uso el código anterior? de la siguiente forma

index.php

 <?php  
     
require_once "usuariosModelo.php";

    
$usuarioModel = new usuariosModelo();
    
$a_users $usuarioModel->get_users();
?>

<!DOCTYPE html>
 <html>
 <head>
     <title>Usuarios registrados</title>
 </head>
 <body>
     <table >
            <tr>
                <td>
                    Id
                </td>
                <td >
                    Nombre
                </td>
                <td>
                    Correo
                </td>
            </tr><!-- /THEAD -->

            <?php foreach ($a_users as $row): ?>

            <tr>
                <td><?php echo $row['id']; ?></td>
                <td><?php echo $row['nombre']; ?></td>
                <td><?php echo $row['correo']; ?></td>
            </tr><!-- /TROW -->
        
            <?php endforeach ?>    
                 
        </table>
   
 </body>
 </html>


El código anterior luce muy simple! son prácticamente dos lineas de php las que hacen todo el trabajo sucio, lo que queda es solo mostrar los datos con un foreach.

¿Que ventaja nos trae esto?



Si tuviésemos un problema revisaríamos el método get_users(), que si lo hemos probado bien y funciona entonces pasaríamos a ver si la conexión es el problema. Si hubiéramos creado un solo archivo tendríamos que navegar entre varias lineas para identificar el problema, peor si tenemos el mismo problema en varios archivos deberíamos corregir en cada uno, demasiado mantenimiento!

Tener el código bien divido en partes nos permite concentrarnos en un problema particular, probarlos y verificar que funcionan, corregir fácilmente errores.

Reusabilidad. La clase usuariosModelo y Modelo tienen métodos que seguro se usaran en otros archivos ya no es necesario copiar un montón de código para hacer siempre lo mismo.

Bueno quiza no explique mucho sobre mysqli, pero la documentación esta en las referencias. Quizás haga otro post sobre mysqli aunque sobre este también hay mucha información. Espero que les sea de utilidad saludos!
Datos archivados del Taringa! original
194puntos
631visitas
0comentarios
Actividad nueva en Posteamelo
0puntos
2visitas
0comentarios
Dar puntos:

Dejá tu comentario

0/2000

Autor del Post

p
pablo1416🇦🇷
Usuario
Puntos0
Posts7
Ver perfil →
PosteameloArchivo Histórico de Taringa! (2004-2017). Preservando la inteligencia colectiva de la internet hispanohablante.

CONTACTO

18 de Septiembre 455, Casilla 52

Chillán, Región de Ñuble, Chile

Solo correo postal

© 2026 Posteamelo.com. No afiliado con Taringa! ni sus sucesores.

Contenido preservado con fines históricos y culturales.