Autor Tema: Clase GuestBook [actualizada]  (Leído 4013 veces)

Desconectado BLISZ

  • PHPerit@
  • *
  • Mensajes: 38
  • Karma: 7
  • Sexo: Masculino
    • Ver Perfil
Clase GuestBook [actualizada]
« 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( 
	
	
&
#39;host&#39; => &#39;localhost&#39;,
	
	
&
#39;user&#39; => &#39;root&#39;,
	
	
&
#39;pass&#39; => &#39;root&#39;,
	
	
&
#39;db&#39; => &#39;casino&#39;,
	
	
&
#39;table&#39; => &#39;gbook&#39;,
	
	
&
#39;pagina&#39; => &#39;gbook.php&#39;
	
	
);
	
	
/* 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[&#39;pagina&#39;]);
	
	
	
}
	
}
	

	
function 
Mostrar() {
	
	
$query "SELECT * FROM ".$this->sys[&#39;table&#39;]." 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[&#39;id&#39;];?>">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[&#39;table&#39;]. " (texto, autor, fecha) VALUES (&#39;$texto&#39;, &#39;$autor&#39;, &#39;$fecha&#39;)";
	
	
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[&#39;pagina&#39;]);
	
}
	

	
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[&#39;pagina&#39;]."?salir>Logout</a></center>";
else
{
?>
	
<center><form action=<?php echo $libro->sys[&#39;pagina&#39;];?> 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í. La contraseña de administracion es 'phperos', sin las comillas.
« Última modificación: 06 de Enero de 2007, 12:42:11 pm por BLISZ »
Empty your mind, be formless, shapeless — like void*. If you put an int into a void*, it becomes the int. You put float into a void* it becomes the float. You put in a char it becomes the char. Now, void* can flow or it can overflow. Be void* my friend.

Comunidad PHPeros

Clase GuestBook [actualizada]
« en: 04 de Enero de 2007, 16:09:38 pm »

Conectado naveda

  • Administrador General
  • PHPero Master
  • *****
  • Mensajes: 2.282
  • Karma: 165
  • Sexo: Masculino
    • Ver Perfil
    • naveda.me
Re: Clase GuestBook
« Respuesta #1 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
« Última modificación: 04 de Enero de 2007, 18:20:31 pm por naveda »
Por favor, leete las Normas


Desconectado BLISZ

  • PHPerit@
  • *
  • Mensajes: 38
  • Karma: 7
  • Sexo: Masculino
    • Ver Perfil
Re: Clase GuestBook [actualizada]
« Respuesta #2 en: 04 de Enero de 2007, 19:47:20 pm »
He añadido cosas :D
Empty your mind, be formless, shapeless — like void*. If you put an int into a void*, it becomes the int. You put float into a void* it becomes the float. You put in a char it becomes the char. Now, void* can flow or it can overflow. Be void* my friend.

Desconectado CarlosRdrz

  • Moderador Global
  • PHPero Master
  • *****
  • Mensajes: 2.505
  • Karma: 131
  • Sexo: Masculino
  • A.k.a. TLX
    • Ver Perfil
Re: Clase GuestBook [actualizada]
« Respuesta #3 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!
La dedicación de mi respuesta sera directamente proporcional a la dedicación de tu pregunta.
Hacer códigos que entiendan las máquinas es fácil, lo difícil y realmente útil es hacer códigos que entiendan las personas.
http://twitter.com/CarlosRdrz
http://www.carlosrdrz.es

Desconectado BLISZ

  • PHPerit@
  • *
  • Mensajes: 38
  • Karma: 7
  • Sexo: Masculino
    • Ver Perfil
Re: Clase GuestBook [actualizada]
« Respuesta #4 en: 08 de Enero de 2007, 21:59:55 pm »
Pronto pondre una actualizacion con bastantes cambios
Empty your mind, be formless, shapeless — like void*. If you put an int into a void*, it becomes the int. You put float into a void* it becomes the float. You put in a char it becomes the char. Now, void* can flow or it can overflow. Be void* my friend.