Test Foro de elhacker.net SMF 2.1

Programación => Desarrollo Web => PHP => Mensaje iniciado por: inquilin@19 en 1 Diciembre 2011, 17:39 PM

Título: Validar emails en PHP
Publicado por: inquilin@19 en 1 Diciembre 2011, 17:39 PM
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
Título: Re: Validar emails en PHP
Publicado por: EFEX en 1 Diciembre 2011, 18:22 PM
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;
    }
}
Título: Re: Validar emails en PHP
Publicado por: #!drvy en 1 Diciembre 2011, 19:16 PM
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

Título: Re: Validar emails en PHP
Publicado por: Dusk en 20 Diciembre 2011, 20:43 PM
Código (php) [Seleccionar]
function ChkMail($str){
if(filter_var($str, FILTER_VALIDATE_EMAIL)) {
    return true;
}else{
    return false;
}
}


yo uso esa :P