Como crear sistema de comentario CON base de datos

Saludos, lo que me lleva a escribir esto es que tengo una web diseñada para una asociación de estudiantes de la universidad y quería poner un apartado de noticias donde cada socio (controlo ya el tema de registros y zonas betadas xD) pueda poner una noticia que le haya parecido interesante.

Mi idea era colocar un formulario donde hubiera como opciones "Título", "Noticia" y "Fuente" y una parte oculta del formulario que tomara la cookie instalada con su nombre de usuario (El sistema de registro va por cookies).

La parte complicada viene cuando me pongo a pensar cómo demonios ahgo que eso que envían a la base de datos (por que supongo que el formulario deberá ser enviado a la base de datos) se muestre en la web como un comentario con fecha, hora, nombre de usuario y el comentario en sí.

Se me ocurre ahora crear elf ormulario que mando los datos, que estos seguarden en la base de datos y que al mismo tiempo y en la mísma página haya un php que los recupere para mostrarlos pero no sé hasta que punto esto mantendría los mensajes y no borraría los antiguos y dejaría a la vista los nuevos...

He encontrado este tutorial pero me pierdo practicamente en la primera línea. Espero puedan ayudarme.

http://www.scourdesign.com/articulos/tutoriales/php/tutoriales-php-…
Hola (de nuevo XD):

La lógica ya la tienes, solamente debes implementarlo.

Se me ocurre ahora crear elf ormulario que mando los datos, que estos seguarden en la base de datos y que al mismo tiempo y en la mísma página haya un php que los recupere para mostrarlos pero no sé hasta que punto esto mantendría los mensajes y no borraría los antiguos y dejaría a la vista los nuevos...

Eso es lo que debes hacer y no te preocupes por "borrar" los antigüos, puesto que estos no se borran, solamente se muestran en la página. El orden depende de cómo los extraigas de la base de datos:

mysql_query("SELECT * FROM tabla WHERE columna = \'valor\' ORDERED BY columna ASC'); ORDERED BY le dice a la sentencia SQL que quieres que los datos se ordenen en base a la columna especificada, en este caso, en orden ascendente (ASC, el valor que toma por defecto). También puede ser en orden descendente (DESC). Generalmente, la columna utilizada para ordenar un sistema de comentarios sería la fecha.

Ordena lo que debes hacer:

1.- Tengo que crear un formulario que envie la información a un archivo php que los procese. ¿Qué información debo enviar?:
a) Nombre.
b) Email (aunque debería ser opcional).
c) Contenido del comentario.
d) Fecha.

2.- ¿Cómo paso esta información al archivo que los procesa? Ya sabes cómo pasar la información, pero ¿la fecha?. Hay una función en PHP que obtiene la fecha, así que puedes obtener la fecha en el archivo que procesa los datos o en un <input type="hidden" value="<?php print date('o/m/d'); // 2011/06/17 ?> /> con la fecha. Aquí esta la documentación de date en PHP.

3.- Recibo los datos en el archivo que los procesa y los inserto en la base de datos. Esto también deberías saber hacerlo con la excepción, quizás, de la fecha. En MySQL (y cualquier base de datos) las fechas tienen un formato que debe seguirse (si es que se utiliza el tipo de dato date o datetime). Este formato es YYYY:MM:DD (Y = year/año, M = month/mes, D = day/día).

4.- Si la inserción de datos funcionó correctamente, entonces volver a la página de comentarios y mostrar los comentarios (o mostrar un mensaje en caso de no haberlos). En el enlace que proporcionas te dicen exactamente lo que debes hacer.

Creo que eso es todo. Intenta resolverlo y avísame como te va.

Saludos.
Ok, voy a seguir los pasos esta noche y a ver que tal va, comentaré si tengo algúna duda o problema inesperado pero parece todo bastante claro. No te vayas muy lejos por si acaso ajajajajaja.
De momento todo va bien, tus indicaciones fueron de maravilla (sobre todo el tema de como meter un <?php ?> dentro de un <form></form> y a su vez dentro de un apartado de texto de un cuestionario pero al final he conseguido ahcer registro de titulo, noticia, nombre de usuario (lo saco de una cookie que instalo al hacer log in) y la fecha. Solo he retocado lo de la cookie que no funconó hasta que puse "print" delante y lo de la fecha que gracias a tu link registro también hora, minutos y segundos. Ahora que tengo todo registrado voy a probar a mostrar el texto del mensaje ^^. Deseame suerte jajajaja. Pongo como va de momento el código por si a alguien le ahce falta y marco en rojo las cosas que son cosa mía y que se pueden modificar según criterios aún que en realidad es todo:

CUESTIONARIO QUE MANDA LA INFORMACIÓN AL SERVIDOR:

<form method="get" action="[COLOR="red"]receptor.php[/COLOR]">
<input type="text" name="[COLOR="red"]titulo[/COLOR]" value="[COLOR="red"]Título de tu noticia[/COLOR]" size="30" maxlength="100" ><br /><br />
<textarea rows="10" name="[COLOR="red"]noticia[/COLOR]" cols="30" wrap="soft">[COLOR="red"]Escribe aquí tu noticia[/COLOR]</textarea><br />
<input type="submit" value="Enviar noticia" name="Enviar la información al servidor" /><br />
<input type="hidden" name="[COLOR="red"]usuario[/COLOR]" value="<?php print [COLOR="red"]$HTTP_COOKIE_VARS["usuario"][/COLOR]?>"/><br />
<input type="hidden" name="[COLOR="red"]fecha[/COLOR]" value="<?php print [COLOR="red"]date('o/m/d/G:i:s')[/COLOR];?>"/><br />
</form>

ARCHIVO QUE GUARDA LOS DATOS EN EL SERVIDOR (YO LE HE LLAMADO receptor.php Y PRETENDO QUE TAMBIÉN MUESTRE LAS NOTICAS AÚN QUE NO ES INDISPENSABLE):

<?php
include("[COLOR="red"]config.php[/COLOR]") ;
mysql_connect($server, $db_user, $db_pass) or die ("error1".mysql_error());
mysql_select_db($database) or die ("error2".mysql_error());
mysql_query ("INSERT INTO [COLOR="red"]NOTICIAS[/COLOR](`[COLOR="red"]TITULO[/COLOR]`, `[COLOR="red"]NOTICIA[/COLOR]`, `[COLOR="red"]USUARIO[/COLOR]`, `[COLOR="red"]FECHA[/COLOR]`) VALUES ('$_GET[[COLOR="red"]titulo[/COLOR]]', '$_GET[[COLOR="red"]noticia[/COLOR]]', '$_GET[[COLOR="red"]usuario[/COLOR]]', '$_GET[[COLOR="red"]fecha[/COLOR]]')");
?>

Explico un poco este último: config.php es una llamada a este archivo que es donde están mi contraseña y todos los datos del servidor (temas de seguridad, para evitar que salgan reflejados si alguna vez necesito usar un tipo get o si hay algún espia por ahí xD). el resto son las columnas donde introducir los datos y los valores procedentes de el formulario.

CONTINARÉ CON EL CÓDIGO QUE SACA LOS POST A LA VISTA EN CUANTO SEPA HACERLO xD. Un saludo!!!!
Una sugerencia: si bien los input de tipo "hidden" estan escondidos para el navegador, al explorar el código fuente (control + u o ver -> codigo fuente) sí se puede ver el contenido, por ende el usuario estara a la vista de quien revise el código fuente. Una forma de prevenir esto es codificar el usuario para que se vea algo incoherente para las personas.

Busca la función base64_encode() y base64_decode() de php, que es la forma más simple para codificar/decodificar cadenas de texto (strings).

Saludos :D.
A ver jajaja te comento:

Resulta que ya es tarde (las 2:42) así que me voy a ir a la cama pero quería dejar constancia de los problemas que me he encontrado. Estos son los códigos y sus respectivos problemas:

CÓDIGO DEL FORMULARIO Y EL ENVÍO DE LOS DATOS (PRACTICAMENTE NO HA CAMBIADO, SOLO HE AÑADIDO QUE GUARDE TAMBIÉN UNA FUENTE DE LA NOTICIA):

<form method="post" action="receptor.php">
<input type="text" name="titulo" value="Título de tu noticia" size="30" maxlength="100" ><br />
<br />
<textarea rows="10" name="noticia" cols="30" wrap="soft">Escribe aquí tu noticia</textarea><br />
<input type="text" name="fuente" value="Fuente de la noticia" size="30" maxlength="100" ><br />
<input type="submit" value="Enviar noticia" name="Enviar la información al servidor" /><br />
<input type="hidden" name="usuario" value="<?php print $HTTP_COOKIE_VARS["usuario"]?>"/><br />
<input type="hidden" name="fecha" value="<?php print date('o/m/d/G:i:s');?>"/><br />
</form>

Problemas: Ninguno destacable salvo el tema de encriptar el usuario (muy interesante pero prefiero dejarlo para lo ultimo).

PÁGINA RECEPTORA DE LA INFORMACIÓN Y QUE LA ALMACENA:

<?php
if ($_POST[titulo]=="[COLOR="blue"]NULL[/COLOR]" && $_POST[noticia]=="[COLOR="blue"]NULL[/COLOR]" && $_POST[usuario]=="[COLOR="blue"]NULL[/COLOR]" && $_POST[fecha]=="[COLOR="blue"]NULL[/COLOR]" && $_POST[fuente]=="[COLOR="blue"]NULL[/COLOR]")
{echo "<p>DEBES RELLENAR TODOS LOS CAMPOS PARA PUBLICAR LA NOTICIA, SI NO CONOCES LA FUENTE APROXIMALA Y SI NO CONOCES EL TÍTULO PONSELO TU MISMO</p>";}
else 
{include("config.php") ;
mysql_connect($server, $db_user, $db_pass) or die ("error1".mysql_error());
mysql_select_db($database) or die ("error2".mysql_error());
mysql_query ("INSERT INTO NOTICIAS(`TITULO`, `NOTICIA`, `USUARIO`, `FECHA`, `FUENTE`) VALUES ('$_POST[titulo]', '$_POST[noticia]', '$_POST[usuario]', '$_POST[fecha]', '$_POST[fuente]')");
echo "Noticia publicada, pulsa <a href=\"mostrador.php\">aquí</a> para verla o <a href=\"../index.php\">aquí</a> para volver a la página inicial";}
?>

Problemas:No he conseguido unificarla con la página que muestra el post así que la he dividido. Fundamentalmente a la hora de tomar la condición del "if" la he puesto para que si alguien se deja algún campo en blanco le salga un mensaje como que no ha rellenado un campo pero a la hora de la verdad si dejas la casilla en blanco siempre sale como que has posteado es decir, que siempre se cumple la condición así que creo que el error está en los valores que he coloreado de azul o en los condicionantes intermedios. Por lo demás bien, cumple la función de almacenar, aún que he notado que almacena siempre la misma hora para un determinado usuario y la repite cada vez que ese usuario postea.

PÁGINA AÑADIDA PARA MOSTRAR EL POST:

<?php
if ($_POST[titulo]=="NULL" && $_POST[noticia]=="NULL" && $_POST[usuario]=="NULL" && $_POST[fecha]=="NULL" && $_POST[fuente]=="NULL")
{echo "<p>DEBES RELLENAR TODOS LOS CAMPOS PARA PUBLICAR LA NOTICIA, SI NO CONOCES LA FUENTE APROXIMALA Y SI NO CONOCES EL TÍTULO PONSELO TU MISMO</p>";}
else 
{include("config.php") ;
mysql_connect($server, $db_user, $db_pass) or die ("error1".mysql_error());
mysql_select_db($database) or die ("error2".mysql_error());
mysql_query ("INSERT INTO NOTICIAS(`TITULO`, `NOTICIA`, `USUARIO`, `FECHA`, `FUENTE`) VALUES ('$_POST[titulo]', '$_POST[noticia]', '$_POST[usuario]', '$_POST[fecha]', '$_POST[fuente]')");
echo "Noticia publicada, pulsa <a href=\"mostrador.php\">aquí</a> para verla o <a href=\"../index.php\">aquí</a> para volver a la página inicial";}
?>

Problemas: TODOS! xD Finalmente la he tenido que separar de la anterior, además no muestra los mensajes (cuando estaba unificado en la misma página con el de ariba si los mostraba pero solo tras rellenar el formulario, al salir se borraba (aún que en la base de datos seguía registrado). Este me da que v a aser mi GRAN quebradero de cabeza.


MUCHAS GRACIAS A TODO AQUEL QUE PUEDA AYUDARME ^.^
Los problemas de la página receptora son simples.

...a la hora de la verdad si dejas la casilla en blanco siempre sale como que has posteado es decir, que siempre se cumple la condición así que creo que el error está en los valores que he coloreado de azul o en los condicionantes intermedios...

Eso ocurre porque la condición if está mal formada. Analiza la condición, dice:

// null no debe ir entre comillas y la fecha no debería ser una condición,
// puesto que de estar vacía, entonces se corresponde con un error del script y no del usuario
if($_POST['titulo'] == null && $_POST['noticia'] == null && $_POST['usuario'] == null && $_POST['fecha'] == null && $_POST['fuente'] == null)

Esto se puede traducir como: solamente sí título es igual a null, noticia es igual a null, usuario es igual a null, fecha es igual a null y fuente es igual a null, entonces, y sólo entonces ejecutará lo que sigue, de lo contrario ejecutará la inserción de los datos en la base de datos. Por si no lo sabes, para que una cláusula if se ejecute, la condición de esta debe ser true/verdad, de lo contrario se ejecuta else. Entonces, en la condición anterior, si alguno de los campos no esta vacío (o no vale null), la condición ya no se cumple y salta al else; dicho de otra forma, la condición solo se cumplirá si todos los campos son iguales a null y no si es que alguno de ellos esta vacio o vale null.

La condición correcta sería: if($_POST['titulo'] == null || $_POST['noticia'] == null || $_POST['usuario'] == null || $_POST['fecha'] == null || $_POST['fuente'] == null). De esta forma estas diciendo "Si alguno de lo campos vale null, entonces se ejecutará lo que sigue".

Si bien las sentencias están bien y deberían funcionar, puede ser problemático el orden que utilizas ahora para solucionar problemas. Te aconsejo que utilices variables para cada sentencia mysql (o "or die('error...');"):
$enlace = mysql_connect($server, $db_user, $db_pass) or die ("error1".mysql_error());
mysql_select_db($database, $enlace);
$result = mysql_query("INSERT INTO NOTICIAS(TITULO, NOTICIA, USUARIO, FECHA, FUENTE) VALUES ('" .$_POST['titulo']. "', '" .$_POST['noticia']. "', '" .$_POST['usuario']. "', '" .$_POST['fecha']. "', '" .$_POST['fuente']. "')");
if(!$result) // Si resultado esta vacío o es null
  print 'ERROR: no se ha podido publicar el comentario/noticia.<br />Error: ' .mysql_error($enlace). '.<br />Código de error: ' .mysql_errno($enlace). '.';
else {
  print "Noticia publicada, pulsa <a href=\"mostrador.php\">aquí</a> para verla o <a href=\"../index.php\">aquí</a> para volver a la página inicial";
}

Espero haberte ayudado en algo, saludos (recién es la 1:37, así que también me voy a dormir XD).
Ok, la página receptora está lista. Ahora llega el problema de la página que muestra la información, me puedes echar una mano con ella?¿ Es la peor de todas :S
Ok... primero que nada, como dice aquel dicho que la mayoría de los programadores utilizan "divide y vencerás", aquí (y siempre que tengas que resolver un problema) también debes dividir el problema: ¿Qué tengo que hacer para mostrar los comentarios?

1.- Tengo que extraer los comentarios desde la base de datos. Ya tengo los datos, ¿que hago ahora?.
2.- Tengo que procesar los datos y mostrarlos. Esto quiere decir que tengo que, de alguna manera, ordenar los datos para que encajen en un código HTML para luego mostrarlos. Pista: puedes mostrarlos bajo el formulario que envia los comentarios (si no hay resultados, muestra un mensaje diciendo que no hay mensajes publicados - tomalo como una tarea XD).

Intenta hacerlo solo y si no puedes te ayudo más allá :D.

Saludos.

P.D. por si es que no sabes extraer los datos, la consulta (SQL) puede ser esta SELECT * FROM tabla_comentarios;, la que extraerá todas las columnas (y filas) de la tabla. Para mostrarlos, puedes utilizar un bucle while(): while($fila = mysql_fetch_array($resultado_consulta_sql, TIPO) { //mostrar datos }. El TIPO es opcional y puede ser uno de los siguiente:

MYSQL_ASSOC: devuelve un arreglo asociativo, vale decir que, los índices del arreglo no tendrán números, en su lugar estarán los nombres de la columna: $mysql_assoc['columna'].

MYSQL_NUM: al contrario del anterior, esta constante devuelve un arreglo con índices numéricos: $mysql_num[0], $mysql_num[1], $mysql_num.

MYSQL_BOTH (por defecto): devuelve un arreglo con indices numéricos y asociativos, por lo que se puede acceder a cada valor en base a un número o el nombre de la columna.