Estás en Inicio / Editorial / Desarrollo Web
17.06.2003
En este tutorial crearemos un foro desde cero aprendiendo a separar la programación del diseño, y modularizando nuestra aplicación para que sea simple de configurar y de adaptar.
Primero y antes que nada, debemos preparar la tabla en la base de datos que
contendrá todos los temas de nuestro foro. Lo que esta tabla tendrá, es la información
de nuestros mensajes, el autor del mismo, y otros datos que servirán para identificar
a que Tema pertenece un mensaje. Pero mejor, veamos la estructura propuesta:
CREATE TABLE `foro` ( `id` int(7) NOT NULL auto_increment, `autor` varchar(200) NOT NULL default '', `titulo` varchar(200) NOT NULL default '', `mensaje` text NOT NULL, `fecha` datetime NOT NULL default '0000-00-00 00:00:00', `respuestas` int(11) NOT NULL default '0', `identificador` int(7) NOT NULL default '0', `ult_respuesta` datetime default NULL, KEY `id` (`id`) ) TYPE=MyISAM;
Veamos en detalle que campos tendrá nuestra tabla de Foros:
La sentencia SQL anterior,
pueden guardarla en un archivo.sql y correrla en su base de datos desde el
href="http://phpmyadmin.sourceforge.net/">phpMyAdmin,
o si lo prefieren, pueden ingresarla línea por línea en un cliente
de texto de mySQL ( como el mySQL monitor). Una vez que hayan creado la tabla
en su base de datos, entonces podemos avanzar al siguiente paso.
Antes de ponernos a programar cualquier parte del foro, vamos a encargarnos
de hacer un pequeño script que realice una tarea que vamos a repetir mucho,
y que es conectarnos a la base de datos. Este script lo incluiremos en cada
página en la que tengamos que acceder a la base de datos:
Ejemplo de la pagina de configuracion.php
<?php $bd_host = "localhost"; $bd_usuario = "user"; $bd_password = "password"; $bd_base = "nuestra_bd"; $con = mysql_connect($bd_host, $bd_usuario, $bd_password); mysql_select_db($bd_base, $con); ?>
Cómo vemos, no hay gran ciencia en este script, tan solo
unas variables conteniendo la configuración de nuestra base de datos, y el código
mínimo y necesario para conectarnos y guardar el recurso de conexión en una
variable $con que luego utilizaremos cuando
hagamos nuestras consultas.
Antes de dar un paso más en la explicación, quiero hacerles unos comentarios
respecto al "simple" sistemita de templates que utilizaremos en el foro. Primero,
para aquellos que no sepan que es un Template, les recomiendo que lean los artículos
de
href="http://www.zonaphp.com/index.php?modulo=articulo&accion=leer&id=9">Nok y de
href="http://www.zonaphp.com/index.php?modulo=articulo&accion=leer&id=16">Luigi en nuestra sección de Templates de
href="http://www.zonaphp.com/">Zonaphp.com,
por lo menos para que tomen una idea de que son y para que sirven.
Ahora, mi idea al utilizar templates, fue la de que los usuarios, pudieran modificar
a su gusto el aspecto del foro, sin por ello tener que tocar el código de la
aplicación. Esto es algo que el tutorial anterior no tenía en cuenta e incluía
todo el código HTML de salida dentro del código mismo del foro, lo cual no es
siempre recomendable. Lo que haremos en este caso es utilizar archivos .html
que dentro contendrán solo diseño ( o sea, código HTML ) y en los lugares en
los que deseemos colocar contenido "dinámico", utilizaremos el formato simple
para mostrar el contenido de variables, esto es : <?=$variable?>.
Para "interpretar" un template, primero lo leemos en memoria utilizando
la función file() y luego utilizaremos una
simple función a la que le pasaremos como parámetro el template y las variables
que hay que reemplazar. Para muestra, basta un botón:
Ejemplo de la pagina de ejemplo.html
Nombre: <b><?=$nombre?></b><br> Edad : <b><?=$edad?></b><br> Domicilio : <?=$domicilio?> <hr>
Ejemplo de la pagina de ejemplo.php
<?php
function mostrarTemplate($tema, $variables)
{
//var_dump($variables);
extract($variables);
eval("?>".$tema."<?");
}
$agenda = array(
"0" => array("nombre"=>"Marcelo", "edad"=>"25", "domicilio"=>"VeraCRuz 342"),
"1" => array("nombre"=>"Alejandra", "edad"=>"18", "domicilio"=>"Los Olmos 67"),
"2" => array("nombre"=>"Micaela", "edad"=>"23", "domicilio"=>"Prof. Mariño 8")
);
$tpl = implode("", file("ejemplo.html"));
foreach($agenda as $registro)
{
mostrarTemplate($tpl, $registro);
}
?>
Aquí vemos como, partiendo de los datos que tenemos en
un array, los mostramos basándonos en un simple template. La función mostrarTemplate toma como parámetros el contenido del template y un array asociativo con los
valores a reemplazar. La función de PHP extract() se encarga de pasar estos valores al ámbito en el que se llama la función, en
este caso, el ámbito de la función. Por lo que si tenemos un arreglo del tipo $a = array("clave" => "valor"), al ejecutar extract($a), entonces pasaremos a tener
una variable disponible, de nombre $variable y con "valor" como contenido. Luego, la función eval() se encarga del resto, o sea, de ejecutar todo el código (el del Template) que
se le pasa como parámetro.
Algunos se preguntarán, porqué no hacemos simplemente un "include"
? La respuesta es muy siemple. Eficiencia. La función include implica un acceso
a disco, lo cual la hace bastante "costosa" en términos de eficiencia. Así que
leyendo el template 1 sola vez en memoria, y luego utilizándolo varias veces,
hacemos un mejor uso de los recursos.
Teniendo estos temas en cuenta, es que podemos seguir ahora con el desarrollo
el Foro.
Ya teniendo las bases de nuestro foro, el diseño de la tabla en la base de datos
y conociendo como funciona nuestro sistema de templates, podemos comenzar a
crear la primera página, en la que mostraremos todos los temas del foro:
Ejemplo de la pagina de index.php
<?php
require('configuracion.php');
require('funciones.php');
include('header.html');
/* Pedimos todos los temas iniciales (identificador==0)
* y los ordenamos por ult_respuesta */
$sql = "SELECT id, autor, titulo, fecha, respuestas, ult_respuesta ";
$sql.= "FROM foro WHERE identificador=0 ORDER BY ult_respuesta DESC";
$rs = mysql_query($sql, $con);
if(mysql_num_rows($rs)>0)
{
// Leemos el contenido de la plantilla de temas
$template = implode("", file("temas.html"));
include('titulos.html');
while($row = mysql_fetch_assoc($rs))
{
$color=($color==""?"#5b69a6":"");
$row["color"] = $color;
mostrarTemplate($template, $row);
}
}
include(’footer.html’);
?>
¿Eso es todo? Si, eso es todo. Ahora revisemos paso a
paso lo que hace el script. Primero tenemos una serie de requires
e includes.
El primero incluye el primer Script que hicimos, que realiza la conexión a la
base de datos. El segundo, incluye un archivo.php que contiene funciones importantes
del foro, como por ejemplo, mostrarTemplate.
El tercero, incluye un header genérico que utilizaremos para darle a todas nuestras
páginas, un diseño similar. Allí podremos colocar un logo del sitio, links importantes,
banners, etc.
$sql = "SELECT id, autor, titulo, fecha, respuestas, ult_respuesta ";
$sql.= "FROM foro WHERE identificador=0 ORDER BY ult_respuesta DESC";
$rs = mysql_query($sql, $con);
if(mysql_num_rows($rs)>0)
{
Aquí lo que hacemos es ejecutar un query en la
base de datos, que nos traerá todos los mensajes que son iniciadores de un tema,
o sea, cuyo identificador esté en cero. El resto de los mensajes, que sean respuestas
a un tema en particular, tendrán en el campo identificador el valor del mensaje
al que responden. A estos temas, le pedimos a la base que los ordene por la
fecha de última respuesta, de manera descendente, así en nuestro foro, tendremos
los mensajes más recientes primero. También realizamos una decisión, solo mostraremos
los temas de nuestro Foro si la cantidad de filas recuperadas desde la base,
son mayores a 0.
Luego, dentro del While principal del programa, hacemos toda la "magia" :
// Leemos el contenido de la plantilla de temas
$template = implode("", file("temas.html"));
include('titulos.html');
while($row = mysql_fetch_assoc($rs))
{
$color=($color==""?"#5b69a6":"");
$row["color"] = $color;
mostrarTemplate($template, $row);
}
Aquí comenzamos a trabajar por primera vez con
los templates. Primero leemos el contenido del template en memoria y lo guardamos
dentro de la variable $template. También
incluimos un archivo, que contiene una fila de la tabla de Temas, con los títulos
de las celdas. EL resto ya lo vimos anteriormente, llamando a la función mostrarTemplate mostramos los datos de cada tema.
Finalmente, solo agregamos otro archivo HTML, con el código para cerrar la página
y mostrar algún que otro mensaje de Copyright (o lo que queramos poner).
Con esto ya tenemos nuestra página inicial del Foro, mostrando los temas que
haya. Ahora, vamos a crear el formulario necesario para ingresar nuevos temas
o para responder algún tema existente.
El ahorro es la base de la fortuna, suelen decir, y esto se aplica a casi todo.
Así que, haciendo caso al dicho, podemos utilizar el MISMO formulario para crear
un nuevo tema y para contestar un tema en particular. Esto lo vamos a lograr,
pasando una variable por el URL, indicando que estamos citando un mensaje anterior,
sacando de la base de datos el mensaje que citaremos, y completando el formulario
con esos datos. Si la variable no está presente, entonces no hacemos nada y
mostramos el formulario.
Ejemplo de la pagina de respuesta.php
<?php
require('funciones.php');
$id = $_GET["id"];
$citar = $_GET["citar"];
$row = array(”id” => $id);
if($citar==1)
{
require(’configuracion.php’);
$sql = “SELECT titulo, mensaje, identificador AS id “;
$sql.= “FROM foro WHERE id=’$id’”;
$rs = mysql_query($sql, $con);
if(mysql_num_rows($rs)==1) $row = mysql_fetch_assoc($rs);
$row["titulo"] = “Re: “.$row["titulo"];
$row["mensaje"] = “[citar]“.$row["mensaje"].”[/citar]“;
if($row["id"]==0) $row["id"]=$id;
}
$template = implode(”", file(’formulario.html’));
include(’header.html’);
mostrarTemplate($template, $row);
include(’footer.html’);
?>
En el script vemos como primero capturamos de la URL,
las variables $id y $citar,
y si ésta última es igual a 1, entonces consultamos en la base de datos toda
la información del tema que estamos citando, para agregarlo en el arreglo $row,
que luego será pasado al template. Noten como al titulo del mensaje, le anteponemos
la cadena "Re:", indicando que es una respuesta, y como al cuerpo del mensaje,
si estamos citando, lo rodeamos por un tag [citar] y [/citar]. Esto lo veremos más adelante.
Ejemplo de la pagina de formulario.html
<table width="90%" border="0" cellspacing="2" cellpadding="2">
<form name="f" action="agregar.php" method="post">
<input type="hidden" name="identificador" value="<?=$id?>">
<tr>
<td width="30%" align="right">Autor </td>
<td><input type="text" name="autor"></td>
</tr>
<tr>
<td width="30%" align="right">Titulo</td>
<td><input type="text" name="titulo" value="<?=$titulo?>"></td>
</tr>
<tr>
<td width="30%" align="right">Mensaje</td>
<td><textarea name="mensaje" cols="50" rows="5"><?=$mensaje?></textarea></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" name="Submit" value="Enviar Mensaje"></td>
</tr>
</form>
</table>
Aquí vemos como colocamos las variables dentro
de los atributos "value" de los inputs y el textarea. También podemos ver como
tenemos un campo escondido, llamado "identificador", que solo tendrá un valor
asignado, cuando estemos respondiendo a un mensaje, pero que no existirá cuando
sea un mensaje nuevo. Solo queda ver el script que se encarga de grabar el mensaje
en la base de datos, agregar.php.
Ejemplo de la pagina de agregar.php
<?php
require('configuracion.php');
$autor = $_POST["autor"];
$titulo = $_POST["titulo"];
$mensaje = $_POST["mensaje"];
$ident = $_POST["identificador"];
//Hacemos algunas validaciones
if(empty($autor)) $autor = “Anónimo”;
if(empty($titulo)) $titulo = “Sin título”;
//Evitamos que el usuario ingrese HTML
$mensaje = htmlentities($mensaje);
// Grabamos el mensaje en la base.
$sql = “INSERT INTO foro (autor, titulo, mensaje, identificador, fecha, ult_respuesta) “;
$sql.= “VALUES (’$autor’,'$titulo’,'$mensaje’,'$ident’,NOW(),NOW())”;
$rs = mysql_query($sql, $con) or die(”Error al grabar un mensaje: “.mysql_error);
$ult_id = mysql_insert_id($con);
/* si es un mensaje en respuesta a otro
actualizamos los datos */
if(!empty($ident))
{
$sql = “UPDATE foro SET respuestas=respuestas+1, ult_respuesta=NOW()”;
$sql.= ” WHERE id = ‘$ident’”;
$rs = mysql_query($sql, $con);
Header(”Location: foro.php?id=$ident#$ult_id”);
exit();
}
Header(”Location: index.php”);
?>
En este script, luego de tomar las variables desde el
formulario (con el método POST), primero verificamos que exista un nombre de
autor y el título del mensaje, caso contrario le asignamos un valor por defecto.
También utilizamos la función de PHP htmlentities() para convertir todos los caracteres especiales ( >, <, ", &, etc )
en sus respectivas entidades HTML ( >, <, "e;, &).
Con esto evitamos que un usuario ingrese código HTML en nuestro Foro (con la
respectiva vulnerabilidad que este implica).
A continuación, grabamos el mensaje en la base, y obtenemos, mediante la función mysql_insert_id(), el último id autoincremental
que le corresponde a este registro. ¿Para qué? Simple. Si este mensaje que acabamos
de grabar es el primero del tema, no necesitamos hacer nada, pero si es un mensaje
en respuesta a otro ( esto lo averiguamos preguntando por el valor de $identificador),
entonces tenemos que actualizar ese primer mensaje, indicando que tiene una
respuesta más, y cambiando la fecha y hora del último mensaje. De esa manera,
nos aseguramos que tenemos bien ordenado el foro, con los temas con nuevos mensajes
primero. Finalmente, dependiendo del caso, redirigimos al usuario al home del
foro, o a la respuesta que acaba de ingresar.
Ya solo nos queda un último paso, y es el de crear la página que mostrara un
tema y todas las respuestas que haya en él. Para ello, vemos como en el home
del foro, llamamos a un script foro.php y le pasamos el id del tema que queremos ver. Luego, solo tenemos que obtener
de la base el o los temas, en los que el id sea igual al que pasamos, o que
el identificador (el campo que indica que ese mensaje es en respuesta a cierto
tema) sea igual al identificador, los ordenamos por fecha y listo, foro al dente.
En este caso, el template que utilizaremos para mostrar cada uno de los mensajes,
será una tabla con todos los datos necesarios: el autor del mensaje, el título,
la fecha del mensaje, el mensaje en si mismo. Pero también agregaremos dos detalles.
Primero, un link hacia el formulario que creamos antes, de modo que un usuario
pueda citar un mensaje en particular, y segundo, un Anchor (o Ancla) para que
al responder a un mensaje, se pueda acceder directamente al mismo por su id
en la base de datos.
Ejemplo de la pagina de post.html
<table width="90%" border="0" align="center" cellpadding="2" cellspacing="2"> <tr bgcolor="<?=$color?>"> <td width="25%" valign="top"> <b><a name="<?=$id?>"><?=$autor?></a></b><br> <font size="-2">Enviado el : <?=$enviado?></font> </td> <td> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td><strong><font size="-1"> <?=$titulo?> </font></strong> </td> <td width="10%" align="right"> [ <a href="respuesta.php?id=<?=$id?>&citar=1">CITAR</a> ]</td> </tr> </table> <hr align=”center” width=”100%” size=”2″ noshade> <?=$mensaje?></td> </tr> <tr> <td colspan=”2″ height=”5″></td> </tr> </table>
Ahora, veamos el código PHP que utilizaremos para "parsear" este template:
Ejemplo de la pagina de foro.php
<?php
require('configuracion.php');
require('funciones.php');
$id = $_GET["id"];
if(empty($id)) Header(”Location: index.php”);
$sql = “SELECT id, autor, titulo, mensaje, “;
$sql.= “DATE_FORMAT(fecha, ‘%d/%m/%Y %H:%i:%s’) as enviado FROM foro “;
$sql.= “WHERE id=’$id’ OR identificador=’$id’ ORDER BY fecha ASC”;
$rs = mysql_query($sql, $con);
include(’header.html’);
if(mysql_num_rows($rs)>0)
{
include(’titulos_post.html’);
$template = implode(”", file(’post.html’));
while($row = mysql_fetch_assoc($rs))
{
$color=($color==”"?”#5b69a6″:”");
$row["color"] = $color;
//manipulamos el mensaje
$row["mensaje"] = nl2br($row["mensaje"]);
$row["mensaje"] = parsearTags($row["mensaje"]);
mostrarTemplate($template, $row);
}
}
include(’footer.html’);
?>
Como siempre, incluimos la conexión a la base de
datos, el archivo de funciones y validamos de que exista la variable $id,
ya que de lo contrario, nada podríamos hacer y nuestro foro fallaría en el Query.
Hablando del Query, podemos ver como utilizamos la función de mySQL DATE_FORMAT() para convertir el formato por defecto del tipo datetime (’AAAA-MM-DD hh:mm:ss’) en algo que sea más común para nuestro idioma (’DD/MM/AAAA
hh:mm:ss’). Si quieren más información sobre esta función, pueden visitar y
consultar el manual de
mySQL.
Lo más destacado en este script que podemos ver, son dos transformaciones que
le hacemos al mensaje, antes de enviarlo al template. Como vemos, primero utilizamos
la función de PHP nl2br(), que convierte
todos los saltos de linea, en tags <br />,
de esa manera, los saltos que un usuario ingrese en el textarea, serán agregados
correctamente al mostrar el mensaje. Luego, vemos como llamamos a la función parsearTags(). ¿Qué hace esta función? Veamos:
Ejemplo de la pagina de funciones.php
<?php
function parsearTags($mensaje)
{
$mensaje = str_replace("[citar]“, “<blockquote><hr width=’100%’ size=’2′>”, $mensaje);
$mensaje = str_replace(”[/citar]“, “<hr width=’100%’ size=’2′></blockquote>”, $mensaje);
return $mensaje;
}
?>
Dentro de esta función, podemos agregar todas las modificaciones
que queremos realizarle al mensaje, antes de mostrarlo en el Foro. En el ejemplo,
vemos como hemos implementado el uso de un tag propio, [citar].
El mismo, dentro de la función, será reemplazado por el código HTML necesario
para destacar el citado de un mensaje, todo esto gracias a la función str_replace() de PHP (más info en el manual). Este es el tag [citar] que se agrega automáticamente, y que notamos cuando respondíamos un mensaje.
Esta función, pueden personalizarla de la manera que deseen, agregando todos
los tags que quieran, para ofrecerles a sus usuarios la libertad de darle formato
a sus mensajes. Podrían, por ejemplo, agregar un nuevo tag, para poner palabras
en negritas, o quizás alguna expresión regular que convierta automáticamente
cualquier URL presente en el mensaje, en un link. Los límites son los de su
imaginación.
Cómo intenté demostrarles en este pequeño artículo, realizar nuestro primer
foro es algo completamente sencillo, si sabemos utilizar mínimamente mySQL y PHP (más bien, algunas funciones más que
útil del PHP). En estas pocas líneas aprendimos:
Y varios conceptos
más a la hora de programar nuestros scripts. Ahora, este sistema es muy básico,
como simple. Así que de ahora en más, es campo fértil para que Uds. mismos puedan
agregarle todas las características y funcionalidades que deseen, personalizando
el foro a su gusto. Como ideas, puedo mencionarles algunas:
Y seguro que a uds. mismos
se les deben estar ocurriendo otras muchas buenas ideas para mejorar el Foro.
Para aquellos usuarios que sean vagos y no quieran estar un rato con el Copy&Paste,
les dejo el código completo del foro
href="http://www.maestrosdelweb.com/editorial/util/foro.zip">para
que lo descarguen. Por lo pronto, espero que hayan disfrutado este tutorial,
y sigan programando simple, seguro, pero ante todo, bonito :D.
Califica esta nota:
Pablo Rigazzi
Creador de varios sitios web, entre ellos WebStudio para Tutoriales Photoshop, ZonaPHP con artículos sobre este lenguaje y RuidoDigital, blog de información tecnológica en general.
Si eres nuevo en Maestros del Web y te agradan nuestras publicaciones, te invitamos a suscribirte a nuestro Feed.
Sindícanos en: Google Reader, Bloglines, My Yahoo o My MSN | ¿Qué es el Feed?
480 comentarios en total.
El tutorial está muy bien logrado y nos enseñe la funcionalidad básica de un foro por lo que una felicitación para el autor. Encontré un par de tips para mejorar mi programación en PHP asi que también aprovecho a agradecerlo.
Saludos
Excelente tutorial, es muy util para todos.
Salvo el hecho de que deberian mejorar la resolucion de las imagenes, ta perfecto!
o_O!?
Mickel, me parece que leiste otro tutorial… Qué imágenes? ? ? ?
Me encantó el tutorial y estoy aprendiendo muchísimo… pero no encontré la función mostrartemplate() que teóricamente debería estar en funciones.php (o nentendí cualquier cosa?)
Muchas gracias por el esfuerzo que hacéis
Abel.. la función mostrarTemplate, que se muestra en el tutorial, deberias incluirla en el archivo funciones.php si es que copias todo desde el tutorial. Pero si notas, al final, pongo un lnk hacia un archivo.zip con todos los archivos completos que componen el Foro, así que te recomiendo que lo bajes.
Saludos.
Hola Amigo,
La verdad es que el tutorial funciona perfecto, Solo tengo una inquietud.
Mira regularmente asi tengo mi root.
http://www. aqui tengo todos mis HTML
en www/php, tengo todos mis archivos php
en www/images, tengo todas mis images.
Para probar los archivos que me enviaste, coloque los php en su respectiva carpeta y los HTML en raiz, pero, nada, no funcionó, lo INCLUDE y REQUIERE me dieron problemas, asi que opte por dejarlo en raiz (www).
me quedo mas o menos asi:
http://148.235.135.181/devweb/index.php
pero como le puedo hacer para colocar los PHP en su respectiva carpeta sin necesidad de tenerlos revueltos con los HTMLS y demas archivos que tengo en raiz?
agradezco sus respuesta…
Carlos Hidalgo
Bueno y simple dos veces bueno
Excelente articulo, gracias de verdad
El artículo excelente y la explicación por demás clara. Más artículos como éstos. Saludos.
excelente
excelente artículo, lo felicito.
esta increible,
me salvo la vida,
Muy bueno
Esta bueno…
Mensaje Original por NICKY
NO PUEDO BAJAR EL ARCHIVO foro.zip, me dice que no existe.
Es cierto, parece que hubo algun problema con la copia subida a MaestrosDelWeb. Este es el enlace para bajarse el código desde ZonaPHP :
http://www.zonaphp.com/archivos/foro.zip
Saludos.
Muy bueno, si señor. Me he hecho un foro en java basandome en el tutorial. Perfecto. Muchas gracias.
hola, gracias por la informacion
Muy bueno
Para principiantes se nota que faltan muchas cosas. Además de archivos.
oye tu link para descargar no trabaja, y el codigo a mi no me corre,
y si tengo mi register_global en off
Tengo un problemita! en esto todavia estoy muy verde, y deseo poner en mi pagina un FORO, mi duda es algo que espero no se burlen de ella, pues aunque ya logre descargar el archivo de foro.zip cuando lo abro como puedo visualizarlo, otra es si me podrian decir como lo inserto en una pagina es con frames o como debo hacer si me hace falta algun programa! no lo se…
Pablo sos un genio y además funciona!!.Sobre todo generoso lo tuyo.Gracias
La función mostrarTemplate($template, $row);
de foro.php, ¿donde está definida?
Otra cosilla, el link para bajarse el código está roto. [COLOR=red]Ya encontre en el foro otro enlace en zonaphp para bajarlo.[/COLOR]
Gracias
Esta roto el link para descargar el codigo completo de la creación del foro con PHP
Dale mas resolucion a esas capturas de pantallas (imagenes) y haz algo bien en tu vida… todo lo demas es aceptable
caraxo seguro usas lentes de botella!!! ![]()
Hola. Solo decir que el articulo me ha parecido bastante completito, salvo que para principiantes, como yo, aun leyendo los articulos sobre templates, nos puede resultar un poco lioso. Me gustaria bajar el archivo que has puesto para poder estudiar todo el codigo en condiciones, pero dice que el link es erroneo. ¿Podrias subirlo otra vez?
Muchas gracais
esta muy bien
Mensaje Original por Amanda
porque no poneis “¿COMO SE PUEDE HACE UNA PAGINA WEB?”
Que yo sepa, este foro o este post es para el foro en php.. no para paginas web…
De todas formas, si sigues teniendo dudas, agregame al msn y hablamos.. no se si coincidiremos puesto que yo soy de España, pero si quieres te puedo echar una mano. como veas… di algo aqui y nos ponemos en contacto
P.D.: No pretendo ligar, aunke pueda parecerlo… palabra
Por cierto, se me olvidaba.. Estoy probando los archivos bajados con PHP 4.3.2 y MySQL 4.0.14a Bajo windows con Xitami como server (por si tiene que ver algo de todo esto con mi problema).
Bien, a la hora de probar todo, a la hora de exponer un nuevo tema me da estos dos errores:
Notice: Undefined index: id in C:\Xitami\webs\php_nono\foro_nono\respuesta.php on line 4
Notice: Undefined index: citar in C:\Xitami\webs\php_nono\foro_nono\respuesta.php on line 5
Y los campos del formulario me aparecen otrs errores (que ya he corregido con un else a la buena de dios…)
La cuestion es, ¿falla por algo de lo que uso, tengo ke configurar algo mas a parte del PHP y de MySQL?¿o es solo un fallo del navegador?
Como editor uso el HomeSite 5.2, con el mapping de servidores activado correctamente…
Gracias
Ya fue corregido el link hacia la descarga.
Hola, me parece muy bueno este tutorial pero tengo un problema con el template… podrias haber `puesto un ejemplo para poder guiarse
no se como hacerlo, tengo ke seguir alguna regla para crearlo o lo hago como yo kiera??
otra cosa… el link no funciona ![]()
una pregunta yo baje el zip que habia y nose como incluirlo to2 los archivos me pueden ayudar plz
BUENA
diganme una de las causas del porque me sale el error “no se puede grabar el mensaje” ya cheque el codigo y no se que sea, alguien ayudeme!!
No os ofendais, no es nada personal, solo que como soy nuevo en esto pues… no me he aclarado mucho con lo que habeis puesto. Que x cierto me gustaria recibir mas informacion acerca de lo de crear foros y en especial de como poner el avatar en un foro, muchas gracias.
P.D:mi e-mail es: sut_roller@Hotmail.com
Realmente el foro es muy sencillo y practico, personalmente lo estoy utilizando en mi sitio con algunos retoques y funciona barabaro.
Felicitaciones!!!
Muy buen tutorial. Me sacó de apuros. Aunque tiene varias “cositas” que dejan que desear (algunos algoritmos mal logrados, como la validación de las variables), son los mínimos. Me refiero a que, si necesito la url …..respuesta.php?id=6&citar=1 ¿qué pasa si sólo ingreso …respuesta.php ?….mmm
En fin. A pesar de esos detallitos (que uno mismo puede solucionar) es excelente.
Muchas gracias, de verdad. Llevo poco tiempo peleando con el php y me encanta. Este artículo ha sido de gran ayuda
a mi no me funciona el foro, me sale este error Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /www/www/foro/index.php on line 10, q puede ser?? x favor si me ayudan.. mi messenger es pablito_paraguayo@hotmail.com
Gracias gente.. ya solucione el problema.. ahora me graba todo en la base de datos pero no sale nada en la pagina..
alguien me puede ayudar estoy tratando de que funcione el foro que esta en la pagina http://www.maestrosdelweb.com, ya antes mencionada pero me aparece un error en este if que esta en el index if (mysql_num_rows($rs) > 0) por lo que el programa no corre alguien me puede ayudar a lo mejor tengo un error o a alguien le paso lo mismo gracias
hola amigo gracias por el foro que nos das mira tengoi una duda lo corri queriuendo conectar a la base de datos y no pude conectar me marca error en my_sql_num_ros() que puedo hacer
Esta muy buena tu tutorial hombre, espero k me funcione y de hay te cuento
OK!
Buenas, he bajado los archvos del foro. Lo grabo todo donde debe pero a la hora de hacer un nuevo mensaje me crea el registro en la base de datos pero con los registos vacios.
Al intentar agregar una respuesta clickando sobre el tema desde la pagina principal se ve como carga la pagina foro.php?id=XX pero se queda en esa. Que es lo que hago mal?
Gracias de antemano
Esta de lujo el foro, m problema esque me da un error despues de iintentar escribir el mensaje… e aki el problema: Error al grabar un mensaje: mysql_error… alguien me puede ayudar? Merci
Hay un pequeño detalle que falla en este artículo, y es el diseño de la base de datos. En concreto, el campo en el que se guarda el número de respuestas, sobra. En primer lugar, porque es inncesario. EN segundo lugar, porque crea información duplicada en la base de datos, y por tanto, inconsistencia de datos. No se si me explico.
Como cada mensaje tiene un campo que indica a cual está respondiendo, podemos calcular en todo momento el número de respuestas con una sencilla sentencia SQL:
SELECT COUNT(*) FROM foro WHERE indentificador=$codigo
donde $codigo es el codigo del mensaje del que queremos saber su numero de respuestas. De esta manera, no hace falta actualizar el campo ‘respuestas’ constantemente.
De igual manera, ‘ult_respuesta’ también sobra. Es muy fácil obtener la fecha de la última respuesta con esta otra sentencia:
SELECT fecha FROM foro WHERE identificacion=$codigo ORDER BY fecha DESC
de igual manera, $codigo es el codigo del mensaje del que queremos saber la fecha de su ultima respuesta. Esta sentencia de SQL nos mostrara la fecha de todas las respuestas ordenadas por su fecha (de más reciente a menos), y para obtener la más reciente, simplemente almacenaremos el primer registro que nos devuelva.
Nada más, esas eran mis sugerencias.Aun así, el artículo es estupendo. Au!
Extremo, Si bien es cierto que las tablas del tutorial no están por completo Normalizadas, mucha normalizacion es tan mala como poca normalizacion. Es algo que deberías tener en cuenta. Si cada vez que muestres el Home del foro vas a hacer:
1 Query para obtener todos los mensajes iniciales.
1 Query POR CADA tema para obtener el número total de respuestas.
1 Query POR CADA tema para obtener la fecha de la última respuesta
Entonces permiteme decirte que estás haciendo demasiados Querys que puedes solucionar tan solo con unos bytes más en la base de datos.
Saludos.
localmente funciona muy bien, salvo 2 errores que marca en el archivo respuestas.php. Pero al subirlo al servidor(apache), no inserta los datos que quiero en la tabla, y no me manda al post.php
¿Qué tengo que hacer para solucionar este problema?, ¿acaso para servidor apahe no seirve?
pues a mi no me funciona siempre me da este error:
Warning: Supplied argument is not a valid MySQL result resource in c:\foro\index.php on line 10
por lo demas es muy interesante, he aprendido mucho
Me parece muy buena opción para los novtos, no me concidero mas que no novato pero cuando yo empece en este busine de PHP y MYSQL, me hubiera gustado haber encontrado esta opcion de aprendizaje…
saludoso
muy bueno, solo si el articulo terminara con una frase de oro, de ¿como lo pongo a funcionar? no soy experta en el asunto, y por lo tanto me gustaria ver funcionando lo que 10 horas despues intente hacer, por lo demas es bastante interesante y muy bien documentado.
gracias
Hola, estoy usando el ejemplo de abajo y me dice ‘Imposible conectarse con MySQL’. Creo tener bien configurado todo. la variable servidor seguro que está localhost y las variables usuario y password he puesto unas cualquiera, tengo que cambiarlas por algunas (¿donde puedo mirarlo?).
Necesito ayuda urgente Gracias por adelantado
// ***** Modificar las siguientes lineas con sus datos *****
$servidor = “localhost”;
$usuario = “zaseg”;
$password = “my_password”;
$base_de_datos = “nomnbre_BD”;
// ********************** Fin modificacion **********************
?>
lo felicito pero hay que dar criticas constructivas no desanimar a las personas tratandolas de vagas
Me parece que el articulo esta bastante claro para el tema. Sin embargo soy usario nuevo en PHP y MySQL y en este momento necesito ayuda para terminar una aplicacion que contenga los ultimos comentarios que mencionas:
- Agregar más tags para que sus usuarios puedan dar formato a sus mensajes
- Incorporarle un sistema de usuarios (muy importante para mi)
-Contadores de visualizaciones de un tema, para hacer un Ranking de temas más vistos.
-La posibilidad de que los usuarios puedan utilizar firmas (no importante para mi)
Me gustaria que me puedas ayudar con estos temas, ya que necesito terminar esta aplicacion mas tardar el dia 5 de diciembre 2003.
Por favor espero respuesta a mi correo:
enovelo69@hotmail.com
te lo agradezco mucho….Gracias..
MUCHAS GRACIAS POR ESE TUTORIAL Y ESA AYUDA. AHORA TENGO UNA BUENA IDEA DE LO Q ES UN FORO Y COMO METERLO EN MI PAGINA. NO FUE FACIL ENCONTRAR ESA INFORMACIÓN CON TANTA CLARIDAD. GRACIAS POR TU GENEROSIDAD Y TU PEDAGOGIA.
< ?php
function parsearTags($mensaje)
{
$mensaje = str_replace(”[citar]“, “
“, $mensaje);
$mensaje = str_replace(”[/citar]“, “
“, $mensaje);
return $mensaje;
}
?>
alguien sabe como se puede añadir algo para borrar temas ?
soys los mejores!!!! asi da gusto!!
es muy bueno este foro se los recomiendo…saludos!!
Hago el foro pero no entiendo en el index.php y en el foro.php las variables color.
como no se de donde salen ni para que sirve me dan error y no puedo solucionarlo.
Este es el error que me dan
Notice: Undefined variable: color in
c:\apache\apache\htdocs\taxi\foro\foro.php on line 18
Aprovecho para decir que si entras en el formulario de respuesta y no contestas a nada (se supone que estas generando un nuevo tema) pues en las casillas del formulario salen algunos errores que borrandolos te dejan continuar. ¿como solucionamos esto?
Gracias por todo
Muy explicativo
*.chm
Archio de ayuda HTML compilado.
Cuando hago lo que me comentas me sigue pidiendo que pulse abrir o cuardar.
Una vez lanzado y abierto me abre la ayuda de Windows.
No entiendo lo que me comentas de poner las cabeceras de HTM
buen ejemplo
tengo una duda porque el _GET me genera error , me dice indefinido _GET
gracias pos su respuesta
hola!
El manual me ha parecido perfecto, ya q como mejor se aprende es viendo ejemplos. Pero a mi me quedó una duda, COMO SE HARIA PARA PONER LA FECHA QUE APARECE EN LA PAGINA PRINCIPAL DE MANERA QUE QUEDE DD/MM/AAAA????
En las respuestas a los temas aparece asi pero probando de la misma manera no soy capaz de hacerlo.
Alguien me podia ayudar??
Muchas gracias.
Hola,
El artículo es buenísmo… tal como está disñado el foro me funciona perfectamente… comprendo que hay temas como la atentificación de nicks y administración de la comunidad y el foro que requieren otros desarrollos… que son ajenos al artículo.
La única pega es que hay algunos desarrollos de programación que no están explicados con suficiente claridad para un principiante tan pez como yo… a pesar de todo, casi consigo entender de lo que van los templates…
No obstante, tengo un problema… el foro está diseñado para ordenar temas y respuestas en función de fechas… y a mí lo que me interesa es desarrollar un foro en que las respuestas se desarrollen de forma arborescente en función de la lina de conversación… de forma que aparezca debajo de cada tema, su respuesta… y debajo de esta respuesta, el post que se dirige a ella… así hasta el final de la “línea de respuestas”… y luego iria otra línea de respuestas distintas u otro tema… es el tipo de foro que funciona en Melodysoft, Portalmix… o Lycos
¿ alguien podría decirme cómo podría diseñar esta otra forma de foro?
TENGO EL SIGUIENTE PROBLEMA:
Warning: Cannot modify header information - headers already sent by (output started at /usr/local/www/utec/foro/configuracion.php:2) in /usr/local/www/utec/foro/agregar.php on line 30
El tema es el siguiente, no puedo opinar mucho, puesto que soy nuevo en todo esto,tengo una pequeña cuestion y el tema es que no se nada sobre base de datos ¿hay alguna forma de poder montar un foro sin necesidad de crear tablas y cosas de esas?, si me podeis ayudar, estoy muy agradecido.Mi correo es snoopp29@hotmail.com , un saludo y muchas gracias ![]()
hay algun ejemplo donde ver este foro?
gracias
He subido el foro a una web de miarroba.com y no he podido corregir un pequeño problema, primeramente pense que era por el ($rs)>0) que tendria que ser ($rs) > 0) pero ya con el cambio hecho sigue apareciendo el mismo error.
al querer ingresar a index.php de la seccion del foro me aparece esto.
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/………/foro/index.php on line 10.
En Index.php esta esta seccion que es donde creo que esta el fallo.
/* Pedimos todos los temas iniciales (identificador==0)
* y los ordenamos por ult_respuesta */
$sql = “SELECT id, autor, titulo, fecha, respuestas, ult_respuesta “;
$sql.= “FROM foro WHERE identificador=0 ORDER BY ult_respuesta DESC”;
$rs = mysql_query($sql, $con);
if(mysql_num_rows($rs)>0)
hola este manual me ha servido mogollon gracias
Un aporte al articulo.
Hay un error en el codigo al utilizar las variables: $_GET y $_POST
Este uno de los errores mas comunes a la hora de programar en PHP.
Lo que hay que saber es lo siguiente, por razones de compatibilidad, se debe comprobar primero que variables identifica el servidor, mas alla de que sepamos que variables identifica el nuestro, nunca sabemos si el codigo que desarrollamos va a ser migrado a otro servidor o no (algo que sucede con mucha frecuencia en empresas que actualizan constantemente su software y/o hardware) o si el administrador del sistema cambia la configuracion del servidor, por dar algunos ejemplos.
La forma correcta de manejar variables predefinidas, en este caso get y post, es la siguientec:
$_GET = ($_GET ? $_GET : $HTTP_GET_VARS);
$_POST = ($_POST ? $_POST : $HTTP_POST_VARS);
De lo contrario, quiza tu codigo funcione bien aca, pero no alla.
baje el foro y lo puse en mi servidor, pero no se usar el mysql
Muy util y bastante desglosado.
Voy a hacer incapié a una consulta anteriormente posteada, pero que no he visto solventada, al indexar index.php en mi sitio me da el siguiente error.
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home2/sysbinar/public_html/foro/index.php on line 10
Bien posteo tambien el bloque if en el que se encuentra la linea 10 de index.php.
if(mysql_num_rows($rs>0))
{
// Leemos el contenido de la plantilla de temas
$template = implode(”", file(”temas.html”));
include(’titulos.html’);
while($row = mysql_fetch_assoc($rs))
{
$color=($color==”"?”#5b69a6″:”");
$row["color"] = $color;
mostrarTemplate($template, $row);
}
}
he estado mirando pero no veo claro si alguien me pudiese orientar un poco… seria de agradecer.Gracias
Por cierto hace poco ando visitando este site y me parece un trabajo excelente, chapó para los admin.
ya lo he si¡olucionado, era un problema con el formato de la tabla que no la habia creado correctamente. ta pronto
Me gustaria saber como usar este foro pero como modulo de un cms muy conocido lalamdo coolphp gracias me manda error con las variables mostrar template serai mucho pedir si lo hicieras en php puro y me lo pasas mi email es info@creativews.net o info@chiriweb.com
Gracias.
Mario Rios
Es me muy gran ayuda. Los felicito por su capacidad de desarrollo de este sistema. Muchas Gracias
Dos preguntas:
1.- En el index no aparecen los temas tal y como está el código que me bajé del tutorial. Al menos a mí no me aparecen
[PHP]
$rs = mysql_query($sql, $con);
if(mysql_num_rows($rs)>0)
{
[/PHP]
Pero si quito >0 si aparecen.
[PHP]
$rs = mysql_query($sql, $con);
if(mysql_num_rows($rs))
{
[/PHP]
No creo que sea un error, ya que en los apuntes se dice textualmente:
“También realizamos una decisión, solo mostraremos los temas de nuestro foro si la cantidad de filas recuperadas desde la base son mayores de 0″
2.- Ya que se trabaja con templates ¿no seria mas interesante eliminar esta variable
[PHP]
$color=($color==”"?”#5b69a6″:”");
$row["color"] = $color;
[/PHP]
y determinar el color con un archivo css?
Te pregunto esto porque me he bajado el script para estudiarlo y al igual que tienes un motivo para no hacer un include en el index, “eficacia”, puede que tengas un motivo para que el código sea así y no de otra manera.
Gracias por tu tiempo
:molesto: me echó fuera de mi mensaje y no he podido editarlo.
una cosa no me queda clara….
debo copiar en la carpeta inicial de mi hosting el phpMyAdmin?……
Hola yo tambien tengo el mismo problema en la linia 10 me faya esto:
if(mysql_num_rows($rs)>0)
el comentario esta muy bueno esa linea tiene que ser asignada a la base de mysql
he visto que a muchos les sale el mismo error que me sale a mi…son varios “Notices” que por lo que entiendo es por la configuracion del servidor para mostrar todos los errores, pero, es posible validar estas instrucciones para q no salgan estos notices?
En la Pagina principal aparece:
Notice: Undefined variable: color in c:\archivos de programa\easyphp1-7\www\pagina\foro\index.php on line 17
En nuevo tema aparece:
Notice: Undefined index: id in c:\archivos de programa\easyphp1-7\www\pagina\foro\respuesta.php on line 3
Notice: Undefined index: citar in c:\archivos de programa\easyphp1-7\www\pagina\foro\respuesta.php on line 4
y en los campos de “titulo” y “mensaje” de Nuevo Tema sale:
Notice: Undefined variable: titulo in c:\archivos de programa\easyphp1-7\www\pagina\foro\funciones.php(6) : eval()’d code on line 10
Notice: Undefined variable: mensaje in c:\archivos de programa\easyphp1-7\www\comincol\foro\funciones.php(6) : eval()’d code on line 14
Por favor, alguien sabe como hacer para que no aparezcan estos notices sin cambiar la configuracion de mostrar errores del servidor????
buen articulo
Realmente facil y muy bueno.
todo lo de esta pagian es exelentemente bueno para lu usuarios como mi persona tanto tambien para los que esta en aprendizaje gracias`por todo
damn, es super completo pero realmente no entiendo mucho, ando nesesitando un foro para poner en una pagina…. pero igual gracias ![]()
Muy bien me gusto y esta facil
interesante, claro sin vueltas inecesarias Felicidades!!!!!
Jaja que son flooderos… El manual me servirá de mucho, al fin encuentro uno. Los felicito.
un pequeño problema
me sale esto:
Warning: mysql_connect(): Access denied for user: ‘usuario@localhost’ (Using password: YES) in /www/grupoled/foro/configuracion.php on line 7
Warning: mysql_select_db(): supplied argument is not a valid MySQL-Link resource in /www/grupoled/foro/configuracion.php on line 8
Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in /www/grupoled/foro/agregar.php on line 17
Error al grabar un mensaje: mysql_error
Hola ya que no soy muy wen oen programacion quisiera saber que hago con los archivos que me descargue en el foro….en vez de escribir tantas webadas me baje el .zip con todas esas cosas ya echas y ahora no se que hacer…una ayuda please.¡¡¡ya que me fascina PHP 7.1
quiero un amnual para principiantes¡¡¡
supercoco2000, Hago el foro pero no entiendo en el index.php y en el foro.php las variables color.
como no se de donde salen ni para que me dan error y no puedo solucionarlo.
Este es el error que me danNotice: Undefined variable: color in
c:\apache\apache\htdocs\taxi\foro\foro.php on line 18Aprovecho para decir que si entras en el formulario de respuesta y no contestas a nada (se supone que estas generando un nuevo tema) pues en las casillas del formulario salen algunos errores que borrandolos te dejan continuar. ¿como solucionamos esto?
Gracias por todo
Voy a probarlo a ver ke tal
Hola a todos.. donde esta el zip del foro para hecharle una probada.
Buenas, he bajado los archvos del foro. Lo grabo todo donde debe pero a la
hora de hacer un nuevo mensaje me crea el registro en la base de datos pero
con los registos vacios. y dice que sin titulo y anonimo!
al entrar a un tema no entra a anda y sigue en el index
Al intentar agregar una respuesta clickando sobre el tema desde la pagina
principal se ve como carga la pagina foro.php?id=XX pero se queda en esa.
Que es lo que hago mal?
ayudenme pliz
Gracias de antemano
parace sencillo, a ver si consigo ponerlo bien
TENGO UN PROBLEMA CUANDO ENTRO A EL FORO QUE REALICE, ,ME ENVIA MENSAJE DE ERROR COMO ESTE.
Warning: mysql_connect(): Access denied for user: ‘usuario@localhost’ (Using password: YES) in /var/www/html/foro/configuracion.php on line 7
Warning: mysql_select_db(): supplied argument is not a valid MySQL-Link resource in /var/www/html/foro/configuracion.php on line 8
Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in /var/www/html/foro/agregar.php on line 17
Error al grabar un mensaje: mysql_error
que puedo hacer
He creado un foro bajo gpl, pero está hecho para utilizar 100% clases y objetos. podéis echarle un vistazo en http://gorrister.no-ip.org y también ver cómo funciona en http://www.forosbsd.org.
Un saludo. Ah, estoy un poco verde en el tema de implementar un motor de búsqueda, agradecería algún consejo o ayuda ![]()
Es normal que al agregar una respuesta, el archivo agregar.php no me redirija a ninguna página?
Lo he solucionado quitando los Header(”Location: foro.php?id=$ident#$ult_id”); y agregando al final un javascript que redirija siempre a la página principal, pero no es lo mismo porque al responder un tema, en lugar de volver a él me envia a la principal.
Alguna solución?
Muchas gracias por el tutorial! Me ha venido de perlas ![]()
Maestros del Web es el punto de encuentro para los entusiastas de la red.
Creative Commons by-nc-sa 3.0 | Política de Privacidad | CMS: Wordpress