Comunidad PHPeros

Lenguajes => PHP => Tutoriales PHP => Mensaje iniciado por: BLISZ en 04 de Enero de 2007, 16:09:38 pm

Título: Clase GuestBook [actualizada]
Publicado por: BLISZ en 04 de Enero de 2007, 16:09:38 pm
Editado 16:18 he cambiado la estructura de la SQL por la buena.
Editado 19:30 añadidas funcionalidades de administracion y borrado de firmas. Si alguien ha usado el script antes de la actualización le recomiendo actualizarlo entero
Editado 19:54 pequeño cambio, las variables que se pasan por URL las recojo con $_GET["$var"]

Hola, llevo varios días mirando el tema de las clases en PHP, la programación orientada a objetos y leyendo algunas clases más o menos simples (autentificación de usuarios y cosas así) y hoy me he decidido a probar esto de las clases realizando un libro de visitas simple.

La verdad es que esto de las clases está bastante bien. No se demasiado de la POO pero mas o menos se tiene que construir por separado el motor de la web y el diseño en que se representarán los datos, no se deben mezclar estas cosas. Una vez construido el motor es realmente simple terminar la web.

Bueno, voy a copiar la clase, que sería el motor del sistema.

class.gbook.php
<?php


/*

CREATE TABLE `gbook` (
  `id` int(7) NOT NULL auto_increment,
  `autor` varchar(32) NOT NULL,
  `texto` longtext NOT NULL,
  `fecha` varchar(20) NOT NULL,
  PRIMARY KEY  (`id`)
)

*/

class GBook {

var $sys = array(
'host' => 'localhost',
'user' => 'root',
'pass' => 'root',
'db' => 'casino',
'table' => 'gbook',
'pagina' => 'gbook.php'
);
/* estos datos deben cambiarse según la configuracion de cada uno */
var $password = "88a0b1be3a4a0e81bc21eb8f5a423ba4"; // codificada en MD5, se puede usar por ejemplo http://www.md5encrypter.com/ para codificar algo rapidamente

var $enlace;

function GBook() {
if(empty($this->enlace))
{
$this->enlace = mysql_connect($this->sys["host"],$this->sys["user"],$this->sys["pass"]) or die("No se ha podido conectar a la base de datos");
mysql_select_db($this->sys["db"],$this->enlace);
return $this->enlace;
}
}

function CheckAdmin($pass) {
if(md5($pass)==$this->password)
{
setcookie("gbook_admin",md5($pass),time()+3600*24*7); // 1 semana de cookie
header("Location: ".$this->sys['pagina']);
}
}

function Mostrar() {
$query = "SELECT * FROM ".$this->sys['table']." ORDER BY id DESC";
$res = mysql_query($query) or die("No se pudo sacar informacion de la BD");
while($row = mysql_fetch_array($res))
{
?>
<center><div id="tabla">
<?php echo $row["autor"];?>
el <?php echo date("d/m/Y",$row["fecha"]);?> a las
<?php echo date("H:i",$row["fecha"]);?>
<?php
if($_COOKIE["gbook_admin"]==$this->password)
{ ?>
<a href="borrar.php?id=<?php echo $row['id'];?>">Borrar</a>
<?php
}
?>
<hr />
<?php echo $row["texto"];?>
</div></center>
<?php
}
}

function Borrar($id)
{
if($_COOKIE["gbook_admin"]==$this->password)
{
$query = "DELETE FROM ".$this->sys["table"]." WHERE id = ".$id;
mysql_query($query,$this->enlace) or die(mysql_error());
header("Location: ".$this->sys["pagina"]);
}
else
echo "No tienes permisos";
}

function Escribir($texto,$autor) {
$texto = $this->LimpiarCadena($texto);
$autor = $this->LimpiarCadena($autor);
$fecha = time();

$query = "INSERT INTO " .$this->sys['table']. " (texto, autor, fecha) VALUES ('$texto', '$autor', '$fecha')";
mysql_query ($query, $this->enlace) or die(mysql_error());
header("Location: ".$this->sys["pagina"]);
}

function Logout() {
setcookie ("gbook_admin", "", time()-60000);
header("Location: ".$this->sys['pagina']);
}

function LimpiarCadena($cadena)
{
$cadena = stripslashes($cadena);
$cadena = strip_tags($cadena);
$cadena = nl2br($cadena);
$cadena = stripslashes($cadena);
$cadena = mysql_real_escape_string($cadena);
return $cadena;
}
} ?>

Voy a explicar muy brevemente lo que hace cada método (función).

GBook()
Es el constructor de la clase, lo que hace es crear la conexión con la base de datos. Tiene el mismo nombre que la clase, de esta manera el método se convierte en el constructor y conecta automáticamente con la BD


CheckAdmin()
Esto codifica con md5 la contraseña que se le pasa y comprueba que es igual que el hash que se ha especificado en la configuracion de la clase. Si concuerdan crea una cookie con el hash de la contraseña.

Mostrar()
Imprime todas las firmas que se han dejado, y si el login es correcto muestra un enlace para borrar una firma en concreto.

Borrar($id)
Borra de la BD la firma con la ID que se le pasa a la función. Antes de eso comprueba que tengas permisos :P

Escribir($texto,$autor)
Escribe en la base de datos una nueva firma. A esta función se le pasan dos parámetros, que son el texto y el autor. La fecha la genera automáticamente.

Logout()
Elimina la cookie

LimpiarCadena()
Esto me lo encontré por ahí, no se si es la forma más segura de limpiar una cadena, pero me parece que funciona bien. No estoy puesto en este tema y tendré que investigar un poco para mejorar esta funcion.


index.php (O el nombre que se le quiera dar. Si se le da otro debe cambiarse en class.gbook.php la variable $sys["pagina"])
<?php
include("class.gbook.php");
$libro = new GBook;
if(!empty($_POST["pass"]))
$libro->CheckAdmin($_POST["pass"]);
if(isset($_GET["salir"]))
$libro->Logout();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta http-equiv="Content-Language" content="es-es" />
<link rel="stylesheet" href="gbook_css.css" />
    <title>Clase GuestBook muy simple</title>
</head>

<center><form action="procesar.php" method="post">
Autor
<input class="form" type="text" name="autor"><br />

<textarea class="form" name="texto"></textarea><br />
<input class="form" type="submit" value="Firmar">
</form><br /></center>
<?php

$libro->mostrar();
?>
<?php
if($_COOKIE["gbook_admin"]==$libro->password)
echo "<center><a href=".$libro->sys['pagina']."?salir>Logout</a></center>";
else
{
?> <center><form action=<?php echo $libro->sys['pagina'];?> method="post">
Administrar:
<input class="form" type="password" name="pass">
<input class="form" type="submit" value="OK">
</form></center>
<?php
}
?>
<body>
</body>
</html>

Esto sería lo que el usuario vería. Para usar una clase en primer lugar debemos incluirla y crear un objeto, da igual el nombre. En este caso he usado la palabra libro. El objeto se crea de esta manera: $libro = new GBook;
GBook es el nombre de la clase.

Para acceder a los métodos del objeto se hace de la siguiente manera.
$objeto->metodo();
Un ejemplo con nuestro caso:
$libro->mostrar();
De esta manera se mostrarían todas las firmas existentes.

Lo primero que se hace es comprobar si $_POST["pass"] tiene algo, y si lo tiene usa el método CheckAdmin($pass) con ese algo para comprobar si la contraseña es correcta y crear la cookie que lo confirme.

Despues se comprueba si existe la variable $salir. Si existe llama al método Logout() que destruye la cookie del administrador.

Mostramos ya el HTML, formulario de firma y por fin mostramos las firmas con $libro->mostrar();

Despues de eso, si el login fue correcto mostramos un enlace para salir, y si no pues un formulario para entrar xD

procesar.php
<?php

if(!empty($_POST["texto"]) && !empty($_POST["autor"]))
{
include("class.gbook.php");
$libro = new GBook;
$libro->Escribir($_POST["texto"],$_POST["autor"]);
}
else
echo "Debes rellenar todos los campos";
?>

De nuevo incluimos la clase para poder usarla, creamos el objeto y usamos el metodo Escribir($texto,$autor). En este caso las variables $_POST["texto"] y $_POST["autor"] tienen la información, así que usamos el método Escribir($texto,$autor) con esas variables.

borrar.php
<?php
if(isset($_GET["id"]))
{
  include("class.gbook.php");
$libro = new GBook;
$libro->Borrar($id);
}
else
echo "Debes especificar una firma para borrarla.";

?>

Si se ha especificado una ID llama al método Borrar($id) y la borra, claro XD


Y eso es todo amigos. Una clase muy simple y básica que para los que estén comenzando con las clases (como yo) o quieran empezar les servira creo y espero que bastante.

¿Se puede mejorar?

Todo se puede mejorar. ¿Alguna idea?

Se puede echar un vistazo a la clase GuestBook aquí (http://esphp.es/gbook/gbook.php). La contraseña de administracion es 'phperos', sin las comillas.
Título: Re: Clase GuestBook
Publicado por: naveda en 04 de Enero de 2007, 18:17:12 pm
Muy bien! :P
Esta muy bien estructurada jejeje
Creo que voy a empezar a usar clases para estructurar mis codigos ^^

Buen TUTO, lo añado a la lista

Aclaraciones(*):
POO: Es el acrónimo de Programación Orientada a Objetos
Título: Re: Clase GuestBook [actualizada]
Publicado por: BLISZ en 04 de Enero de 2007, 19:47:20 pm
He añadido cosas :D
Título: Re: Clase GuestBook [actualizada]
Publicado por: CarlosRdrz en 08 de Enero de 2007, 21:45:34 pm
Me gusta mucho esto man :P
La verdad me llamo la atencion que hiciste algo asi, como dijo naveda, yo tambien me pondre a trabajar con las clases, las estoy viendo muuuuy utiles :P:P
Saludos!
Título: Re: Clase GuestBook [actualizada]
Publicado por: BLISZ en 08 de Enero de 2007, 21:59:55 pm
Pronto pondre una actualizacion con bastantes cambios