Foro de elhacker.net

Programación => 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:

Código:
<?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
Código:
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
  1. function comprobar_email($email){
  2.    $mail_correcto = 0;
  3.    //compruebo unas cosas primeras
  4.    if ((strlen($email) >= 6) && (substr_count($email,"@") == 1) && (substr($email,0,1) != "@")&& (substr($email,strlen($email)-1,1) != "@")){
  5.        if ((!strstr($email,"'")) && (!strstr($email,"\"")) && (!strstr($email,"\\")) &&(!strstr($email,"\$")) && (!strstr($email," "))) {
  6.            //miro si tiene caracter
  7.            if (substr_count($email,".")>= 1){
  8.                //obtengo la terminacion del dominio
  9.                $term_dom = substr(strrchr ($email, '.'),1);
  10.                //compruebo que la terminación del dominio sea correcta
  11.                if (strlen($term_dom)>1 && strlen($term_dom)<5 && (!strstr($term_dom,"@")) ){
  12.                    //compruebo que lo de antes del dominio sea correcto
  13.                    $antes_dom = substr($email,0,strlen($email) - strlen($term_dom) - 1);
  14.                    $caracter_ult = substr($antes_dom,strlen($antes_dom)-1,1);
  15.                    if ($caracter_ult != "@" && $caracter_ult != "."){
  16.                        $mail_correcto = 1;
  17.                    }
  18.                }
  19.            }
  20.        }
  21.    }
  22.    if ($mail_correcto) {
  23.        return 1;
  24.    }else{
  25.        return 0;
  26.    }
  27. }
  28.  


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
  1. function comprobar_email($email){
  2. 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)) {
  3. return 1;} else {return 0;}
  4. }


Saludos



Título: Re: Validar emails en PHP
Publicado por: Dusk en 20 Diciembre 2011, 20:43 pm
Código
  1. function ChkMail($str){
  2. if(filter_var($str, FILTER_VALIDATE_EMAIL)) {
  3.     return true;
  4. }else{
  5.     return false;
  6. }
  7. }

yo uso esa :P