Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Intentando crear un tag-board

Estas en el tema de Intentando crear un tag-board en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola, hace ya un tiempo que estoy intentando crear un tag-board usando POO, pero lo unico que hice fue un codigo realmente malo, por lo ...
  #1 (permalink)  
Antiguo 24/08/2006, 03:46
 
Fecha de Ingreso: agosto-2006
Mensajes: 8
Antigüedad: 17 años, 8 meses
Puntos: 0
Intentando crear un tag-board

Hola, hace ya un tiempo que estoy intentando crear un tag-board usando POO, pero lo unico que hice fue un codigo realmente malo, por lo que queria describir lo que quiero hacer, por si alguien me puede facilitar un codigo que cumpla con lo que quiero para poder estudiarlo. Tambien voy a poner mi codigo mas abajo, aunque creo que lo mejor va a ser un codigo totalmente nuevo, por que el mio esta muy mal, pero lo pongo por si agluien quiere marcarme errores.

Lo que quiero hacer es bastantente simple. Un tag-board (con mysql) usando POO que acepte un numero maximo de mensajes (por ejemplo 20) y vaya acomodando los mensajes en la base de datos (una tabla que tendria 20 filas) y el script lo imprima de mensaje mas nuevo a mas viejo. Y lo mas dificil (no debe ser muy dificil, pero para mi lo es), cuando la tabla que este llena y un usuario quiera ingresar un mensaje, que el mensaje mas viejo sea borrado para dejar lugar al mensaje recien ingresado.

Basicamente es eso. Ahora les dejo mi codigo. Para que "funcione" (entre comillas por que realmente no funciona) tienen que tener una base de datos con 3 columnas, la primera llamada "numero" que seria el id de la fila, la segunda "nombre" que es el nombre de la persona que ingreso el mensaje, y la tercera "mensaje" que es el mensaje en si.

Por ultimo aclaro que el codigo no me da ningun error, simplemente no hace lo que deberia hacer, probe depurarlo de mil maneras, pero parece que no tiene arreglo, por eso creo que es mejor hacer uno desde cero.

Código PHP:
<?php
class insertarMensaje {
    private 
$dblink$filas/* variables para almacenar el enlaze a mysql y la cantidad de filas que esta tiene la base de datos */
    
    
public function conectar($host$user$pass$db) { /* constructor que sirve para conectar con la base de datos */
        
$this->dblink mysql_connect($host$user$pass);
    
mysql_select_db($db$this->dblink);
    }
    
    public function 
buscarEspacio($nombre$mensaje$tabla$cantidadFilas) { /* metodo que busca espacio en la base de datos */
        
echo $nombre." ".$mensaje;
        
$this->filas $cantidadFilas// guarda la cantidad de filas que tiene la base de datos
        
$sql "select nombre from '$tabla' where numero = $cantidadFilas";
    for (;(
$resultado mysql_query($sql)); $cantidadFilas--) { /* hace una consulta a cada fila, desde la ultima a la primera hasta que encuentre un espacio libre o no queden mas filas*/
        
$fila mysql_fetch_assoc($resultado);
        if (
$fila['nombre'] == '') { /* si la columna nombre esta vacia llama al metodo insertar y termina el bucle */
            
$this->insertar($nombre$mensaje$tabla$cantidadFilas);
        break;
            }
        }
    if (
$cantidadFilas 0/* si cantidadFilas es menor que 0 significa que no hay espacio disponible en la base de datos, por lo que llama al metodo hacerEspacio */
        
$this->hacerEspacio($nombre$mensaje$tabla);
    }
    
    public function 
hacerEspacio($nombre$mensaje$tabla) { /* mueve los datos de una fila a la fila que le sigue, por ejemplo, los datos de la fila 2 seran movidos a la fila 3, para asi eliminar los datos de la ultima fila y dejar libre la primer fila (0) para insertar los datos nuevos */
        
echo $nombre." ".$mensaje;
    
$filaNum $this->filas;
    for (;
$filaNum >= 1$filaNum--) {
        
$filaInferior $filaNum 1;
        
$sql "select * from '$tabla' where numero = $filaInferior";
        
$resultado mysql_query($sql); /* copia los datos de una fila, como por ejemplo puede ser la fila numero 2 */
        
$fila mysql_fetch_assoc($resultado);
        
$nombre $fila['nombre'];
        
$mensaje $fila['mensaje'];
        
$sql "update mensajes set nombre = '$nombre' where numero = $filaNum";
        
mysql_query($sql);  /* inserta el valor de la columna nombre que copio anterirmente, siguiendo con el ejemplo anterior, se insertaria en la fila numero 3 */
        
$sql "update mensajes set mensaje = '$mensaje' where numero = $filaNum";
        
mysql_query($sql); /* igual que el anterior pero con la columna mensaje */
    
}
    
$this->insertar($nombre$mensaje$tabla0); //al terminar de mover todas las filas llama a la funcion insertar
    
}
    
    public function 
insertar($nombre$mensaje$tabla$fila) {
        echo 
$nombre." ".$mensaje;
        
$sql "update mensajes set nombre = '$nombre' where numero = $fila";
    
mysql_query($sql); /* inserta el valor de nombre en la columna correspondiente */
    
$sql "update mensajes set mensaje = '$mensaje' where numero = $fila";
    
mysql_query($sql); /* igual que el anterior pero con el mensaje */
    
}
}
if(isset(
$_POST['nombre']) && isset($_POST['mensaje']) && isset($_POST['host']) && isset($_POST['user']) && isset($_POST['db']) && isset($_POST['tabla']) && isset($_POST['filas'])) {
$nombre $_POST['nombre'];
$mensaje $_POST['mensaje'];
$host $_POST['host'];
$user $_POST['user'];
$pass $_POST['pass'];
$db $_POST['db'];
$tabla $_POST['tabla'];
$filas $_POST['filas'];

$board = new insertarMensaje;
$board->conectar($host$user$pass$db);
$board->buscarEspacio($nombre$mensaje$tabla$fila);
}
else {
?>
<form action="tagpoo.php" method="post">
<h3>Datos a introducir:</h3>
<p>Nombre: <input type="text" name="nombre" /></p>
<p>Mensaje: <input type="text" name="mensaje" /></p>
<h3>Datos de la base de datos:</h3>
<p>Host: <input type="text" name="host" /></p>
<p>Usuario: <input type="text" name="user" /></p>
<p>Password: <input type="text" name="pass" /></p>
<p>Base de datos: <input type="text" name="db" /></p>
<p>Tabla: <input type="text" name="tabla" /></p>
<p>Cantidad de filas: <input type="text" name="filas" /></p>
<input type="submit" value="Enviar" />
</form>
<?php
}
?>
Desde ya muchas gracias por cualquier recomendacion, codigo o cualquier cosa con la que me ayuden
  #2 (permalink)  
Antiguo 25/08/2006, 22:09
Avatar de bistoco  
Fecha de Ingreso: marzo-2006
Mensajes: 141
Antigüedad: 18 años, 1 mes
Puntos: 0
yo creo ke otro enfoke podria ser ...guardar todos los mensajes y mostrar solo los ultimos 20 ordenados por fecha en forma descendente

si te tinca...responde y vemos el codigo

saludos
__________________
Share what you know...learn what you don't :si:
  #3 (permalink)  
Antiguo 27/08/2006, 00:27
 
Fecha de Ingreso: agosto-2006
Mensajes: 8
Antigüedad: 17 años, 8 meses
Puntos: 0
Gracias por la respuesta bistoco. Realmente prefiero de la forma que dije yo, me parece mejor desechar los mensajes que no van a ser vistos, en vez de que esten ocupando espacio. De cualquier manera, si nadie puede ayudarme, estaria de acuerdo en intentar la forma que describiste.

Saludos
  #4 (permalink)  
Antiguo 27/08/2006, 15:37
 
Fecha de Ingreso: enero-2006
Ubicación: Buenos Aires, Argentina
Mensajes: 299
Antigüedad: 18 años, 3 meses
Puntos: 5
Buenas, si querés hacerlo de esa forma, lo que podrías hacer es lo siguiente:

1º) Insertás el nuevo comentario normalmente, con INSERT INTO etc

2º) Averiguás la cantidad de registros que tiene la tabla con SELECT COUNT:

--> algo así:

SELECT COUNT(*) AS Total
FROM mensajes ;

3º) Te fijás cuántos resultados trajo esa consulta. Si es mayor a 20, pongamos, hacés un delete del registro más viejo. ¿Cómo sabés cuál es el más viejo? Va a ser el que tenga el id (autoincremental) más bajo. También limitás ese delete a 1.

Esta rutina la vas a ejecutar cada vez que insertás un nuevo mensaje, así que sabés que el máximo posible de mensajes en la tabla va a ser 21, justo después de hacer un insert.

O sea que sólo tendrías que borrar 1, el más viejo, si el total de mensajes es mayor a 20.

Quedaría algo así:

DELETE FROM mensajes
ORDER BY id_mensaje
LIMIT 1;

(el order by no sé si es absolutamente necesario, porque por defecto ordena por la clave primaria, pero por las dudas...)


Suerte
Califa
  #5 (permalink)  
Antiguo 29/08/2006, 22:13
 
Fecha de Ingreso: agosto-2006
Mensajes: 8
Antigüedad: 17 años, 8 meses
Puntos: 0
Muchas gracias por la respesta califa010. Estuve intentando hacerlo, pero la verdad, no me sale. No domino demasiado PHP, y menos SQL
No se si podrias ponerme aunque sea algo de codigo para guiarme un poco.

Desde ya, muchas gracias
  #6 (permalink)  
Antiguo 30/08/2006, 06:30
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Iniciado por Mr. Outer Ver Mensaje
Muchas gracias por la respesta califa010. Estuve intentando hacerlo, pero la verdad, no me sale. No domino demasiado PHP, y menos SQL
No se si podrias ponerme aunque sea algo de codigo para guiarme un poco.

Desde ya, muchas gracias
En ese caso creo que lo primero sería implementar tu sistema en "PHP estructurado" .. por qué si no dominas a ese nivel PHP .. dificil será luego que implementes "métodos" por ejemplo en un objeto (classe).

Si trabajas datos en BBDD .. es necesario SI o SI conocer SQL ampliamente (y diseño de BBDD .. normalización .. etc).

De hecho los problemas que parece tener son de SQL .. así que te recomendaría usar el foro de "Base de datos" para aclarar esos puntos antes de continuar con "PHP".

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #7 (permalink)  
Antiguo 30/08/2006, 19:38
 
Fecha de Ingreso: agosto-2006
Mensajes: 8
Antigüedad: 17 años, 8 meses
Puntos: 0
Cita:
Iniciado por Cluster Ver Mensaje
En ese caso creo que lo primero sería implementar tu sistema en "PHP estructurado" .. por qué si no dominas a ese nivel PHP .. dificil será luego que implementes "métodos" por ejemplo en un objeto (classe).

Si trabajas datos en BBDD .. es necesario SI o SI conocer SQL ampliamente (y diseño de BBDD .. normalización .. etc).

De hecho los problemas que parece tener son de SQL .. así que te recomendaría usar el foro de "Base de datos" para aclarar esos puntos antes de continuar con "PHP".

Un saludo,
Respecto a lo de hacerlo en "PHP estructurado", no estoy muy de acuerdo. Creo que hacerlo OO no es mucho mas dificil.

Y de SQL se solo lo basico, pero voy a seguir tu recomendacion de aprenderlo a fondo, por que creo que varias cosas que intenté hacer con PHP, las podria haber echo en una linea de SQL.
Bueno, entonces el codigo PHP no tiene errores?, el problema es mi manejo del SQL?

Muchas gracias por la ayuda.
  #8 (permalink)  
Antiguo 30/08/2006, 20:28
 
Fecha de Ingreso: enero-2006
Ubicación: Buenos Aires, Argentina
Mensajes: 299
Antigüedad: 18 años, 3 meses
Puntos: 5
Buenas,

Cita:
Respecto a lo de hacerlo en "PHP estructurado", no estoy muy de acuerdo. Creo que hacerlo OO no es mucho mas dificil.
Coincido en que escribir una clase es relativamente simple (o no mucho más complicado que hacer lo mismo "estructurado"; al fin y al cabo estás metiendo funciones dentro de clases; si sabés escribir funciones, la sintaxis de objetos en sí no cambia mucho). Diseñar algo orientado a objetos es la parte complicada, que requiere de un conocimiento más profundo y experiencia. Digo, para hacer algo realmente orientado objetos, reutilizable, escalable, más fácil de mantener y demás, aplicando patrones, herencia, composición, etc, etc. Así que en este caso, si querés hacerlo con objetos, no creo que te cambie mucho el panorama (de todas maneras podrías hacerlo primero "estructurado" y después adaptarlo, pero como prefieras).

La verdad, no veo nada demasiado avanzado en cuanto a sql. Estás haciendo un insert, un select y un delete, todo sobre una sola tabla.

Pero, por si te da una pista:

SELECT COUNT(*) AS Total
FROM mensajes ;

Esto te devuelve una tabla con una columna, "Total", y una sola fila, que tiene, justamente, el total de registros de la tabla. Con ese dato, podés saber si tenés que borrar algún registro o no (si es mayor que 20, en tu ejemplo).

Sólo en ese caso, pasás a:

DELETE FROM mensajes
ORDER BY id_mensaje
LIMIT 1;

Acá lo que estás haciendo es ordenar la tabla mensajes según el id_mensaje (que es una clave primaria, autonumérica), y borrás sólo un registro (LIMIT 1), el primero. Si no usaras LIMIT 1, estarías borrando todos.

Lo que tendrías que hacer, entonces, es integrar esas consultas a la parte php, ya sea "estructurado" o con objetos.

Suerte
Califa

Última edición por califa010; 30/08/2006 a las 20:34
  #9 (permalink)  
Antiguo 31/08/2006, 14:07
 
Fecha de Ingreso: agosto-2006
Mensajes: 8
Antigüedad: 17 años, 8 meses
Puntos: 0
Califa010, muchas gracias por describirlo de nuevo, creo que ya entendi un poco mejor, a ver si ahora sale algo...

Saludos
  #10 (permalink)  
Antiguo 31/08/2006, 19:17
 
Fecha de Ingreso: agosto-2006
Mensajes: 8
Antigüedad: 17 años, 8 meses
Puntos: 0
Listo, aca esta el codigo, aparentemente anda todo bien:

Código PHP:
<?php
if(isset($_POST['nombre']) && isset($_POST['mensaje'])) {
   class 
tagboard {   
      private 
$db;
      
      public function 
__construct() {
         
$this->db mysql_connect("host""usuario""password");
         
mysql_select_db("tag"$this->db);
      }
      
      public function 
insertarMensaje($nombre$mensaje) {
         
$resultado mysql_query("select count(*) as total from tagboard");
         
$fila mysql_fetch_assoc($resultado);
     if (
$fila['total'] < 20) {
        
mysql_query("insert into tagboard(id, nombre, mensaje) values(0, \"$nombre\", \"$mensaje\")");
     }
     else {
        
mysql_query("delete from tagboard order by id limit 1");
        
mysql_query("insert into tagboard(id, nombre, mensaje) values(0, \"$nombre\", \"$mensaje\")");
     }
      }
      
      public function 
imprimirMensajes() {
         
$resultado mysql_query("select nombre, mensaje from tagboard order by id desc");
     while ((
$fila mysql_fetch_assoc($resultado))) {
        echo 
"<p><strong>".$fila['nombre'].": </strong>".$fila['mensaje']."</p>";
         }
      }
   }
   
   
$nombre $_POST['nombre'];
   
$mensaje $_POST['mensaje'];
   
   
$tagboard = new tagboard;
   
$tagboard->insertarMensaje($nombre$mensaje);
   
$tagboard->imprimirMensajes();
}
else {
?>
<form action="<?php $PHP_SELF ?>" method="post">
<p>Nombre: <input type="text" name="nombre" /></p>
<p>Mensaje: <input type="text" name="mensaje" /></p>
<input type="submit" value="Enviar" />
</form>
<?php
}
?>
El codigo me quedo mucho mas corto que el anterior, evidentemente un buen manejo de SQL es esencial para desarrollar con PHP.

Lo unico que me preocupa es que el numero de id termine siendo muy alto, preferiria que siempre sea del 1 al 20, pero no se si sera posible.

Muchas gracias califa010 por la ayuda para crearlo
  #11 (permalink)  
Antiguo 31/08/2006, 20:48
 
Fecha de Ingreso: enero-2006
Ubicación: Buenos Aires, Argentina
Mensajes: 299
Antigüedad: 18 años, 3 meses
Puntos: 5
De nada

Cita:
Lo unico que me preocupa es que el numero de id termine siendo muy alto, preferiria que siempre sea del 1 al 20, pero no se si sera posible.
En cuanto a esto no me preocuparía. De última, si ves que el número se hace muy alto, y por ejemplo tenés en esa columna como INT(4), le subís la cantidad de dígitos y ya está. Con INT podés llegar hasta 10, creo, después pasarías a BIGINT (pero igual, tené en cuenta que estamos hablando de números astronómicos). Es cierto que cuanto más chico sea el campo, mejor, pero si necesitás más "espacio", bueno, para eso está; los servidores de bases de datos están preparados para hacer frente a muchísima más carga que la que estarías generando acá; y aunque el tamaño de los índices va a ser más grande, la tabla igual va a ser muy chica, así que no vas a tener inconvenientes para nada.

Y, en cualquier caso, lo que estás haciendo ahora es muchísimo más eficiente (y simple, tanto para vos como para el server DB) que estar "haciendo lugar" y reordenando registros todo el tiempo.

Suerte
Califa

Última edición por califa010; 31/08/2006 a las 21:24
  #12 (permalink)  
Antiguo 01/09/2006, 06:18
 
Fecha de Ingreso: agosto-2006
Mensajes: 8
Antigüedad: 17 años, 8 meses
Puntos: 0
OK, muchas gracias por la aclaracion

Saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 12:03.