¡Hola!
Bueno, como muchos sabrán, no soy muy diestro en lo que a programación orientada a objetos se refiere, así que quise superar mis conocimientos y probarme creando una clase para manejo de usuarios.
Para este sistema creé tres clases:
- Usuarios: Permite manejar varios usuarios a la vez.
- Usuario: Permite manejar un usuario específico, así como borrarlo, entre otras funciones.
- Registrar: Inserta un nuevo usuario en la base de datos (Basada en la clase publicada por Physlet)
Clase: clase_usuarios.php
<?php
/* Excepciones en tiempo de ejecución */
// No se encontraron usuarios con el término de búsqueda establecido
class noSeEncontraronUsuarios extends Exception{}
// Error al realizar determinada consulta
class errorMySQLi extends Exception{}
/* Clase para administración de usuarios */
class usuarios
{
protected $mysqli; // Objeto de conexión MySQLi
private $condiciones; // Condiciones de la búsqueda de usuarios
// Construcción del objeto
function __construct()
{
/* Conexión a MySQLi */
$this->mysqli = new mysqli('localhost','root','mysql','pruebas');
}
// Definición de las condiciones para la búsqueda de usuarios
function definirBusqueda($busqueda)
{
$this->condiciones = $busqueda;
}
// Devolver un array con los resultados de la búsqueda
function usuariosEncontrados()
{
// Consulta a la base de datos
if($consulta = $this->mysqli->query('SELECT * FROM usuarios '.$this->condiciones))
{
// Si se encontraron resultados...
if($consulta->num_rows)
{
// Se crea un array con los resultados
$resultados = array();
// Se añaden los resultados al array
while($resultado = $consulta->fetch_object())
{
$resultados[] = $resultado;
}
return $resultados;
}
else
{
// Si no se encontraron resultados
throw new noSeEncontraronUsuarios;
}
}
else
{
// Si hubo un error MySQLi
throw new errorMySQLi;
}
}
// Finalización de la conexión MySQLi
function cerrar()
{
$this->mysqli->close();
}
}
?>
Modo de uso: les voy a poner un ejemplo en donde muestro todos los usuarios de la base de datos en una tabla, para que entiendan cómo se utiliza la clase.
/<?php
// Llamada al archivo de la clase
require_once('include/clase_usuarios.php');
$usuarios = new usuarios; // Se instancia el objeto usuarios
$usuarios->definirBusqueda('ORDER BY id'); // Se definen los términos de la búsqueda
// Bloque Try para el manejo de excepciones
try
{
echo '<table border="1">
<tr>
<td>ID</td>
<td>Nick</td>
<td>Contrasena</td>
</tr>';
// Se devuelve un array con los usuarios encontrados
$resultados = $usuarios->usuariosEncontrados();
// Se crea un bucle para cada resultado obtenido
foreach($resultados as $usuario)
{
// Se muestran los datos
echo '<tr>
<td>'.$usuario->id.'</td>
<td>'.$usuario->nick.'</td>
<td>'.$usuario->contrasena.'</td>
</tr>';
}
echo '</table>';
}
catch(noSeEncontraronUsuarios $e)
{
echo 'No se encontraron usuarios.';
}
catch(errorMySQLi $e)
{
echo 'Ha ocurrido un error al buscar los usuarios.';
}
$usuarios->cerrar();
?>
Clase: clase_usuario.php
<?php
/* Excepciones en tiempo de ejecución */
// No se encontró el usuario especificado
class usuarioInexistente extends Exception{}
/* Clase para el manejo de usuarios */
class usuario extends usuarios
{
private $idusuario; // ID del usuario a trabajar
// Se construye el objeto enviándole por parámetro la ID del usuario
function __construct($idusuario)
{
parent::__construct(); // Se construye la clase padre para poder usar MySQLi
$this->idusuario = $this->mysqli->real_escape_string($idusuario);
// Se selecciona la fila de la tabla usuarios
parent::definirBusqueda('WHERE id = "'.$this->idusuario.'"');
// Bloque Try para el manejo de excepciones
try
{
// Se devuelve un array con los datos del usuario
$resultados = parent::usuariosEncontrados();
// Se crea una variable para cada campo y su valor
foreach($resultados[0] as $campo => $valor)
{
eval('$this -> '.$campo.' = "'.$valor.'";');
}
}
catch(noSeEncontraronUsuarios $i)
{
// Si no se ha encontrado el usuario...
throw new usuarioInexistente;
}
}
// Eliminar el usuario
function eliminar()
{
if(!$this->mysqli->query('DELETE FROM usuarios WHERE id = "'.$this->idusuario.'"'))
{
throw new errorMySQLi;
}
}
}
?>
Modo de uso: en este caso les voy a poner un ejemplo de como usarlo en un miniperfil de usuario, con la opción de borrar el usuario.
<?php
// Llamada a las clases necesarias
require_once('include/clase_usuarios.php');
require_once('include/clase_usuario.php');
// Si se especificó la ID de usuario por GET()
if(!empty($_GET['id']))
{
// Bloque Try para el manejo de excepciones
try
{
$usuario = new usuario($_GET['id']); // Se instancia el objeto usuario
// Se imprimen los datos
echo 'ID de usuario: '.$usuario->id.'<br />';
echo 'Nombre de usuario: '.$usuario->nick.'<br />';
echo 'Contraseña: '.$usuario->contrasena.'<br /><br />';
echo '<a href="perfil.php?id='.$usuario->id.'&borrar=true">Borrar</a>';
// Si se va a borrar el usuario...
if(!empty($_GET['borrar']))
{
// Bloque Try para el manejo de excepciones
try
{
// Se elimina el usuario
$usuario->eliminar();
echo '<br /><br />El usuario ha sido borrado.';
}
catch(errorMySQLi $e)
{
// Si hubo un error MySQLi...
echo '<br /><br />No se pudo borrar el usuario.';
}
}
}
catch(usuarioInexistente $e)
{
// Si el usuario no existe...
echo 'Este usuario no existe o ha sido borrado.';
}
catch(errorMySQLi $e)
{
// Si hubo un error MySQLi...
echo 'Ha ocurrido un al realizar la consulta';
}
}
?>
Clase: clase_usuario_registrar.php
<?php
/* Excepciones en tiempo de ejecución */
// Nombre de usuario ya existe
class usuarioNoDisponible extends Exception{}
// Las contraseñas no coinciden
class contrasenasNoCoinciden extends Exception{}
/* Clase para registrar un nuevo usuario */
class registrarUsuario extends usuarios
{
/* Datos a registrar del usuario */
private $usuario;
private $contrasena;
/* Asignación de datos */
function definirDatos($nick, $pass)
{
$this->usuario = htmlspecialchars($this->mysqli->real_escape_string($nick));
$this->contrasena = md5($this->mysqli->real_escape_string($pass));
}
/* Comprobar si un nombre de usuario está disponible */
function comprobarUsuario()
{
$resultado = parent::definirBusqueda('WHERE nick = "'.$this->usuario.'"');
try
{
if(parent::usuariosEncontrados())
{
throw new usuarioNoDisponible;
}
}
catch(noSeEncontraronUsuarios $i){}
}
/* Comprobar que las dos contraseñas coincidan */
function comprobarContrasena($pass2)
{
if($this->contrasena != md5($this->mysqli->real_escape_string($pass2)))
{
throw new contrasenasNoCoinciden;
}
}
/* Registrar el usuario */
function registrar()
{
if(!$this->mysqli->query('INSERT INTO usuarios (nick, contrasena) VALUES ("'.$this->usuario.'", "'.$this->contrasena.'")'))
{
throw new errorMySQLi;
}
}
}
?>
Modo de uso: nuevamente, un ejemplo de su utilización en un registro simple.
<?php
// Llamada a las clases necesarias
require_once('include/clase_usuarios.php');
require_once('include/clase_usuario_registrar.php');
// Si se enviaron el nick y la contraseña por POST()
if(!empty($_POST['nick']) && !empty($_POST['pass']))
{
$registro = new registrarUsuario; // Se instancia el objeto registrarUsuario
$registro->definirDatos($_POST['nick'], $_POST['pass']); // Se definen los datos a insertar
// Bloque Try para el manejo de excepciones
try
{
$registro->comprobarUsuario(); // Comprobamos que el nombre de usuario esté disponible
$registro->comprobarContrasena($_POST['pass2']); // Comprobamos que ambas contraseñas sean iguales
$registro->registrar(); // Registramos el usuario
echo 'Regitrado exitosamente';
}
catch(usuarioNoDisponible $e)
{
// Si el nombre de usuario está ocupado...
echo 'Este usuario no está disponible.';
}
catch(contrasenasNoCoinciden $e)
{
// Si las contraseñas no coinciden...
echo 'Las contraseñas no coinciden.';
}
catch(errorMySQLi $e)
{
// Si hubo un error MySQLi...
echo 'Ha ocurrido un error al insertar el usuario.';
}
}
?>
<form method="post">
<input name="nick" value="<?=$_POST['nick']; ?>" />
<input name="pass" value="<?=$_POST['pass']; ?>" />
<input name="pass2"value="<?=$_POST['pass2']; ?>" />
<input type="submit" value="Registrar" />
</form>
Bueno, espero que me den sus opiniones, críticas, sugerencias, mejoras o lo que quieran para la clase, ésta es una de las primeras que creo y bueno, quiero que opinen jejeje.
Saludos ^^