Insertar el contenido de un formulario en una base de datos MySQL

Anuncio
http://www.webtaller.com/construccion/lenguajes/info/lecciones/php/
Insertar el contenido de un formulario en una base de datos MySQL
con PHP
Algo muy común en un panel de administración Web es la capacidad de insertar contenidos en
un formulario y pasarlos directamente a la base de datos para su posterior uso en la base de
datos.
El formulario no debe cumplir ningún requisito especial, únicamente el atributo action debe
apuntar al script que procesará la información.
<form name="webtaller" action="insertar_datos.php" method="post">
Título: <input type="text" name="titulo"><br>
Contenido: <textarea name="contenido"></textarea><br>
<input type="enviar" value="Enviar">
</form>
Ahora en el archivo "insertar_datos.php" deberemos recoger estos datos e insertarlos en
nuestra base de datos. Suponemos que tenemos una tabla en la base de datos, llamada
"noticias" que tiene los campos "titulo" y "contenido". Miraremos si realmente han enviado
datos y si es así, insertaremos los valores en la base de datos.
<?php
// Primero comprobamos que ningún campo esté vacío y que todos los campos existan.
if(isset($_POST['titulo']) && !empty($_POST['titulo']) &&
isset($_POST['contenido']) && !empty($_POST['contenido'])) {
// Si entramos es que todo se ha realizado correctamente
$link = mysql_connect("localhost","usuario","contraseña");
mysql_select_db("webdb",$link);
// Con esta sentencia SQL insertaremos los datos en la base de datos
mysql_query("INSERT INTO noticias (titulo,contenido)
VALUES ('{$_POST['titulo']}','{$_POST['contenido']}')",$link);
// Ahora comprobaremos que todo ha ido correctamente
$my_error = mysql_error($link);
if(!empty($my_error) {
echo "Ha habido un error al insertar los valores. $my_error";
} else {
echo "Los datos han sido introducidos satisfactoriamente";
}
} else {
echo "Error, no ha introducido todos los datos";
}
?>
Esta es la forma más sencilla de insertar datos en una base de datos MySQL y en la mayoría de
casos, seguirá este esquema. Se puede mejorar alguna cosa, como por ejemplo asegurarse de
que las comillas que se inserten vienen "escapadas", es decir, de esta forma (') para evitar
problemas con MySQL.
Por Alex.
Director Técnico de WebTaller.
Enviar un e-mail HTML con PHP
Enviar un e-mail con PHP es muy sencillo, tan solo tenemos que utilizar la función mail. Pero
cuando escribimos código HTML en el cuerpo del mensaje, este lo recibimos como texto y no
como una página web, como querríamos. Esto tiene facil solución, solo necesitamos añadir la
cabecera "Content-type: text/html" en el e-mail y el código que enviemos se interpretará como
HTML. Veamos como:
<?php
$codigohtml = '
<html>
<head>
<title>E-Mail HTML</title>
</head>
<body>
<a href="http://www.webtaller.com">Ir a WebTaller</a>
</body>
';
$email = '[email protected]';
$asunto = 'E-Mail HTML';
$cabeceras = "Content-type: text/html\r\n";
mail($email,$asunto,$codigohtml,$cabeceras);
?>
De esta forma, los e-mails que enviemos se verán como una página Web. En las cabeceras
podemos añadir otras cosas, como por ejemplo si queremos especificar quien envía el e-mail
haremos:
$cabeceras = "From: [email protected]\r\nContent-type: text/html\r\n";
De esta forma, el remitente del e-mail sería "[email protected]"
Por Alex
Director Técnico de WebTaller
Guardar y extraer imágenes en MySQL con PHP
En este artículo vamos a tratar lo que es el almacenar imágenes en una Base de Datos, para
este artículo vamos a utilizar MySQL.
Introducción
Quien se podría imaginar el guardar imágenes en una Base de Datos?, al principio a mi ni me
pasaba por la cabeza, hasta que ya vas conociedo las herramientas y con el tiempo surgen
nuevas ideas y fum!! buala!! seurge la inquietud, so podrán guardar imágenes enuna Base de
Datos?,la respuesta es si.
Requerimientos
• PHP >= 3.0.16
• MySQL
• Habilitar la extension en PHP sobre GD
Crear Base de datos y Tabla
Vamos a comenzar creando una Base de Datos, en nuestro caso se llama bd_banners y dentro
de esta creamos una tabla (en nuestro caso se llama tbl_Banner) con los campos;
• Id_banner (Llave, autonumérico)
• Nombre (Texto)
• Descripcion (Texto)
• Imagen (Blob)
Conectarnos a la BD
Ahora simplemente nos conectamos a MySQL y seleccioanmso nuestra Base de Datos
bd_banners.
$link = mysql_connect('localhost', 'root', 'password');
if (!$link)
die('Error al conectarse con MySQL: ' . mysql_error().' <br>Número del error: '.mysql_errno());
if (! @mysql_select_db("db_AdMX",$link)){
echo "No se pudo conectar correctamente con la Base de datos";
exit();
}
Almacenar imágen en la BD
Antes de almacenar la imágen en la BD, debemos de procesarla para llegar a convertirla en
datos binarios.
$image = imagecreatefromgif('imagen.gif');
ob_start();
imagegif($image);
$jpg = ob_get_contents();
ob_end_clean();
imagecreatefromgif: Crear una nueva imagen a partir de un archivo o URL.
ob_start: Inica el almacenamiento en el búfer de salida.
imagegif: Producir la salida de una imagen al navegador o a un archivo.
ob_get_contents: Devolver el contenido del búfer de salida.
ob_end_clean: Limpia el búfer de salida y termina el almacenamiento en el búfer de salida.
NOTA: En este ejemplo se guarda una imágen tipo GIF, por eso se utilizan las funciones;
imagecreateformgif, imagegif. Si se desea almacenar una imágen tipo JPEG, utilizar las funciones;
imagecreatefromjpeg, imagejpeg. Asi solamente se cambia el tipo de imágen enlas funciones. Para
ver los tipos de imágenes que soporta PHP+GD da click aquí.
Ahora si vamos a almacenarla, para esto convertimos la infromación de la imágen en sql-safe y
simplemente hacemos un query para guardar.
$jpg = str_replace('##','##',mysql_escape_string($jpg));
$result = mysql_query("INSERT INTO tbl_Banner SET Imagen='$jpg'");
Extraer la imágen de la BD y mostrarla en el navegador
Ahora vamos a extraer la imágen mediante un simple SELECT y la vamos a mostrar en el
navegador.
$result = mysql_query("SELECT Imagen FROM tbl_Banner WHERE Id_imagen=11");
$result_array = mysql_fetch_array($result);
header("Content-Type: image/gif");
echo $result_array[0];
Simplemente con esto guardamos la imágen en una variable y antes de mostrarla le decimos al
navegador que el contenido a mostrar es de imágen/gif. Se se va a mostrar imágenes JPEG
cambiar image/gif por image/jpeg y asi para los diferentes formatos.
Autor: Jesús Carrillo
http://www.phpmexico.com/index.php?option=com_content&task=view&id=26&Itemid=9&limit=1&limitstart=0
WebTaller - Instalar foros phpBB
Instalacion de los Foros phpBB
por Xergio Webmaster de www.xergio.net
Instalar un foro phpBB es MUY sencillo, lo que pasa es que a la gente no le gusta leerse la
documentación de las cosas ;-) De todos modos, por si alguno pone la excusa de que está en
inglés, yo os digo cómo se hace en español.
Iremos por pasos...
1-. Requisitos
Un servidor web que soporte PHP 3.0.9 o mayor, preferiblemente 4.
Base de Datos SQL (con que tenga una de estas es suficiente):
MySQL (3.22 o mayor)
PostgreSQL 7.0.3 o mayor (preferiblemente 7.1.x o 7.2.x)
MS SQL Server (7 o 2000) directamente o via ODBC
MS Access (2000 o XP) via ODBC
Si tu servidor no cumple uno de estos requisitos, no podrás usar phpBB2
2-. Descarga phpBB de www.phpbb.com
3-. Descomprime el archivo que te has bajado y sube el contenido a tu espacio web (todos los
archivos), a una carpeta llamada phpBB mismamente.
4-. Ahora solo tienes que abrir el foro desde tu navegador.
Si lo has subido a un servidor gratuito, posiblemente tu direccion será
http://www.servidor.com/usuario/ , asi que si lo subirtes al directorio phpBB2/, la dirección que
tendrás que abrir será http://www.servidor.com/usuario/phpBB2/ , así de simple, y ya te
aparecerá la ventana de instalación.
Si por el contrario es un hosting de pago, tu dirección será http://www.tudireccion.com/ , si lo
suber a phpBB2/ tendrás que ejecutar http://www.tudireccion.com/phpBB2.
5-. Solo queda instalarlo desde la ventana que apareció. Voy a ir indicando los datos en inglés,
ya que muchos aun no tendreis puesto el pack en español (para descargarlo visitar su página
web). Teneis que rellenar unos datos, los cuales os indico ahora...
Default board language: esto se refiere al lenguaje para la instalación y su posterior uso.
Database Type: Tipo de base de datos. Posiblemente todos useis MySQL 3.x. De no ser así
consultarlo con el dueño del hosting o mirar su FAQ.
Choose your installation method: Tipo de instalación. Te da a elegir entre instalar y actualizar.
Seleccionar lo primero (¿no?).
Database Server Hostname / DSN: Host del servidor de la base de datos. En general es
localhost, pero puede haber escepciones. Lo podreis ver en el FAQ de cada servidor o en los
datos que te mandan cuando te registras.
Your Database Name: Nombre de tu base de datos. Suele ser el nombre de usuario, pero esto
ya varía más. Ponte en contacto con tu servidor o mira los datos de cuanto te registrastes.
Database Username: y Database Password: Pues eso, nombre de usuario y contraseña. Lo
mismo que antes, si no lo sabes contacta con tu servidor.
Prefix for tables in database: Prefijo para las tablas en la base de datos. Esto sirve por si tienes
más cosas en la base de datos, para diferenciarlo. dejalo como está o pon otro prefijo, eso es
cuestión de gustos.
Admin Email Address: El email del administrador, o sea, tu. Será el email que aparecerá
cuando se mande un mail a la persona que se registra en el foro, por poner un ejemplo...
Domain Name: Tu dominio. Deja el que ya te pone el foro por defecto (es lo recomendable, si
luego falla, allá tu).
Server Port: El puerto del servidor. Lo mismo que antes, dejalo como está, dificilmente un
servidor use otro puerto.
Script path: La ruta del foro. Dejalo también como está, si pones algo mal luego fallarán las
cookies.
Administrator Username: Tu nick para el foro.
Administrator Password: Pues eso, una contraseña para ti, para tu cuenta de administrador.
Por último pincha el botón.
6-. Luego te aparecerá un mensaje como este...
Your config file is un-writeable at present. A copy of the config file will be downloaded to your
when you click the button below. You should upload this file to the same directory as phpBB 2.
Once this is done you should log in using the administrator name and password you provided
on the previous form and visit the admin control centre (a link will appear at the bottom of each
screen once logged in) to check the general configuration. Thank you for choosing phpBB 2.
Que traducido viene a decir...
Tu archivo con la configuración es "noEscribible" por ahora. Cuando pinches en el botón se
descargarás el archivo de configuración. Tu deberás subir ese archivo al mismo directorio que
phpBB2. Cuando hayas hecho esto, entra al foro y haz login como administrador (identificate
como administrador) y entrar en el panel de administración desde un enlace que hay en el pie
de cada página, para configurar en general el foro. Gracias por usar phpBB 2.
Pues ya sabeis, hacer eso... y suerte!!
Anexo de WebTaller
INSTALACIÓN DEL PACK EN CASTELLANO
Lo primero que tenemos que hacer es bajarnos el "pack en español" que está en la página de
phpbb (http://www.phpbb.com/downloads.php) casi abajo del todo, buscad "spanish" y bajaos
el archivo. Descomprimirlo en vuestra carpeta phpbb2/languages.
NOTA: cuidado con esto tiene que quedar dentro de languages las dos carpetas como se ve en
la imagen, en una ocasión me equivoqué y dentro de lang_spanish se me creo otra subcarpeta
lang_spanish. No me di cuenta y me las ví y me las desee para comprender porqué mi foro no
funcionaba en castellano. Aseguraros de que bajo lang_spanish están directamente los archivos
de lenguaje.
Subimos nuestra carpeta lang_spanish al directorio "languages" dentro de phpbb.
CONFIGURACIÓN DEL PACK EN CASTELLANO
1.- Vamos a nuestro recién estrenado foro.
2.- Pulsamos sobre login y nos autentificamos con el nombre y el pass de administrador que
dimos al instalar el foro
3.- Al pie de los foros vemos un enlace al panel de administración, pulsamos.
4.- En el panel de administración, en la sección "general admin" pulsad en "configuration".
5.- Buscad "Default Language" y de la lista desplegable buscar "spanish",
6.- Guardar, en el botón al pie de la página.
Ahora dirígete de nuevo al índice del foro y ve a tu perfil y en la opción language, elige spanish,
y listo!
WebTaller - Aprender PHP – Buscador
Un Buscador Simple
Por Alex para www.WebTaller.com
En este artículo veremos como crear un buscador con PHP y MySQL que servirá para cualquier
tabla MySQL de nuestra base de datos y que podrá ser mostrado facilmente en nuestro sitio
web.
El script consta de tres partes. La configuración, el formulario y el proceso del formulario. La
primera parte, la más sencilla de todas, es donde tendrás que poner los datos de tu base de
datos y la tabla donde quieres que el buscador realice las búsquedas. No tiene pérdida. Al final
de la configuración realizamos la conexión a la base de datos ya que la usaremos cada vez que
se acceda al buscador.
En la segunda parte se trata la creación del formulario. Como no conocemos los campos de la
tabla tenemos que generar ese camop del formulario dinámicamente. Para ello utilizamos la
sentencia "SHOW FIELDS FROM table" que nos devuelve información de todos los campos que
hay en la tabla. De esta forma conseguimos que nos liste todos los campos de la tabla que
hayamos escogido al configurar, en el formulario.
En la tercera parte, que solo se ejecuta si se ha enviado el formulario, se realiza la búsqueda
con los datos obtenidos. Para ello utilizamos una sentencia de SQL de este tipo: "SELECT *
from tabla WHERE campo LIKE '%valor%'" la cual nos devuelve todas las filas donde haya
encontrado algo que contenga el valor en el campo seleccionado. Finalmente mostramos los
resultados obtenidos utilizando un bucle para recorrer todos los campos de la tabla.
Configurar y subir, así de facil :)
Archivo: buscador_generico.php
<?
// Buscador para tablas MySQL escrito en PHP. Por Alex para www.webtaller.com
// Creado el 13-10-2003
////////////////////////////
// Configuración
///////////////////////////
//modifica estas variables según tu servidor de MySQL
$bd_servidor = "localhost";
$bd_usuario = "pepito";
$bd_contrasenya = "grillo";
$bd_bdname = "mybd";
$bd_tabla = "unatabla"; // Tabla donde se harán las búsquedas
// Conexión y selección de la base de datos
$link = mysql_connect($bd_servidor,$bd_usuario,$bd_contrasenya);
mysql_select_db($bd_bdname,$link);
////////////////////////////
// Formulario
///////////////////////////
?>
<center>
<p><h2>Introduce las palabras para la búsqueda</h2></p>
<p><form name="buscador" method="post" action="buscador_generico.php"><br>
Buscar en:
<select name="campo">
<?php
//Con este query obtendremos los campos por los cuales el usuario puede buscar
$result = mysql_query("SHOW FIELDS FROM `$bd_tabla`",$link);
while($row = mysql_fetch_row($result)) {
// en $row[0] tenemos el nombre del campo
// de esta manera no necesitamos conocer el nombre de los campos
// por lo que cualquier tabla nos valdrá
?>
<option value="<?php echo $row[0]; ?>"><?php echo $row[0]; ?></option>
<?php
}
?>
</select>
Palabra(s): <input type="text" name="palabra"><br>
<input type="submit" value="Enviar" name="enviar">
</form></p>
</center>
<?
////////////////////////////
// Proceso del Formulario
///////////////////////////
if(isset($_POST['enviar'])) {
// Solo se ejecuta si se ha enviado el formulario
$query = "SELECT * from $bd_tabla WHERE `{$_POST['campo']}` LIKE
'%{$_POST['palabra']}%'";
$result = mysql_query($query,$link);
$found = false; // Si el query ha devuelto algo pondrá a true esta variable
while ($row = mysql_fetch_array($result)) {
$found = true;
echo "<p>";
foreach($row as $nombre_campo => $valor_campo) {
// Tenemos que mostrar todos los campos de las filas donde se haya
// encontrado la búsqueda.
if(is_int($nombre_campo)) {
continue; //Cuando hacemos mysql_fetch_array, php genera un array
// con todos los valores guardados dos veces, uno con
// índice numérico y otro con índice el nombre del campo.
// Solo nos interesa el del nombre del campo.
}
echo "<b>".$nombre_campo."</b> : ".$valor_campo."<br>";
}
echo "</p>";
}
if(!$found) {
echo "No se encontró la palabra introducida";
}
}
?>
Mostrar Fecha y Hora con PHP
PHP trabaja las fechas a partir de la fecha UNIX timestamp (Segundos desde el mediodía del 1
de Enero de 1970), la forma de conseguir la fecha actual es la siguiente:
<?
$fecha = time ();
?>
Si queremos mostrar detalles de esta fecha, que puede almacenarse por ejemplo en una base
de datos utilizaremos la función date:
<?
echo date ( "h:i:s" , $fecha );
?>
Donde "h:i:s" es una cadena que define el formato en que será mostrada la fecha
(horas:minutos:segundos) y $fecha, un parametro opcional que indica sobre que valor de
tiempo trabajar.
La cadena de formato, se crea combinando con simbolos, letras, numeros y caracteres de
formato: a - am/pm
A - AM/PM
B - Hora swatch de internet
d - Dia del mes 01 a 31
g - Hora de 1 a 12
G - Hora de 0 a 23
h - Hora de 01 a 12
H - Hora de 00 a 23
i - Minutos 00 a 59
j - Dia del mes de 1 a 31
m - Numero de mes de 01 a 12
n - Numero de mes de 1 a 12
s - Segundos de 00 a 59
t - Dias del mes de 28 a 31
U - Fecha Unix
w - Dia de la semana de 0 a 6 empezando por Domingo
W - Semana del año ej: 42
y - Año ej: 99
Y - Año ej: 1999
z - Dia del año de 0 a 366 Si queremos escribir 5 del 10 de 1999 haremos:
<?
echo date ( "j del n de Y" );
?>
Como veis para mostrar una letra sin que sea reemplazada por una fecha, le ponemos delante.
Artículo por cortesía de Eloi de San Martín
www.programacionweb.net
WebTaller - Aprender PHP - Creando un Foro en PHP
CREANDO UN FORO EN PHP
Artículo por Pablo Daniel Rigazzi
Original de: www.zonaphp.com
LA ESTRUCTURA
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:
id : Será e identificador principal de la tabla. Sirve para diferenciar cada uno de los mensajes.
autor : el autor del mensaje.
titulo : el titulo que tendrá el mensaje. Si este mensaje es el iniciador de un tema, será el que
mostrará en el home del Foro.
mensaje : El mensaje en si mismo.
fecha : un campo DATETIME que indicará en que fecha se ha publicado este mensaje.
respuestas : Si este mensaje es el iniciador de un tema, aqui se acumularán la cantidad de
respuestas que reciba.
identificador : este campo guarda el valor del id del mensaje que se está respondiendo. Si el
mensaje es iniciador de un tema, entonces este campo valdrá cero.
ult_respuesta : si el mensaje es iniciador de tema, aqui se actualizará valor de acuerdo con la
fecha de la última respuesta que haya recibido. Sirve para poder mantener un orden en los
foros.
La sentencia SQL anterior, pueden guardarla en un archivo.sql y correrla en su base de datos
desde el phpMyAdmin, o si lo prefieren, pueden ingresarla linea por linea 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:
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.
Los Templates
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.
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.html
Nombre: <b><?=$nombre?></b><br>
Edad : <b><?=$edad?></b><br>
Domicilio : <?=$domicilio?>
<hr>
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.
Un Tema por vez
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:
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)
{
Aqui 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);
}
Aqui 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 titulos 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
algun 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 algun tema existente.
Participar es la Base
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.
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.
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>
Aqui 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.
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 (
>, <, &quote;, &). 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
aeguramos 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.
Miles de posibilidades
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.
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 :
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 conexion 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:
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.
Misión Cumplida
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 útile del PHP). En estas pocas líneas aprendimos :
Crear una tabla en MySQL para que contenga los datos de nuestro foro.
A conectarnos a MySQL desde nuestro script PHP.
A utilizar un sistema de templates casero y simple.
La utilización de funciones de PHP como : extract(); eval(); implode(); file(); nl2br();
mysql_insert_id(); str_replace();
La utilización de la función DATE_FORMAT() de MySQL.
Cómo trabajar de manera segura con la directiva Register_Globals en OFF, tomando uno a uno
los contenidos de las variables, desde sus respectivos arrays $_POST y $_GET.
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 :
Agregar más tags para que sus usuarios puedan dar formato a sus mensajes
Incorporarle un sistema de usuarios
Contadores de visualizaciones de un tema, para hacer un Ranking de temas más vistos.
La posibilidad de que los usuarios puedan utilizar firmas
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 para que lo descarguen. Por lo pronto, espero
que hayan disfrutado este tutorial, y sigan programando simple, seguro, pero ante todo, bonito
:D.
Pablo Daniel Rigazzi
http://www.web-studio.com.ar/
Descargar