miércoles, 5 de mayo de 2010

Un buscador para nuestra base de datos

Vamos a ver una aplicación, un ejemplo, de todo lo visto hasta ahora. Escribiremos un script que sirva para buscar una determinada cadena (que recibiremos de un formulario, y la almacenamos en la variable $buscar), dentro de nuestra base de datos, concretamente dentro del campo "nombre".

En primer lugar escribiremos el texto HTML de la página web que nos servirá como formulario de entrada, la llamaremos formulario.htm.

Formulario entrada


Palabra clave:





El siguiente script de busqueda lo llamaremos buscador.php3, y será el encargado de hacer la búsqueda en la BD, y devolver por pantalla los registros encontrados.

Script búsqueda


\n";
exit;
}
$link = mysql_connect("localhost", "nobody");
mysql_select_db("mydb", $link);
$result = mysql_query("SELECT * FROM agenda WHERE nombre LIKE '%$buscar%' ORDER BY nombre", $link);
if ($row = mysql_fetch_array($result)){
echo " \n";
//Mostramos los nombres de las tablas
echo " \n";
while ($field = mysql_fetch_field($result)){
echo " \n";
}
echo " \n";
do {
echo " \n";
echo " \n";
echo " \n";
echo " \n";
echo " \n";
echo " \n";
echo " \n";
} while ($row = mysql_fetch_array($result));
echo "
$field->name
".$row["id"]."".$row["nombre"]."


\n";
} else {
echo "¡ No se ha encontrado ningún registro !";
}
?>


Lo primero que comprobamos es que el contenido de la variable $buscar que recibimos del la página web formulario.htm no es una cadena vacia, y esto lo hacemos con la función isset() que devuelve 'falso' si la variable que recibe está vacia. A la función le anteponemos el signo admiración (!) que es equivalente a un NOT, para convertirlo en 'verdadero' en caso de que la variable esté vacia, y en es caso terminamos la ejecución del script con exit.

Lo más importante de este script, es sin duda la sentencia SQL que le enviamos al servidor MySQL, y más concretamente la condición que le imponemos, WHERE nombre LIKE '%$buscar%'. Con la sentencia LIKE buscamos cualquier ocurrencia de la cadena contenida en $buscar, mientras que con los signos de porcentaje (%) indicamos el lugar de la coincidencia, por ejemplo, si hubiesemos puesto nombre LIKE '%$buscar', buscariamos cualquier ocurrencia al final del campo"nombre", mientras que si hubiesemos puesto nombre LIKE '$buscar%', buscariamos cualquier ocurrencia al principio del campo "nombre".

La última novedad que hemos incorporado, es la función mysql_fetch_field, con el que obtenemos información acerca de las caracteríticas de cada campo, como su nombre,tipo,longitud,nombre de la tabla que los contiene,etc.

Mostrar los datos de una consulta

Ahora que ya sabemos conectar con el servidor de BD, veremos como mostrar los datos por pantalla.

Consulta de la BD




$link = mysql_connect("localhost", "nobody");
mysql_select_db("mydb", $link);
$result = mysql_query("SELECT nombre, email FROM agenda", $link);
echo " \n";
echo " \n";
while ($row = mysql_fetch_row($result)){
echo "" \n";
}
echo "
NombreE-Mail
$row[0]$row[1]
\n";
?>



En este script hemos introducido dos novedades, la más obvia es la sentencia de control while(), que tiene un funcionamiento similar al de otros lenguajes, ejecuta una cosa mientras la condición sea verdadera. En esta ocasión while() evalua la función mysql_fetch_row(), que devuelve un array con el contenido del registro actual (que se almacena en $row) y avanza una posición en la lista de registros devueltos en la consulta SQL.

La función mysql_fetch_row() tiene un pequeño problema, es que el array que devuelve sólo admite referencias numéricas a los campos obtenidos de la consulta. El primer campo referenciado es el 0, el segundo el 1 y así sucesivamente. En el siguiente script solucionaremos este pequeño inconveniente.

Consulta modificada de BD




$link = mysql_connect("localhost", "nobody");
mysql_select_db("mydb", $link);
$result = mysql_query("SELECT nombre, email FROM agenda", $link);
if ($row = mysql_fetch_array($result)){
echo " \n";
echo " \n";
do {
echo " \n";
} while ($row = mysql_fetch_array($result));
echo "
NombreE-Mail
".$row["nombre"]."".$row["email"]."
\n";
} else {
echo "¡ No se ha encontrado ningún registro !";
}
?>



Esencialmente, este script hace lo mismo que el anterior. Almacenamos en $row el registro actual con la función mysql_fetch_array() que hace exactamente lo mismo que mysql_fetch_row(), con la exepción que podemos referenciar a los campos por su nombre ($row["email"]), en vez de por un número.

Con la sentencia if/else, asignamos a $row el primer registro de la consulta, y en caso de no haber ninguno (else) mostramos un mensaje ("No se ha encontrado..."). Mientras que con la sentencia do/while, nos aseguramos que se nos muestren todos los registros devueltos por la consulta en caso de haber más de uno.

Hay que destacar la utilización del punto (.), como operador para concatenar cadenas.

Conectar a MySQL desde PHP

Ya tenemos datos en nuestra BD, así que con el siguiente script nos conectaremos a la BD del servidor MySQL para obtener los datos de un registro.

Conexión al MySQL




$link = mysql_connect("localhost", "nobody");
mysql_select_db("mydb", $link);
$result = mysql_query("SELECT * FROM agenda", $link);
echo "Nombre: ".mysql_result($result, 0, "nombre")."
";
echo "Dirección: ".mysql_result($result, 0, "direccion")."
";
echo "Teléfono :".mysql_result($result, 0, "telefono")."
";
echo "E-Mail :".mysql_result($result, 0, "email")."
";
?>



En la primera línea del script nos encontramos con la función mysql_connect(), que abre una conexión con el servidor MySQL en el Host especificado (en este caso la misma máquina en la que está alojada el servidor MySQL,localhost). También debemos especificar un usuario (nobody, root, etc. ), y si fuera necesario un password para el usuario indicado (mysql_connect("localhost", "root", "clave_del_root")). El resultado de la conexión es almacenado en la variable $link.

Con mysql_select_db() PHP le dice al servidor que en la conexión $link nos queremos conectar a la base de datos mydb. Podríamos establecer distintas conexiones a la BD en diferentes servidores, pero nos conformaremos con una.

La siguiente función mysql_query(), es la que hace el trabajo duro, usando el identificador de la conexión ($link), envía una instrucción SQL al servidor MySQL para que éste la procese. El resultado de ésta operación es almacenado en la variable $result.

Finalmente, mysql_result() es usado para mostrar los valores de los campos devueltos por la consulta ($result). En este ejemplo mostramos los valores del registro 0, que es el primer registro, y mostramos el valor de los campos especificados.

Importar bases de datos desde MS Access

Un caso muy común, como en mi caso, al comenzar a utilizar MySQL, necesitaba migrar mis bases de datos desde Access a MySQL. La solución a este problema, nos la aporta un módulo creado por Pedro Freire de CYNERGI.

Los pasos que debemos seguir para instalar este módulo, y su posterior uso son:

  1. Abre el archivo de Access .mdb que deseas exportar.
  2. En la ventana de objetos de la BD selecciona "Módulos", y después en "Nuevo".
  3. Entonces se te abrirá una ventana nueva, borra todo texto (código) que haya escrito.
  4. Copia todo el texto del archivo de Pedro Freire y pégalo en el nuevo módulo.
  5. Cierra la ventana de código del módulo, selecciona que "Sí" desea guardar los cambios y nombra el módulo (p.e. "MexportSQL"). El módulo es ahora parte de tu base de datos Access
  6. Vuelve a abrir el módulo, o pincha con el ratón en "Diseño" con nuestro nuevo módulo seleccionado. Mueve el cursor hasta donde aparezca la primera palabra "Function", y presiona F5 o selecciona "Ejecutar" en el menú.

La ejecución del módulo nos creará dos archivos (esql_add.txt y esql_del.txt) en el directorio C:/temp (el que trae por defecto, pero lo podemos cambiar). A nosotros el archivo que nos interesa es esql_add.txt, el cuál como mejor nos parezca deberemos llevarnoslo a nuestra máquina Linux.

Ahora solo tenemos que seguir los paso que explicamos en el capítulo anterior:

  1. Creamos la base de datos: mysqladmin create mybd
  2. Volamos los datos y la nueva base de datos: cat esql_add.txt | mysql mybd

Comenzando con MySQL

Antes de seguir con PHP, vamos a preparar la base de datos(BD) que vamos a utilizar como ejemplo. Como servidor de BD, usaremos MySQL un pequeño y compacto servidor de BD, ideal para pequeñas y medianas aplicaciones. MySQL soporta el estándar SQL (ANSI), y además está disponible para distintas plataformas, incluido las "windows".

Una vez instalado MySQL (dejemos esta explicación para más tarde), vamos a crear nuestra BD ejemplo. MySQL utiliza una tabla de permisos de usuarios, por defecto, en la instalación crea el usuario root sin password. Debes crear distintos usuarios con distintos permisos. Entre ellos, el usuario administrador de MySQL, con todos los permisos, y como recomendación de seguridad, el usuario nobody sólo con el permiso de ver (SELECT), que es el que utilizaremos para conectarnos al servidor de BD en nuestros script.

Para crear nuestra BD, debemos ser el administrador de MySQL o el root,para ello haremos lo siguiente:

mysqladmin create mybd

Ya hemos creado una BD, ahora le añadiremos una tabla y algunos registros, para lo cual copia el siguiente texto y sálvalo en un archivo, que podríamos llamar mybd.dump.

Crear tabla mybd
CREATE TABLE agenda (id INT NOT NULL AUTO_INCREMENT, nombre CHAR(50),
direccion CHAR(50), telefono CHAR(15), email CHAR(30), KEY (id) )\g

INSERT INTO agenda VALUES (0, 'Juan Pérez', 'C/ Laguna, 15. Sevilla',
'95.455.55.55', 'juan@agenda.com' )\g

INSERT INTO agenda VALUES (1, 'Luis García', 'C/ Betis, 22. Cádiz',
'95.655.66.33', 'luis@agenda.com' )\g

INSERT INTO agenda VALUES (2, 'Carlos Rodríguez', 'C/ Sevilla, 6. Huelva',
'95.113.22.77', 'carlos@agenda.com' )\g

Debemos tener en cuenta que los comandos de arriba debe escribirse cada uno en una sola línea. Se han separado para aumentar la legibilidad del código.

Ahora desde la línea de comandos ejecuta:

cat mybd.dump | mysql mybd

Cabe destacar el campo id, que no puede estar vacio, y además es autoincrementable, lo cuál deberemos tener en cuenta a la hora de actualizar y añadir registros. Si no hemos cometido ningún error, ya tenemos nuestra base de datos de ejemplo en el servidor MySQL.

Mi primer script

Una vez que ya tenemos instalados PHP y MySQL, y el servidor Apache configurado para usarlos, podemos comenzar a escribir nuestro primer Script en PHP.

Ejemplo script php



$myvar = "Hola Mundo. Este es mi primer script en PHP";
//Esto es un comentario
echo $myvar;
?>

Una vez escrito esto lo salvamos en un fichero con la extension php3, y lo colocamos en nuestro servidor, http://mi_servidor/php/test.php3. Ahora si ponemos esta URL en nuestro navegador veremos una linea con el texto "Hola Mundo. Este es mi primer script en PHP".

Lo primero que apreciamos en el script son sus delimitadores. En la primera línea del script vemos que nos indica que comienza un script en PHP, y en la última colocamos ?> para indicar el final del script. Hay que destacar que todas las líneas que se encuentre entre estos delimitadores deben acabar en punto y coma, excepto las sentencias de control (if, swich, while, etc.).

Como en toda programación, es importante poner muchos comentarios, para lo cual si queremos comentar una sola línea tenemos que poner al principio de la línea //, si lo que queremos es comentar varias utilizaremos los delimitadores /* - */.

Para que el servidor envie texto utilizaremos la instrucción echo, aunque también podemos utilizar printf de uso similar al del C oPerl.

Finalmente, vemos que la palabra myvar comienza con el signo dólar ($) . Este símbolo le indica a PHP que es una variable. Nosotros le hemos asignado un texto a esta variable, pero también pueden contener números o arrays. Es importante recordar que todas las variables comienza con el signo dólar.

Crear Thumbnails de imágenes con PHP

Para los que no estan familiarizados con el termino esto se refiere a previsualizaciones de menor tamaño de una imagen original lo cual se utiliza mucho para galerias, mostrando una copia de la imagen original pero de menor tamaño tanto en pixeles co


Para el ejemplo utilizare una como formato de imagen

el GIF, primero presentare el código y luego la explicación línea

por línea al igual que como hacerlo con diferentes formatos de imagen.




Supongo que el nombre del archivo es imagen.php



<?php 

//Una Creacion De Jorge Luis Martinez M

//http://misCodigos.jlmnetwork.com/

/*Este Archivo Recibe Los Parametros $ruta, Que Es La Ruta Interna De La Imagen En El Servidor, Y Los Parametros $ancho y $alto Que Se Refiere Al Alto Y Ancho De La Previsualizacion.*/

$fuente = @imagecreatefromgif($ruta);
$imgAncho = imagesx ($fuente);
$imgAlto =imagesy($fuente);
$imagen = ImageCreate($ancho,$alto);

ImageCopyResized($imagen,$fuente,0,0,0,0,$ancho,$alto,$imgAncho,$imgAlto);

Header("Content-type: image/gif");
imageGif($imagen);

?>


Nota: La explicación la hago suponiendo

un conocimiento básico de php por parte del lector.


Lo primero


es recordar que este archivo recibe los parámetros $ruta

que es la ruta interna de la imagen en el servidor, entonces si el fichero

imagen.php se encuentra en:



http://www.servidor.com/cuenta/imagen.php



Y la imagen, en este caso supondremos el nombre “01.gif”,


se encuentra en:



http://www.servidor.com/cuenta/galeria/01.gif


A imagen.php sólo le pasaremos galeria/01.gif

como valor de ruta:



http://www.servidor.com/cuenta/imagen.php?ruta=galeria/01.gif



Pero esto no es todo, recordemos que recibe otros dos parámetros, los

cuales son alto y ancho,

estos no se refieren al alto y ancho de la imagen original, se refieren al alto

y ancho que queremos la previsualización (Thumbnail), entonces si queremos


que nos devuelva la imagen 01.gif, ubicada

en el directorio galeria y cuyo tamaño original

es de 400 píxeles de anchura y 300 píxeles de altura pero queremos

la previsualización de 200 píxeles de anchura y 150 píxeles


de altura tendriamos que llamarla de esta manera:


http://www.servidor.com/cuenta/imagen.php?ruta=galeria/01.gif&ancho=200&alto=150


Nota:

Obviamente si lo llamamos para presentarlo

como imagen dentro de un archivo al usuario(.html, .php, etc), lo llamamos mediante


el tag IMG:



<IMG SRC="http://www.servidor.com/cuenta/imagen.php?ruta=galeria/01.gif&ancho=200&alto=150">


Ahora que

ya sabemos como llamar a la imagen, vamos a ver como se hace la previsualización

(Thumbnail), como es que se crea desde una imagen más grande una imagen


más pequeña tanto en píxeles como en tamaño para su presentación

al usuario.



Primero creamos una copia de la imagen desde archivo, la igualamos a $fuente,

ya que allí quedará un identificador de tipo ENTERO

(INT) para dirigirnos a la imagen creada, esto es necesario ya que será

de esta imagen que haremos la previsualización (Thumbnail).




$fuente = @imagecreatefromgif($ruta);


Nota: Recuerde

que el @imagecreatefromgif() es para imagenes gif,

si quiere crear jpeg o png solamente cambie el gif:




@imagecreatefromjpeg($ruta) ó @imagecreatefrompng($ruta)



Ahora obtendremos la anchura y altura de la imagen original, esto es necesario

para poder hacer la copia de la imagen, para ello utilizamos las funciones

imageSX y imageSY,


que reciben como parametro un identificador de imagen (en este caso $fuente,

que es el identificador de la imagen original) y devuelven la anchura y altura

de la imagen respectivamente.



$imgAncho = imagesx ($fuente); 

$imgAlto =imagesy($fuente);


Ahora

creamos una imagen nueva en blanco con la anchura y altura que queremos para


la previsualización (Thumbnail) y que será la que se le devuelva al usuario

cuando se le llame, ya sea directamente en el browser o por medio de la etiqueta

IMG de html.



$imagen = ImageCreate($ancho,$alto);


Ahora

lo más importante, copiaremos la imagen original a la imagen nueva, lo


cual hará que al tener un menor tamaño (la imagen nueva), la copia de

que hacemos de la original se ajustara al tamaño de esta.



Utilizamos la funcion ImageCopyResized() la cual

sirve para copiar “partes” de una imagen a otra por medio de coordenadas, pero

en nuestro caso no necesitamos un pedazo, necesitamos copiar toda la imagen


en todo el espacio de la nueva imagen, por ello damos las coordenadas totales

de las imágenes.



Esto puede sonar un poco confuso, por eso es mejor que mires la documentacion

oficial en http://www.php.net/ para información sobre los parametros que recibe esta función.




ImageCopyResized($imagen,$fuente,0,0,0,0,$ancho,$alto,$imgAncho,$imgAlto);


Listo,

ya tenemos nuestra imagen, ahora debemos indicarle al navegador que vamos a

devolver una imagen de tipo gif, para ello enviamos la cabecera diciendo el

tipo de contenido que enviaremos al navegador.



Header("Content-type: image/gif");



Nota: Recuerde, si el formato es jpeg o png solamente cambie el gif:


image/jpeg ó image/png


Ahora

devolvemos la imagen directamente al browser(navegador) del usuario.



imageGif($imagen);



Nota: Recuerde, si el formato es jpeg o

png solamente cambie el gif: imageJpeg($imagen)

o imagePng($imagen)



Bien espero haya quedado claro,


pero vamos a ver otro aspecto, que tal si no queriamos devolver la imagen,

lo que queriamos era guardar la nueva imagen (Thumbnail) en el servidor, para

su uso posterior?…


Al ponerle

un segundo parametro al imageGif($imagen,”imagenPequena.gif”),


Lo lograremos, en este caso guardaria la imagen que acabamos de crear en el

servidor, especificamente en la misma carpeta con el nombre de “imagenPequena.gif”.


Esto puede

ser muy util, ya que si queremos crear thumbnails de todas las imagenes en

un directorio, podemos hacer un loop que lea los archivos del directorio,

y repita el proceso anterior(de crear imagen en blanco y copiar) y guarde


las nuevas imagenes para su uso posterior, realmente es una herramienta con

muchos usos.


Nota: Cabe recordar que su servidor tiene

que tener soporte para manipular imágenes, según el tipo que desee

utilizar, en caso de no tenerlo el servidor le dará un mensaje de error

como “Jpeg is no support…” dependiendo


del formato de imagen.


Suerte y hasta el próximo tutorial!

Registro y reconocimiento de usuarios con PHP

En esta oportunidad crearemos un sistema de registro de usuarios utilizando a PHP.


¿En que consiste? y ¿para que sirve? muy sencillo, en algunas webs como

por ejemplo esta, queremos interactuar con los usuarios, deseamos que estos

puedan enviar scripts al sistema para ayudar a crecer la coleccion de scripts


que disponemos, pero deseamos llevar un control sobre los autores de los scripts

asi que no cualquiera puede enviar scripts, para hacerlo tienes que registrarte

y hacer el respectivo "ingreso" para que el sistema te reconosca

y te deje enviar scripts, archivos y articulos como este, de otra manera no

puedes hacer ninguna de estas acciones.



¿Pero como se logra esto?, se hace teniendo en una base de datos una tabla de usuarios(Podria

hacerse con archivos, aunque seria un poco inseguro) y por medio de archivos

PHP y manejo de sesiones(session) o por "cukis"(cookies).


En este articulo explicare como crear un sistema de registro y reconocimiento de usuarios teniendo

una tabla en una base de datos MySql y por medio de "cukis"(COOKIES)


para nuestra web de una manera sencilla.


A la hora de crear un sistema de registro de usuarios siempre pensamos en lo mismo:


registro + login

+ reconocimiento


Queremos que los usuarios se registren dejando sus datos y puedan acceder a algunas zonas

de la pagina y sea reconocido por nuestra pagina(por ejemplo "bienvenido

jlmm" o "bienvenido visitante" en caso de no estar ingresado


(o registrado) en el sistema).


Muchos piensan en crear un sistema de usuarios por que les parece "bonito", pero hay

pocos que realmente lo necesitan(lo digo por experiencia con dichas personas),

y cuando les haces las dos preguntas:


1- ¿que beneficios tienen los usuarios registrados con respecto a los demas?


2- ¿que zonas de tu web quieres que sean de acceso restringido y PORQUE?



La mayoria no es capaz de responder la primera pregunta, y es que antes de aventurarnos a crear

un sistema de usuarios para nuestra web debemos de pensar si realmente vale

la pena, ya que las tematicas de la web y sus contenidos no siempre son adecuados

para tener un sistema de registro de usuarios.


Para ello respondemos las 2 preguntas, en el caso de misCODIGOS.com serian:


1- ¿que beneficios tienen los usuarios registrados con respecto a los demas?


R://Posibilidad de enviar scripts, articulos y archivos al sistema, al igual


que disponibilidad de un panel de control entre otros.


2- ¿que zonas de tu web quieres que sean de acceso restringido y PORQUE?


R://Quiero que solo los usuarios que esten registrados puedan enviar scripts/articulos/archivos,

ya que asi puedo llevar un mejor cotrol sobre los mismos y prevenir el envio

indiscriminado de scripts/articulos/archivos al sistema por parte de los usuarios.


Ya tenemos nuestras razones para crear nuestro sistema de registro de usuarios, claro que pueden

haber muchas razones dependiendo del tipo de web, podrian ser por ejemplo para


que solo usuarios registrados puedan bajar software/musica/videos/etc, para

restringir el acceso a ciertas zonas de la web "obligando" al usuario

a registrarse para poder "ver" dicha zona, etc…


Siempre teniendo en cuenta que las razones sean validas y que no molesten al usuario,


ya que en mi caso hace algunos meses me encontre con una web de "scripts"

la cual para poder ver los "scripts" tenias que registrarte, obviamente

lo que hice fue salir de esa web y olvidarla (por ello no les puedo dar la direccion),

tenemos que tener muy en cuenta que zonas restringir a usuarios registrados

ya que el usuario en general prefiere la comodidad y en este caso que les comento


de webs con recursos y scripts para webmasters hay muchas (pero ninguna como

esta :-P ) y hay que buscar siempre la comodidad de los usuarios.


Ahora a lo que vinimos, crearemos nuestro sistema de registro de usuario, lo primero que debemos pensar

es que datos debera introducir el usuario para registrarse, como siempre deberan

de haber aunque sea dos campos basicos:




  • nick

  • password


Lo mas común para identificar a los usuarios es por medio de nick/password,

aunque también podria ser email/password, para este articulo utilizare

el primero(nick/password).


Ya sabemos que nuestra tabla de "usuarios" tendra esos dos campos:




CREATE TABLE usuarios (
id bigint(7) NOT NULL auto_increment,
nick char(100) NOT NULL,
password char(100) NOT NULL,
KEY id (id))


¿Pero

son suficientes?, tambien seria bueno tener el email de los usuarios en caso

de querer enviar informacion a los usuarios registrados y tener el nombre de

dichos usuarios para personalizar dichos emails o mensajes que le demos al usuario

en la pagina(ejemplo "hola jorge luis"), entonces nuestra tabla creceria


un poco:



CREATE TABLE usuarios (
id bigint(7) NOT NULL auto_increment,
nick char(100) NOT NULL,
password char(100) NOT NULL,
nombre char(255) default NULL,
email char(100) default NULL,
KEY id (id))


Listo, ya tenemos la estructura de nuestra tabla de usuarios, es pequeña y sencilla

pero para efectos prácticos y de aprendizaje es perfecta (eso depende

de ti, según lo que desees saber de tus usuarios).


Ahora viene lo sencillo,


crear el sistema de registro de usuarios, un formulario y una aplicacion que

agregue al nuevo usuario a la base de datos, para ello crearemos un formulario

del tipo:



FORM ACTION="registrar.php" METHOD="post">
Nick : <INPUT TYPE="text" NAME="nick" SIZE=20 MAXLENGTH=20>

<BR>
Email: <INPUT TYPE="text" NAME="email" SIZE=28 MAXLENGTH=100>
<BR>
Password: <INPUT TYPE="password" NAME="password"

SIZE=28 MAXLENGTH=20>
<BR>
Nombre: <INPUT TYPE="text" NAME="nombre" SIZE=28
MAXLENGTH=255>
<BR>

<INPUT TYPE="submit" CLASS="boton" VALUE="Registrar">
</FORM>


Y ahora necesitamos una aplicacion que lo procese (registrar.php), por motivos

practicos haremos algo sencillo sin demasiadas comprobaciones (dependera de


ti mejorarlo si quieres algo mas personalizado), primero el codigo luego la

explicacion:



<?php
//AQUI CONEXION O include() DE ARCHIVO DE CONEXION CON BASE DE DATOS.
function quitar($mensaje)
{
$mensaje = str_replace("<","<",$mensaje);
$mensaje = str_replace(">",">",$mensaje);
$mensaje = str_replace("\'","'",$mensaje);
$mensaje = str_replace('\"',""",$mensaje);
$mensaje = str_replace("\\\\","\",$mensaje);
return $mensaje;
}

if(trim($HTTP_POST_VARS["nick"]) != "" && trim($HTTP_POST_VARS["email"]) != "")
{
$sql = "SELECT id FROM usuarios WHERE nick='".quitar($HTTP_POST_VARS["nick"])."'";
$result = mysql_query($sql);
if($row = mysql_fetch_array($result))
{
echo "Error, nick escogido por otro usuario";
}
else
{
$sql = "INSERT INTO usuarios (nick,password,nombre,email) VALUES (";
$sql .= "'".quitar($HTTP_POST_VARS["nick"])."'";
$sql .= ",'".quitar($HTTP_POST_VARS["password"])."'";
$sql .= ",'".quitar($HTTP_POST_VARS["nombre"])."'";
$sql .= ",'".quitar($HTTP_POST_VARS["email"])."'";
$sql .= ")";
mysql_query($sql);
echo "Registro exitoso!";
}
mysql_free_result($result);
}
else
{
echo "Debe llenar como minimo los campos de email y password";
}
mysql_close();
?>



Al principio no he echo conexion con la base de datos pero he puesto el comentario "//AQUI CONEXION O include() DE ARCHIVO DE CONEXION CON BASE DE DATOS.", ya que la conexion depende de ti, si no sabes como hacer una conexion te aconsejo

buscarte un manual antes de estar queriendo hacer un sistema como este.


Vemos que he declarado una funcion, llamada quitar($mensaje), la cual recibe el parametro "mensaje",

esta funcion se encargara de deshabilitar el codigo html("<" y


">") al reemplazarlos por su respectivo codigo("<"

y ">"), ademas de reemplazar el apostrofe(‘) y las comillas dobles(")

por sus respectivos codigos HTML, esto para no tener conflictos con la instruccion

sql, y al final retorna la cadena con las nuevas modificaciones en caso de haberlas:



function quitar($mensaje)
{
$mensaje = str_replace("<","<",$mensaje);
$mensaje = str_replace(">",">",$mensaje);
$mensaje = str_replace("\'","'",$mensaje);
$mensaje = str_replace('\"',""",$mensaje);
$mensaje = str_replace("\\\\","\",$mensaje);
return $mensaje;
}



Ahora

comprobaremos que los campos de nick y password que seran los "requeridos"

como minimo para completar el registro no esten vacios, para ello utilizamos

la funcion "trim()" la cual quita los espacios al comienzo y al final

de la cadena, por lo que en caso de ser una cadena vacia o con solo espacios


en blanco retornara "", en caso de ser valido continuamos con el registro,

de lo contrario retornamos un mensaje de error:



if(trim($HTTP_POST_VARS["nick"]) != ""
&& trim($HTTP_POST_VARS["password"]) != "")



Ahora suponiendo que las cadenas estaban correctas comprobaremos que el nick seleccionado

por el usuario no exista en la base de datos, para ello hacemos una instruccion

sql para pedirle a la base de datos que nos retorne la fila donde el nick sea

igual al nick introducido con el usuario(quitandole el apostrofe, html y demas

con la funcion quitar()):



$sql = "SELECT id FROM usuarios WHERE nick='".quitar($HTTP_POST_VARS["nick"]."'";
$result = mysql_query($sql);



En caso de existir dicho nick, osea que nos devuelve una fila:



if($row = mysql_fetch_array($result))


Mostraremos un mensaje de error al usuario informandole del "incidente", de lo

contrario continuaremos con el proceso de registro.


Ahora

lo que hacemos es simplemente una instruccion sql donde insertamos en la tabla


usuarios el nick, password, nombre y email introducidos por el usuario en el

formulario, a todos estos les quitamos el html, apostrofe y demas haciendo uso

de nuestra instruccion "quitar()", y mostramos un mensaje de "exito" al usuario:



$sql = "INSERT INTO usuarios (nick,password,nombre,email)
VALUES (";
$sql .= "'".quitar($HTTP_POST_VARS["nick"])."'";
$sql .= ",'".quitar($HTTP_POST_VARS["password"])."'";
$sql .= ",'".quitar($HTTP_POST_VARS["nombre"])."'";
$sql .= ",'".quitar($HTTP_POST_VARS["email"])."'";
$sql .= ")";
mysql_query($sql);
echo "Registro exitoso!";



Nota:Por efectos practicos hemos echo esto muy sencillo, podrian agregar más

comprobaciones como la del email o manejo de errores mysql.


Tambien podria hacerse más seguro mediante el uso de la funcion de encriptacion

md5() para el password, aunque se esta haciendo lo mas sencillo posible ya que

la finalidad de este articulo es la de enseñar como reconocer a los usuarios,

de ustedes dependen estos "detalles" a la hora de "depurar" este codigo.



Bien, listo ya tenemos la aplicacion de registro, ¿pero y ahora que?, que hago

con todos esos usuarios, ahora necesitamos que los usuarios ingresen y sean

"reconocidos" y como lo dije lo haremos por medio de cookies.


Crearemos un formulario HTML para que los usuarios introduscan su nick y password al igual que deberemos

de realizar una aplicacion ingresar.php que sera la encargada de procesar si

el usuario es valido y darle "ingreso" al sistema por medio de una


cookie.


Es recomendable tener este archivo en la carpeta raiz de nuestra web, el formulario html seria algo

asi:



<FORM ACTION="ingresar.php" METHOD="post">
Nick : <INPUT TYPE="text" NAME="nick" SIZE=20 MAXLENGTH=20>
<BR>
Password: <INPUT TYPE="password" NAME="password"
SIZE=28 MAXLENGTH=20>
<BR>
<INPUT TYPE="submit" CLASS="boton" VALUE="Ingresar">
</FORM>



Y

ahora el codigo de nuestra aplicacion ingresar.php, luego la explicacion:





<?php

//AQUI CONEXION O include() DE ARCHIVO DE CONEXION CON BASE DE DATOS.

function quitar($mensaje)
{
$mensaje = str_replace("<","<",$mensaje);
$mensaje = str_replace(">",">",$mensaje);
$mensaje = str_replace("\'","'",$mensaje);
$mensaje = str_replace('\"',""",$mensaje);
$mensaje = str_replace("\\\\","\",$mensaje);
return $mensaje;
}

if(trim($HTTP_POST_VARS["nick"]) != "" && trim($HTTP_POST_VARS["password"]) != "")
{
$nickN = quitar($HTTP_POST_VARS["nick"]);
$passN = quitar($HTTP_POST_VARS["password"]);

$result = mysql_query("SELECT password FROM usuarios WHERE nick='$nickN'");
if($row = mysql_fetch_array($result))
{
if($row["password"] == $passN)
{
//90 dias dura la cookie
setcookie("usNick",$nickN,time()+7776000);
setcookie("usPass",$passN,time()+7776000);
?>
Ingreso exitoso, ahora sera dirigido a la pagina principal.

<SCRIPT LANGUAGE="javascript">
location.href = "index.php";
</SCRIPT>
<?
}
else
{
echo "Password incorrecto";
}
}
else
{
echo "Usuario no existente en la base de datos";
}
mysql_free_result($result);
}
else
{
echo "Debe especificar un nick y password";
}
mysql_close();
?>


Bien, arriba ya explique que debes de realizar la conexion y explique el funcionamiento

de la funcion quitar($mensaje), asi que saltemos hasta el primer "if".


Lo primero que hacemos es comprobar que los campos de "nick" y "password" para


que no esten vacios, ya sabemos para que sirve trim() asi que no lo repetire:



if(trim($HTTP_POST_VARS["nick"]) != ""
&& trim($HTTP_POST_VARS["password"]) != "")


Asi que continuamos suponiendo que todo este bien, ahora lo que hacemos es quitarle

el html, apostrofe comillas y demas al nick y password enviados por el usuario

para su comprobacion con la base de datos, para ello utilizamos la funcion quitar($mensaje)


que explicamos antes, y guardamos las nuevas cadenas en dos nuevas variables:



nickN = quitar($HTTP_POST_VARS["nick"]);
$passN = quitar($HTTP_POST_VARS["password"]);


Ahora ejecutamos una instruccion sql, en la cual le pedimos a la base de datos que

de la tabla usuarios nos devuelva la fila cuyo nick corresponda por el enviado

por el usuario:



$result = mysql_query("SELECT password FROM usuarios
WHERE nick='$nickN'");



Si devuelve una columna quiere decir que el nick SI existe en la base de datos,

de lo contrario devolvemos un mensaje de error:



if($row = mysql_fetch_array($result))
{
...
}
else
{
echo "Usuario no existente en la base de datos";
}


Ahora continuamos con el proceso suponiendo que el usuario exista en la base de datos

ahora debemos comprobar que el password sea correcto, para ello hacemos una

simple comparacion, si es correcto continuamos de lo contrario mostramos el


mensaje de password incorrecto:



if($row["password"] == $passN)
{
...
}
else
{
echo "Password incorrecto";
}


Ahora suponiendo que el password es correcto continuamos y lo proximo a hacer es establecer

las cookies de nick y password (Las cuales nombramos "usNick"/"usPass" y contienen el nick y password respectivamente) en la maquina del usuario, informamos


que se ha realizado correctamente el login y lo enviamos a la pagina principal,

una vez mas recalco que estamos haciendo esto lo mas sencillo posible, de ti

depende personalizar y mejorar los mensajes :



setcookie("usNick",$nickN,time()+7776000);
setcookie("usPass",$passN,time()+7776000);
?>
<SCRIPT LANGUAGE="javascript">
alert("Ingreso exitoso");
location.href = "index.php";
</SCRIPT>
<?


Listo, el usuario ya tiene las cookies en su sistema, ¿pero ahora que?, como


hacemos para comprobar en las paginas que queramos si el login es correcto,

osea que el usuario posee las cookies y son validas?.


Para ello crearemos un ultimo archivo, lo llamaremos login.php, este se encargara de leer las cookies

y decirnos si el usuario es un usuario registrado y que ha echo el respectivo "ingreso" al sistema, el contenido de dicho archivo seria el siguiente:



<?php
$loginCorrecto = false;
$idUsuarioL;
$nickUsuarioL;
$emailUsuarioL;
$nombreUsuarioL;

if(isset($HTTP_COOKIE_VARS["usNick"]) && isset($HTTP_COOKIE_VARS["usPass"]))
{
$result = mysql_query("SELECT * FROM usuarios WHERE nick='".$HTTP_COOKIE_VARS["usNick"]."' AND password='".$HTTP_COOKIE_VARS["usPass"]."'");

if($row = mysql_fetch_array($result))
{
setcookie("usNick",$HTTP_COOKIE_VARS["usNick"],time()+7776000);
setcookie("usPass",$HTTP_COOKIE_VARS["usPass"],time()+7776000);
$loginCorrecto = true;
$idUsuarioL = $row["id"];
$nickUsuarioL = $row["nick"];
$emailUsuarioL = $row["email"];
$nombreUsuarioL = $row["nombre"];
}
else
{
//Destruimos las cookies.
setcookie("usNick","x",time()-3600);
setcookie("usPass","x",time()-3600);
}
mysql_free_result($result);
}
?>



Lo primero que hacemos es declarar unas variables que utilizaremos para guardar

los datos del usuario en caso de tener las cookies en su sistema y de estas

ser correctas:



$loginCorrecto = false;
$idUsuarioL;
$nickUsuarioL;
$emailUsuarioL;
$nombreUsuarioL;


Hay una variable boleana que tenemos que mirar de cerca y es la de $loginCorrecto

ya que esta sera la que utilizaremos para comprobar el login en nuestros archivos,


mas adelante veremos como.


Seguidamente lo que hacemos es comprobar que las cookies existan, si no existen pues no hay problema

simplemente no hay "ingreso" :



if(isset($HTTP_COOKIE_VARS["usNick"]) &&
isset($HTTP_COOKIE_VARS["usPass"]))



Ahora lo que hacemos es una sentencia sql, en la cual le pedimos a la base de datos

que nos devuelva la fila donde el nick y password correspondan al nick y password

guardado en las cookies:



$result = mysql_query("SELECT * FROM usuarios WHERE
nick='".$HTTP_COOKIE_VARS["usNick"]."' AND password='".$HTTP_COOKIE_VARS["usPass"]."'");


Si ese nick y password corresponden a una fila en la base de datos esto quiere

decir que son correctos de lo contrario la informacion de las cookies esta mal


y debemos destruirlas:



if($row = mysql_fetch_array($result))
{
...
}
else
{
//Destruimos las cookies.
setcookie("usNick","x",time()-3600);
setcookie("usPass","x",time()-3600);
}


Si la informacion es correcta procedemos con el ingreso, establecemos de nuevo

las cookies con lo que se actualiza el tiempo de destruccion a otros noventa

dias apartir de ahora:



setcookie("usNick",$HTTP_COOKIE_VARS["usNick"],time()+7776000);
setcookie("usPass",$HTTP_COOKIE_VARS["usPass"],time()+7776000);



Seguido de esto establecemos la variable $loginCorrecto a "true", y las otras

variables las llenamos con la informacion del usuario:



$loginCorrecto = true;
$idUsuarioL = $row["id"];
$nickUsuarioL = $row["nick"];
$emailUsuarioL = $row["email"];
$nombreUsuarioL = $row["nombre"];


Listo ya tenemos nuestro archivo "login.php", ahora ¿como lo utilizamos?,

bien supongamos que queremos en nuestro "index.php" darle la bienvenida


al usuario en caso de estar ingresado en el sistema deseamos saludarlo por su

nick o nombre en caso contrario lo saludaremos como visitante, para ello tendriamos

que incluir el archivo "login.php" al comienzo de nuestro archivo

"index.php" asi:



Nota:Antes de incluir el "login.php" debe recordar realizar la conexion con la base de datos,

de lo contrario obtendra errores.



<?php
//AQUI CONEXION O include() DE ARCHIVO DE CONEXION CON BASE DE DATOS.
include("login.php");
...


Con eso el "login.php" se encargara de realizar las acciones que vimos


arriba, ahora en nuestro "index.php" donde queramos saludar al visitante

ponemos lo siguiente:



... if($loginCorrecto)
{
echo "Estas identificado en el sistema como ".$nickUsuarioL;
}
else
{
echo "Bienvenido visitante, el sistema no te ha reconocido";
}
...


Como ven, hicimos uso de la variable $loginCorrecto la cual sera "true"


en caso de que el usuario fuera reconocido por el sistema, de lo contrario sera

"false".


Y asi podemos usarlo en muchas areas, supongamos que tenemos una seccion donde solo pueden accesar

los usuarios registrados, la llamaremos "restringida.php", entonces lo que hariamos para prevenir que usuarios no registrados vean el contenido seria algo asi:



<?php
//AQUI CONEXION O include() DE ARCHIVO DE CONEXION CON BASE DE DATOS.

include("login.php");

if($loginCorrecto)
{
echo "Aqui el contenido solo para usuarios registrados";
}
else
{
echo "El sistema no lo ha identificado, solo los usuarios registrados tienen acceso a esta area";
}
?>



Eso es todo, espero haya quedado claro. PD: Sobre el proceso de "logout"

o "salir" no lo explico ya que es algo muy sencillo, simplemente se

"borran" las cookies.

Crear de un sistema de comentarios en PHP

Enseñaré como crear un sistema de comentarios, técnica que normalmente se utiliza para que los usuarios comenten sobre noticias de tu web, pero tambien se puede usar para otros casos.


Para

el correcto aprendizaje supondremos una “situación”, supongamos que tienes


un sistema de noticias, en el cual los usuarios pueden ver las noticias de la

forma noticia.php?id=1, entonces queremos que los usuarios dejen sus

comentarios sobre cada noticia.


Nota: La explicación la hago suponiendo un conocimiento básico de

PHP y interacción con bases de datos (en este caso MySql) por parte del


lector.


Lo primero que tenemos que pensar es ¿que datos del usuario necesitamos?, bien,

supongamos que queremos que el usuario deje su comentario junto con un nick

(nombre, sobrenombre, alias), para ello crearíamos una tabla llamada comentarios con los campos:


id


- Tipo Entero


nick – Tipo Caracter


comentario – Tipo Caracter


La

instrucción para su creación seria:




CREATE TABLE comentarios (
id bigint(7) default NULL,
nick char(20) default NULL,
comentario char(250) default NULL,
KEY id (id) )


Bien,

pero aquí viene el problema que se le presenta a muchas personas y es

¿como reconocer que comentarios corresponden a una noticia determinada?, aunque

para algunos parezca sencillo les digo (por experiencia con esas personas) que


puede ser un dilema para muchos que no lo “ven”.


Muchos

piensan que se hace desde la noticia, reconociendo los comentarios, pero es

al contrario, son los comentarios quienes tienen que saber a que noticia pertenecen,

para ello necesitamos otro campo en nuestra tabla de comentarios:




CREATE TABLE comentarios (
id bigint(7) default NULL,
id_noticia bigint(7) default NULL,
nick char(20) default NULL,
comentario char(250) default NULL,
KEY id (id) )


El

campo de tipo entero id_noticia, el cual

contendrá el id de la noticia a que


corresponde.


Nota:

Recordemos que en este caso suponemos que las noticias se llaman de la forma

noticia.php?id=234, donde el id corresponde

al id de la noticia en la base de datos.


Ahora debemos mostrar los comentarios, y tener un formulario de envío


de comentarios en mi noticia.php y una aplicación

que lo procese.


Nota:

Solo voy a poner el código que muestra los comentarios y el formulario

de envío, ya que de eso es que trata este tutorial y se supone que ya


tienes tu sistema de noticias (o en lo que sea que lo vayas a implementar).


Este

es el código que muestra los comentarios de la noticia actual (después

el código para enviar los comentarios), recordemos que obtenemos el id de la noticia que lo hemos pasado por


medio de noticia.php?id=123, primero el

código, luego la explicación del código:



<CENTER>
<TABLE CELLSPACING=1 CELLPADDING=1 WIDTH=300 BORDER=0 STYLE="border:1px solid black">
<TR>
<TD BGCOLOR="#FAFAFA">
<CENTER>

<SPAN STYLE="font-size:11px;font-family:Tahoma;color:black;font-weight:bold"> .Comentarios De Los Usuarios.
</SPAN>
</CENTER>
</TD>
</TR>

<TR>
<TD HEIGHT=1 BGCOLOR=black>
</TD>
</TR>

<TR>
<TD BGCOLOR="#FEFEFE">
<SPAN STYLE="font-size:11px;font-family:Tahoma;color:black;">

<?
$resultComen = mysql_query("SELECT * FROM comentarios WHERE id_noticia='$id' ORDER BY id ASC");
while($rowComen = mysql_fetch_array($resultComen))
{
?> ;
< FONT COLOR=RED>
< B><? echo $rowComen["nick"]; ?></B>

< /FONT>
:
< ? echo $rowComen["comentario"]; ?>
< BR>
< ?
}
mysql_free_result($resultComen);
?>

</SPAN>
</TD>
</TR>
</TABLE>
</CENTER>


Aquí lo importante es la lectura de nuestros comentarios, lo que debemos hacer primero


que todo es obtener los comentarios, pero solo queremos aquellos que correspondan

a la noticia actual, para ello pedimos aquellos cuyo campo id_noticia

corresponda con el id de la noticia actual

(noticia.php?id=456):




$resultComen = mysql_query("SELECT * FROM comentarios
WHERE id_noticia='$id' ORDER BY id ASC");


Y

el resto es sencillo, simplemente imprimir en pantalla cada comentario, con

su respectivo nick:



while($rowComen = mysql_fetch_array($resultComen))
{
?>
<FONT COLOR=RED>
<B><? echo $rowComen["nick"]; ?></B>

</FONT>
:
<? echo $rowComen["comentario"]; ?>
<BR>
<?
}


Ahora

necesitamos una aplicación que envié los comentarios a la tabla

y un formulario de envío, el cual en este caso estará ubicado


en la pagina de la noticia (noticia.php), y pasara por medio de un campo oculto

el id de la noticia a la aplicación

que se encargara de enviar el comentario.


Primero

el código del formulario, utilizaremos un campo de tipo HIDDEN para pasar el id de la noticia a la aplicación que procesa el formulario


(despues el código de dicha aplicación, llamaremos a nuestra aplicación

nuevoComentario.php), este código debemos

ponerlo en noticia.php:



<CENTER>

<SPAN STYLE="font-size:11px;font-family:Tahoma;color:black;font-weight:bold">
.Enviar Comentario.
</SPAN>
</CENTER>
<p>
<FORM NAME="miFormu" ACTION="nuevoComentario.php"
METHOD="post">
<INPUT TYPE="hidden" NAME="id" VALUE="<?
echo $id; ?>">
Nick : <INPUT TYPE="text" NAME="nick" SIZE=20 MAXLENGTH=20>
<BR>
Comentario: <INPUT TYPE="text" NAME="comentario"
SIZE=28 MAXLENGTH=250>
<BR>
<INPUT TYPE="submit" CLASS="boton" VALUE="Enviar
Comentario">
</FORM>


Aquí cabe destacar el campo:



<INPUT TYPE="hidden" NAME="id"
VALUE="<? echo $id; ?>">


El

cual recibe como valor el id de la noticia, ahora necesitamos la aplicación nuevoComentario.php que recibe el id

que corresponde al id de la noticia y el nick


y comentario correspondientes, solo pondré

el código de la parte que lee los datos y introduce el comentario en

la base de datos, de ti depende la conexión con la base de datos, dicho

código es el siguiente:




if(isset($HTTP_POST_VARS["id"]) && isset($HTTP_POST_VARS["nick"]) && isset($HTTP_POST_VARS["comentario"])) {
if($HTTP_POST_VARS["comentario"] != "")
{
if($HTTP_POST_VARS["nick"] == "")
{
$nickNuevo = "anonimo";
}
else
{
$nickNuevo = $HTTP_POST_VARS["nick"];
}
$resultCom2 = mysql_query("SELECT id FROM comentarios ORDER BY id DESC LIMIT 0,1");
$rowCom2 = mysql_fetch_array($resultCom2);
$con = $rowCom2["id"];
mysql_free_result($resultCom2);

$con++;
$idNoticia = $HTTP_POST_VARS["id"];
$comentarioNoticia = $HTTP_POST_VARS["comentario"];

mysql_query("INSERT INTO comentarios VALUES
('$con','$idNoticia','$nickNuevo','$comentarioNo ticia')");

echo "Comentario Enviado Con Exito.<BR>Espere Unos Segundos...<SCRIPT LANGUAGE="javascript">window.location.href = "".getenv('HTTP_REFERER')."";</SCRIPT>"; }
else
{
echo "Debe Introducir Un Comentario.";
}
}


Creo

que no hay mucho que decir sobre este script, como ya dije estoy suponiendo

un conocimiento básico de php y interacción con bases de datos


por parte del lector.


Suerte

y hasta el próximo tutorial!