¡Hola! Antes de formular me pregunta, quiero darle las gracias por este gran sitio web, del cual he aprendido mucho.
Bueno! Estoy desarrollando una página web en la cual tengo un formulario de suscripción, y estoy usando ajax, Jquey y php para validar el email, y su existencia en DDBB. Pero lo que yo quiero es que además de validar el email ([email protected]), que válida y comproba que el email existe realmente.
Respuestas
@KhalifaBoulbaye, a ver si te entiendo.
Para comprobar en una base de datos la existencia de algo debes generar un Query y que te arroje el resultado que necesitas. Con PHP - MySQL lo haría:
$email = [email_a_consultar]; $query = $db->query("SELECT email FROM ['tabla'] WHERE email = '{$email}' "); if(!$query){ // Haz lo que quieras con tus datos } return "Este email ya existe";
@cristian_angulo
@KhalifaBoulbaye si la pregunta se refiere a comprobar que la dirección de email existe de verdad y está activa, sólo hay una manera de comprobarlo: enviando un email.
Este es el motivo por el que cualquier sitio web profesional que te permite registrarte te envía un email de confirmación. Así saben que la cuenta existe, está activa y pertenece al usuario que se ha registrado.
Para hacer el sistema bien del todo, el email de confirmación debería incluir un enlace que haya que pinchar para terminar de confirmar el registro. Además, ese enlace suele tener un código único y que caduca a las pocas horas de enviar el email.
@javiereguiluz
Gracias por vuestra rápida respuesta. @cristian_angulo esa parte la tengo, a lo que me refiero es comprobar de que el email exista de verdad y está activa.
He encontrado esta página http://www.email-validator.net que combrueba que el email exista de verdad. Y pensé que se podría hacer de esa manera. Si no habrá que tirar de lo que me respondiste.
Pero para hacer mediante el email de confirmación habrá que crear dos tablas, una temporal y otra registro final ¿o solo una es suficiente?
@KhalifaBoulbaye
@KhalifaBoulbaye a menos que la aplicación vaya a ser gigantesca (millones de usuarios) creo que bastaría con crear una nueva columna llamada confirmado
que indique si el usuario ha pinchado en el email de confirmación y por tanto, su cuenta está totalmente activa.
Lo bueno es que es muy fácil limpiar la tabla de usuarios periódicamente para evitar que se te llene de usuarios inactivos. Simplemente tienes que borrar cualquier usuario que se haya dado de alta hace tiempo (por ejemplo hace más de seis meses) y todavía no haya confirmado su cuenta.
Por otra parte, si vas a generar tokens únicos que caducan y todo eso (quizás no te haga falta complicarte tanto) entonces sí que es recomendable crear una tabla auxiliar para guardar el token, la fecha de caduciadad, etc.
@javiereguiluz
Gracias @javiereguiluz, por resolver mis dudas.
A ver si entiendo... El la tabla de suscripción tengo un campo de email y otro campo es de fecha de alta. A estos dos campo le añado el campo de confirmación, donde le diré que instale un valor en cuando haga click en enlace de confirmación. ¿Es así? Y respecto al tiempo, habrá que crear un código PHP ¿verdad?
Agradezco tu ayuda!
@KhalifaBoulbaye
@KhalifaBoulbaye sí, así puedes crear tu sistema sencillo para confirmar el registro de los usuarios. Con respecto a la limpieza de la tabla para borrar los usuarios que nunca llegaron a confirmar su registro, te recomiendo que te pongas a ello cuando sea realmente un problema (cuando haya muchos usuarios cada día que se registran y no confirman).
Con respecto al código PHP, sería muy sencillo porque en realidad sería reponsabilidad de la base de datos. Con una consulta SQL sencilla tipo SELECT * FROM Usuarios WHERE ... AND confirmado != true AND fechaRegistro > ...
@javiereguiluz
Es mas fácil de lo que parece. Ellos proporcionan una API en email-validator.net/email-address-online-verification-api.html Aquí el código que ellos proporcionan para usar su API suerte =D
// código PHP ... // build API request $APIUrl = 'http://api.email-validator.net/api/verify'; $Params = array('EmailAddress' => 'email address', 'APIKey' => 'your API key'); $Request = @http_build_query($Params); $ctxData = array( 'method' => "POST", 'header' => "Connection: close\r\n". "Content-Length: ".strlen($Request)."\r\n", 'content'=> $Request); $ctx = @stream_context_create(array('http' => $ctxData)); // send API request $result = json_decode(@file_get_contents( $APIUrl, false, $ctx)); // check API result if ($result && $result->{'status'} > 0) { switch ($result->{'status'}) { // valid addresses have a {200, 207, 215} result code // result codes 114 and 118 need a retry case 200: case 207: case 215: echo "Address is valid."; break; case 114: // greylisting, wait 5min and retry break; case 118: // api rate limit, wait 5min and retry break; default: echo "Address is invalid."; echo $result->{'info'}; echo $result->{'details'}; break; } } else { echo $result->{'info'}; } ...
@theeChild
Muchas gracias por vuestra ayuda. De momento tengo poca suscripciones. Creo que me vendría mejor la opción de confirmación por email, pero la cosa esta que llevo poco trabajando en eso de php. Como puedo hacer que se active el email en cuando pincha sobre el enlace de confirmación. Esto es lo que tengo
Suscribir.php
<?php session_start(); include('acceso_db.php'); $email = mysql_real_escape_string($_POST['email']); // comprobamos que el email ingresado no haya sido dado de alta antes $sql = mysql_query("SELECT email FROM suscripcion WHERE email='".$email."'"); if (mysql_num_rows($sql) > 0) { echo "0"; } else { // ingresamos los datos a la BD $reg = mysql_query("INSERT INTO suscripcion (email, freg) VALUES ('".$email."', NOW())"); if ($reg) { echo "1"; } else { echo "2"; } } ?>
Procesar.js
jQuery.post("../es/php/suscribir.php", { email: email }, function(data, textStatus) { if (data == 0) { $("#mensaje").html("<div id='RegError'>El correo introducido has sido registrado anteriormente.</div>"); } else if (data == 1) { $("#mensaje").html("<div id='RegSuccess'>Gracias por suscribirse.</div>"); document.getElementById("email").value = ""; } else { $("#mensaje").html("<div id='RegError'>Hubo un error y no se registraron los datos.</div>"); } }); setTimeout(function() { $('#mensaje').fadeOut('slow'); }, 5000);
@KhalifaBoulbaye