Foros del Web » Programando para Internet » PHP »

sistema de mensajes, validado vía mail por medio de un link

Estas en el tema de sistema de mensajes, validado vía mail por medio de un link en el foro de PHP en Foros del Web. Estoy un poco complicado.. Tengo que hacer un sistema, parecido a un tagboard, o libro de visitas, etc.. El asunto esque no se deben permitir ...
  #1 (permalink)  
Antiguo 16/03/2005, 00:23
Avatar de El_MiMo  
Fecha de Ingreso: septiembre-2003
Ubicación: Chile
Mensajes: 123
Antigüedad: 20 años, 7 meses
Puntos: 1
sistema de mensajes, validado vía mail por medio de un link

Estoy un poco complicado..
Tengo que hacer un sistema, parecido a un tagboard, o libro de visitas, etc..

El asunto esque no se deben permitir usuarios 'anónimos' y los mails deben ser verdaderos.


El formulario cuenta con 3 campos. Nombre, Mail y Texto.
Recojo los datos y agrego uno nuevo, una password aleatorea.
Se ingresan los datos a la base de datos y le envía un mail a la persona..
Si el mail no es verdadero... el mensaje nunca será publicado.
si el mail es verdadero... quiero que al hacer click en un link enviado en el mail, se active el mensaje y se publique.

El link sería del tipo: http://sitio.algo/aprobar.php?id=11100&pass=4dDSsd

en aprobar.php recoja el id y la pass y los compare con la db, si son falsos, no acepta y envía un mensajes de error.
Si los datos son verdaderos, cambio el valor 'tipo' de 0 a 1 para que sea publicado.

Lo que me falta es hacer que aprobar.php compare los valores id y pass..
__________________
aaa!!
  #2 (permalink)  
Antiguo 16/03/2005, 12:08
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Tan sólo debes hacer una consulta SQL condicional usando COUNT() (también podría ser sin usar COUNT() y usar mysql_num_rows(), pero más optimo para este caso usar COUNT() de SQL) . .tipo:

Código PHP:
<?
// conectas a tu BD .. etc ..
$sql="SELECT COUNT(*) FROM tabla WHERE id='".$_GET['id']."' AND pass='".$_GET['pass']."'";
$resultado=mysql_query($sql) or die (mysql_error());
if (
mysql_result($resultado,0) == 1){
   
// si hay un resultado  .. coincide tu "id" con el "pass" .. así que puedes proceder a actualizar dicho campo ...
   
$sql="UPDATE tabla SET tipo='1' WHERE id='".$_GET['id']."";
   
mysql_query($sql) or die (mysql_error());
}
?>
Un saludo,
  #3 (permalink)  
Antiguo 16/03/2005, 23:43
Avatar de El_MiMo  
Fecha de Ingreso: septiembre-2003
Ubicación: Chile
Mensajes: 123
Antigüedad: 20 años, 7 meses
Puntos: 1
Estimado... muchas gracias por responder tan pronto.. pero no me funciona: :P

Cita:
You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near ''21' at line 1
Este es el codigo..
Código PHP:
 <?php
include("msj_conexion.php");
// conectas a tu BD .. etc ..
$sql="SELECT COUNT(*) FROM msj WHERE id='".$_GET['id']."' AND pass='".$_GET['pass']."'";
$resultado=mysql_query($sql) or die (mysql_error());
if (
mysql_result($resultado,0) == 1){
   
// si hay un resultado  .. coincide tu "id" con el "pass" .. así que puedes proceder a actualizar dicho campo ...
   
$sql="UPDATE msj SET tipo='1' WHERE id='".$_GET['id']."";
   
mysql_query($sql) or die (mysql_error());

?>
__________________
aaa!!
  #4 (permalink)  
Antiguo 17/03/2005, 03:15
Avatar de Seppo  
Fecha de Ingreso: marzo-2005
Ubicación: Buenos Aires, Argentina
Mensajes: 1.284
Antigüedad: 19 años, 1 mes
Puntos: 17
el campo id no es INT? en ese caso no deberían ir los apostrofes
  #5 (permalink)  
Antiguo 17/03/2005, 09:43
Avatar de El_MiMo  
Fecha de Ingreso: septiembre-2003
Ubicación: Chile
Mensajes: 123
Antigüedad: 20 años, 7 meses
Puntos: 1
Así está la db.
Código PHP:
`idint(10NOT NULL auto_increment,
  `
tipochar(1NOT NULL default '',
  `
passvarchar(8NOT NULL default '',
  `
nombrevarchar(25NOT NULL default '',
  `
mailvarchar(50NOT NULL default '',
  `
textovarchar(255NOT NULL default '',
  
KEY `id` (`id`) 
__________________
aaa!!
  #6 (permalink)  
Antiguo 17/03/2005, 09:52
Avatar de Seppo  
Fecha de Ingreso: marzo-2005
Ubicación: Buenos Aires, Argentina
Mensajes: 1.284
Antigüedad: 19 años, 1 mes
Puntos: 17
enconmtré el error =P

en $sql="UPDATE msj SET tipo='1' WHERE id='".$_GET['id'].""; falta un apostrofe de cierre =P
quedaría:

$sql="UPDATE msj SET tipo='1' WHERE id='".$_GET['id']."'";
  #7 (permalink)  
Antiguo 17/03/2005, 09:59
Avatar de El_MiMo  
Fecha de Ingreso: septiembre-2003
Ubicación: Chile
Mensajes: 123
Antigüedad: 20 años, 7 meses
Puntos: 1
Muchas gracias Seppo y Cluster...
Funciona 'de pelos'

A la tarde mostraré todos los códigos del sistemita para que otros tb lo usen. ;)
__________________
aaa!!
  #8 (permalink)  
Antiguo 17/03/2005, 10:07
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Iniciado por Seppo
el campo id no es INT? en ese caso no deberían ir los apostrofes
En general .. sea "numérico" o "alfanumérico" el campo .. si usas comillas (simples=apostrofes) ... te irá mejor tus consultas SQL no tendras problemas. Pero .. por supuesto .. si el valor sabemos que ha de ser numérico .. se tendría que validar usando:

is_numeric() .. viendo el rango (>0 ... ) y aplicando también mysql_escape_string() por si acaso ..

Un saludo,
  #9 (permalink)  
Antiguo 17/03/2005, 10:08
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Gracias .. fué un lapsuss ... (escribo el código sobre la marcha ..)

Un saludo,
  #10 (permalink)  
Antiguo 17/03/2005, 12:17
Avatar de El_MiMo  
Fecha de Ingreso: septiembre-2003
Ubicación: Chile
Mensajes: 123
Antigüedad: 20 años, 7 meses
Puntos: 1
Acá está el todo el codigo, porsi a alguien le interesa...
Este sistema es para que usuarios de un sitio web, dejen sus mensajes.
Estos mensajes no podrán ser anónimos, pues no se autorizarán los mensajes que no hayan sido activados desdee el mail que se le envía con un link para activar el mensaje.


Base de datos:
Código:
CREATE TABLE `msj` (
  `id` int(10) NOT NULL auto_increment,
  `tipo` char(1) NOT NULL default '',
  `pass` varchar(8) NOT NULL default '',
  `nombre` varchar(25) NOT NULL default '',
  `mail` varchar(50) NOT NULL default '',
  `texto` varchar(255) NOT NULL default '',
  KEY `id` (`id`)
) TYPE=MyISAM AUTO_INCREMENT=23 ;

Conexion.php
Código PHP:
//Conexión a la db

$link=mysql_connect ("localhost""usuario""contraseña") or die ('I cannot connect to the database because: ' mysql_error());
mysql_select_db ("base_datos"); 

Formulario.php
Código PHP:
<script language="javascript" type="text/javascript" defer>
function 
validaEmail(mail)
{
var 
re  = /^([a-zA-Z0-9_.-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$/;
if (!
re.test(mail)) {
    
alert ("Dirección de email inválida");
    return 
false;
}
return 
true;
}
</script> 
 </head>

<body>

<form method="post" action="formulario_add.php" onSubmit="return validaEmail(this.mail.value);">
<table border="0" width="500" cellspacing="0" cellpadding="0" height="149">
    <tr>
        <td width="25%">Nombre</td>
        <td width="75%"><input type="text" name="nombre" size="20">
        </td>
    </tr>
    <tr>
        <td>E-mail</td>
        <td width="75%" height="21"><input type="text" name="mail" size="20">
        </td>
    </tr>
    <tr>
        <td>Texto:</td>
      <td > <input type="text" name="texto" size="50">        </td>
    </tr>
    
    <tr>
        <td> </td>
        <td width="75%" height="21">
        <p align="center"><input type="submit" value="Agregar Dirección" name="agregar">
        </td>
    </tr>
</table>
</form> 

formulario_add.php
Código PHP:
<?php

// ------------------- Generador de password
// Uso/sintax:
// genera_password (longitud password en caracteres o digitos, [tipo=alfanumerico|numerico])
// Si no indicas $tipo se asume como por defecto alfanumerico.

function genera_password($longitud,$tipo="alfanumerico"){

    if (
$tipo=="alfanumerico"){
        
$exp_reg="[^A-Z0-9]";
    } elseif (
$tipo=="numerico"){
        
$exp_reg="[^0-9]";
    }
    
    return 
substr(eregi_replace($exp_reg""md5(rand())) .
       
eregi_replace($exp_reg""md5(rand())) .
       
eregi_replace($exp_reg""md5(rand())),
       
0$longitud);
}

//Ejemplo:
//echo "Password: (alfanumérico) ".genera_password(8)."<br>";
//echo "Password: (numérico) ".genera_password(15,"numerico")."<br>";
//echo "(recarga la página para ver otros passwords aleatorios)"; 

//   ----------  Fin de Generador de password


//   Recoger datos del formulario y asignar una variable.
$nombre=$_POST[nombre];
$mail=$_POST[mail];
$texto=$_POST[texto];
//   Asignar variable Pass a la password generada más arriba.
$pass=genera_password(8);


//   Limpiar cosas html...
$texto str_replace("<","&lt;",$texto);
$texto str_replace(">","&gt;",$texto);
$texto str_replace("\r\n"," ",$texto);
$texto str_replace("\n"," ",$texto);
$texto str_replace("|","l",$texto);
$texto stripslashes($texto);

$nombre str_replace("<","&lt;",$nombre);
$nombre str_replace(">","&gt;",$nombre);
$nombre str_replace("|","l",$nombre);
$nombre stripslashes($nombre);

$mail str_replace("<","&lt;",$mail);
$mail str_replace(">","&gt;",$mail);
$mail str_replace("|","l",$mail);



// Conecar a la base de datos.

include("conexion.php");


// Insertar los datos a la db
mysql_query("insert into msj(nombre,mail,texto,pass)
values('$nombre','$mail','$texto','$pass')"
)
;

// Conseguir el ID del mensaje agregado.
$aa mysql_query("SELECT id FROM msj WHERE tipo='' ORDER BY id DESC LIMIT 0,1");
while(
$row mysql_fetch_array($aa)){
$id=$row[id];
}

// Enviar Mail para la validación.

$receiverMail    =$mail;

$subject "Validación de mensaje en paginaweb.algo";
$msgformat    "Este e-mail ha sido enviado porque haz escrito un mensaje en el sitio web paginaweb.algo y necesita ser validado
para poder ser publicado.
http://sitio/validar.php?id=$id&pass=$pass
"
;

mail($receiverMail$subject$msgformat"From: Página web <[email protected]");
    echo 
"En estos momentos un mail se te ha enviado con instrrucciones de como validar tu mensaje.<br>
Revisa tu correo en unos mitos.<br>
<br>
Gracias."
;

exit();
mysql_close($conexion);
?>

validar.php
Código PHP:
 <?php
include("conexion.php");
// conectas a tu BD .. etc ..
$sql="SELECT COUNT(*) FROM msj WHERE id='".$_GET['id']."' AND pass='".$_GET['pass']."'";
$resultado=mysql_query($sql) or die (mysql_error());
if (
mysql_result($resultado,0) == 1){
   
// si hay un resultado  .. coincide tu "id" con el "pass" .. así que puedes proceder a actualizar dicho campo ...
   
$sql="UPDATE msj SET tipo='1' WHERE id='".$_GET['id']."'";
   
mysql_query($sql) or die (mysql_error());
echo 
"Gracias, tu mensaje ha sido publicado.
<br><br><a href='mostrar.php'>Ver mensajes</a>"
;

?>

y para ver los mensajes de usuarios 'no anonimos'
mostrar.php
Código PHP:
<?php
//Sisteme para mostrar los mensajes de la base de datos.

include("msj_conexion.php"); //Conectar a la db
$query mysql_query("SELECT * FROM msj WHERE tipo=1 ORDER BY id DESC LIMIT 0,25"); //pedir datos a la db y mostrar los ultimos 25
while($row mysql_fetch_array($query)){
echo 
"
  $row[nombre]: $row[texto]
 "
;
}
mysql_close($link);

?>

Ahora, si cada uno quiere, se hace otro php que solo verá el admin del sitio para ver los mails de las personas que envían los mensajes.
__________________
aaa!!

Última edición por El_MiMo; 17/03/2005 a las 12:19
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:42.