Validar emails en PHP

Iniciado por inquilin@19, 1 Diciembre 2011, 17:39 PM

0 Miembros y 1 Visitante están viendo este tema.

inquilin@19

Hola a todos,  tengo el siguiente problema, tengo este codigo:

<?php
//Establecemos un par de funciones
function doDB() {
global 
$mysqli;
//Conectamos con el servidor y la DB
     
$mysqli mysqli_connect("localhost""root",
         
"""test");
//Si la conexión falla, paramos el script execution
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n"mysqli_connect_error());
exit();
}
}
function 
emailChecker($email) {
global 
$mysqli$check_res;
//Probamos que el email no esté ya en lista
$check_sql "SELECT id FROM SUBSCRIBERS
              WHERE email = '"
.$email."'";
$check_res mysqli_query($mysqli$check_sql)
or die(
mysqli_error($mysqli));
}
//Determinamos si es necesario mostrar el formulario o no
if (!$_POST) {
//Es necesario mostrarle, luego creamos la caja del formulario
$display_block "
<form method=\"POST\" action=\""
.$_SERVER["PHP_SELF"]."\">
<p><strong>Your E-Mail Address:</strong><br/>
<input type=\"text\" name=\"email\" size=\"40\">
<p><strong>Action:</strong><br/>
<input type=\"radio\" name=\"action\"
value=\"sub\" checked> subscribe
<input type=\"radio\" name=\"action\"
            value=\"unsub\"> unsubscribe
<p><input type=\"submit\" name=\"submit\"
        value=\"Submit Form\"></p>
</form>"
;
} else if ((
$_POST) && ($_POST["action"] == "sub")) {
//Validamos el email para la suscripcion
if ($_POST["email"] == "") {
header("Location: manage.php");
exit;
} else {
//Conectamos con la DB
doDB();
//Miramos si el email esta en lista
emailChecker($_POST["email"]);
//Cojemos el numero del resultado y hacemos algo
if (mysqli_num_rows($check_res) < 1) {
mysqli_free_result($check_res);
//Lo grabamos
$add_sql "INSERT INTO subscribers (email)
                        VALUES('"
.$_POST["email"]."')";
$add_res mysqli_query($mysqli$add_sql)
                       or die(
mysqli_error($mysqli));
$display_block "<p>Thanks for signing up!</p>";
//Cerramos conexion con MySQL
mysqli_close($mysqli);
} else {
//Mostramos mensaje de error
$display_block "<p>You're already subscribed!</p>";
}
}
} else if ((
$_POST) && ($_POST["action"] == "unsub")) {
//Intentamos darle de baja
if ($_POST["email"] == "") {
header("Location: manage.php");
exit;
} else {
//Conectamos con BD
doDB();
emailChecker($_POST["email"]);
if (
mysqli_num_rows($check_res) < 1) {
mysqli_free_result($check_res);
$display_block "<p>Couldn't find your address!</p>
<p>No action was taken.</p>"
;
} else {
while (
$row mysqli_fetch_array($check_res)) {
$id $row["id"];
}
$del_sql "DELETE FROM subscribers
WHERE id = '"
.$id."'";
$del_res mysqli_query($mysqli$del_sql)
or die(mysqli_error($mysqli));
$display_block "<P>You're unsubscribed!</p>";
}
mysqli_close($mysqli);
}
}
?>

<html><head><title>
Subscribe/Unsubscribe to a Mailing List
</title></head>
<body>
<h1>Subscribe/Unsubscribe to a Mailing List</h1>
<?php echo "$display_block"?>
</body>
</html>


Tambien tengo el codigo para validarlo
function comprobar_email($email){
$mail_correcto = 0;
//compruebo unas cosas primeras
if ((strlen($email) >= 6) && (substr_count($email,"@") == 1) && (substr($email,0,1) != "@") && (substr($email,strlen($email)-1,1) != "@")){
if ((!strstr($email,"'")) && (!strstr($email,"\"")) && (!strstr($email,"\\")) && (!strstr($email,"\$")) && (!strstr($email," "))) {
//miro si tiene caracter .
if (substr_count($email,".")>= 1){
//obtengo la terminacion del dominio
$term_dom = substr(strrchr ($email, '.'),1);
//compruebo que la terminación del dominio sea correcta
if (strlen($term_dom)>1 && strlen($term_dom)<5 && (!strstr($term_dom,"@")) ){
//compruebo que lo de antes del dominio sea correcto
$antes_dom = substr($email,0,strlen($email) - strlen($term_dom) - 1);
$caracter_ult = substr($antes_dom,strlen($antes_dom)-1,1);
if ($caracter_ult != "@" && $caracter_ult != "."){
$mail_correcto = 1;
}
}
}
}
}
if ($mail_correcto)
return 1;
else
return 0;
}



EL problema que tengo es que, lo ponga como lo ponga me lee el codigo como valido pero no me filtra los correos que introduzco, da igual que empiecen por @ o por espacios (en el codigo de filtrado se supone que nos tiene que dar error), no me lo filtra
Alguna sugerencia??
Agradezco muchisimo la ayuda, estoy bastante perdido
Saludos
Sólo mirando al frente se puede seguir, llevar lastres en el camino no te lo permiten

EFEX

Haber asi:

Código (php) [Seleccionar]

function comprobar_email($email){
    $mail_correcto = 0;
    //compruebo unas cosas primeras
    if ((strlen($email) >= 6) && (substr_count($email,"@") == 1) && (substr($email,0,1) != "@")&& (substr($email,strlen($email)-1,1) != "@")){
        if ((!strstr($email,"'")) && (!strstr($email,"\"")) && (!strstr($email,"\\")) &&(!strstr($email,"\$")) && (!strstr($email," "))) {
            //miro si tiene caracter
            if (substr_count($email,".")>= 1){
                //obtengo la terminacion del dominio
                $term_dom = substr(strrchr ($email, '.'),1);
                //compruebo que la terminación del dominio sea correcta
                if (strlen($term_dom)>1 && strlen($term_dom)<5 && (!strstr($term_dom,"@")) ){
                    //compruebo que lo de antes del dominio sea correcto
                    $antes_dom = substr($email,0,strlen($email) - strlen($term_dom) - 1);
                    $caracter_ult = substr($antes_dom,strlen($antes_dom)-1,1);
                    if ($caracter_ult != "@" && $caracter_ult != "."){
                        $mail_correcto = 1;
                    }
                }
            }
        }
    }
    if ($mail_correcto) {
        return 1;
    }else{
        return 0;
    }
}
GITHUB 

#!drvy

Podrías usar regex (expresiones regulares) para ahorrarte lineas innecesarias..

Código (php) [Seleccionar]

function comprobar_email($email){
if (preg_match('/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/',$email)) {
return 1;} else {return 0;}
}



Saludos


Dusk

Código (php) [Seleccionar]
function ChkMail($str){
if(filter_var($str, FILTER_VALIDATE_EMAIL)) {
    return true;
}else{
    return false;
}
}


yo uso esa :P