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
Haber asi:
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;
}
}
Podrías usar regex (expresiones regulares) para ahorrarte lineas innecesarias..
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
function ChkMail($str){
if(filter_var($str, FILTER_VALIDATE_EMAIL)) {
return true;
}else{
return false;
}
}
yo uso esa :P