Funziona in locale ma non in rete

andrex1191

Utente Attivo
5 Apr 2011
78
0
0
Salve a tutti,
questa è una funzione che ho preso su internet (non ricordo dove) che controlla la validità di una mail
PHP:
function CheckEmail($email)
        {
	  // elimino spazi, "a capo" e altro alle estremità della stringa
	  $email = trim($email);

	  // se la stringa è vuota sicuramente non è una mail
	  if(!$email)
            {
             return false;
	    }

	  // controllo che ci sia una sola @ nella stringa
	  $num_at = count(explode( '@', $email )) - 1;
	  if($num_at != 1)
              {
		return false;
              }

	  // controllo la presenza di ulteriori caratteri "pericolosi":
	  if(strpos($email,';') || strpos($email,',') || strpos($email,' '))
              {
		return false;
	      }

          // la stringa rispetta il formato classico di una mail?
	  if(!preg_match( '/^[\w\.\-]+@\w+[\w\.\-]*?\.\w{1,4}$/', $email))
              {
		return false;
	      }

	     return true;
        }

Nel mio script utilizzo questo controllo:
PHP:
if (!CheckEmail($nuovamail))
{
 echo"La nuova Email non e' valida
      <meta HTTP-EQUIV='refresh' CONTENT='3; URL = modificaemail.php'>";
 exit;
}

In locale funziona tutto perfettamente.

In rete invece no. Non capisco perchè ma mi dice sempre "La nuova email non e' valida" qualunque cosa inserisco

Da cosa può dipendere??
 
Non so da cosa dipenda, ma invece di usare funzioni intricate, in PHP puoi controllare la validità di una e-mail con filter_var:
PHP:
<?php
$email = 'pinco@pallino';
var_dump(filter_var($email, FILTER_VALIDATE_EMAIL)); // bool(false)

$email = 'pinco@pallino.org';
var_dump(filter_var($email, FILTER_VALIDATE_EMAIL)); string(17) "pinco@pallino.org"
?>
 
Se l'email viene inviata per form il problema sta sicuramente nel register_globals disattivato in remoto.
Un'alternativa alla valida soluzione di Alex è utilizzare la regexp Regex library Perl compatibile:
PHP:
preg_match("/^([a-zA-Z0-9])+([\.a-zA-Z0-9_-])*@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-]+)*\.([a-zA-Z]{2,4})$/", $email);
 
Effettivamente sembra che le differenze nella performance siano veramente enormi. Questo script:
PHP:
<?php
for ($i = 0; $i < 1000000; $i++) {
    preg_match("/^([a-zA-Z0-9])+([\.a-zA-Z0-9_-])*@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-]+)*\.([a-zA-Z]{2,4})$/", 'john.doe@example.org');
}
?>
Viene eseguito in 4,978 secondi.

Quest'altro:
PHP:
<?php
for ($i = 0; $i < 1000000; $i++) {
    filter_var('john.doe@example.org', FILTER_VALIDATE_EMAIL);
}
?>
Viene eseguito in 14,220 secondi!

È vero che, eseguendo così tante volte un'operazione, c'è da aspettarsi un'ovvia differenza tra i tempi di esecuzione. Ma 9,242 secondi mi sembrano davvero troppi.
 
Ultima modifica:
In questo caso la differenza si riduce drasticamente. Sembra che a preg_match() non piacciano le stringhe che non rispettano il suo pattern (quando in realtà è fatto proprio apposta). Il primo script impiega 10.284 secondi, mentre il secondo 12.761 secondi.
 
ciao
considerando che hai fatto un milione di cicli, ogni confronto dura
nel primo caso
0,004978 msec
0,014220 msec

e nel secondo
0,010284 msec
0,012761 msec

per la verifica di un indirizzo proveniente da un form (invio email o registrazione) penso che l'utente non si accorga della differenza

p.s.
per chi non sa:
msec = millisecondi
 
borgo italia:101110 ha scritto:
per la verifica di un indirizzo proveniente da un form (invio email o registrazione) penso che l'utente non si accorga della differenza
Ok, ma perchè utilizzare la soluzione meno performante?
 
ciao
secondo me per questi motivi

1. si fa molto prima ad usarla, si scrive molto meno codice, soprattutto se i controlli sono più d'uno
$ver=filter_var("pinco_pallo@sempronio.it", FILTER_VALIDATE_EMAIL);
$ver=filter_var("http://www.sempronio.it", FILTER_VALIDATE_URL);
//float, int...

2. prima del validate posso eventualmente usare il sanitize
$ver=filter_var("pinco_pallo@sempronio.it", FILTER_SANITIZE_EMAIL);
$ver=filter_var("http://www.sempronio.it", FILTER_SANITIZE_URL);

3. oltre ai filtri ho anche altre opzioni
$ver=filter_var("http://www.sempronio.it", FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED);

4. ho letto che possono essere introdotti indirizzi anche con caratteri accentati, quindi la regexp diventa più complessa

5. ultimo, ma non meno importante: ho sempre fatto casino a costruirmi le regexp, anche anche quando si usavano le deprecate ereg
 
@Borgo
Per caso hai fatto dei test con FILTER_VALIDATE_EMAIL e i caratteri accentati?
 
ciao
@vampiro
no non l'ho fatto, ma penso che quando introdurranno la possibilità di mettere i caratteri accentati negli indirizzi email o url ci mettano meno tempo quelli di php a fare un aggiornamento di filter_var di quanto ci metta io a fare la regex.
quindi... aspetto
 
Alla fine ho risolto utilizzando al posto di quella funzione in php questa funzione in js:
Codice:
function checkmail(mail)
    {
	var espressione = /^[_a-z0-9+-]+(\.[_a-z0-9+-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)+$/;
	if (!espressione.test(mail))
	{return false;}
    }

    function control()
    {
     var email = document.modemail.nuovamail.value;

     if(email == "")
     {
      alert("Attenzione, la mail non è valida");
      document.modemail.nuovamail.focus();
      return false;
     }

     else if(checkmail(email) == false)
        {
         alert("Attenzione, la mail non è valida");
         document.modemail.nuovamail.focus();
         return false;

        }
        else
          {
           document.modemail.action = "modemail.php";
           document.modemail.submit();
           return true;
          }
    }

Inoltre ho anche eliminato la funzione mysql_real_escape_string da alcune variabili perchè ho notato che in rete mi dava dei problemi non so perchè.

Grazie mille a tutti per le risposte

Saluti
 
E' facilmente aggirabile perchè dipende dal browser, ti conviene sempre associare un controllo lato client con JS a uno lato server con PHP.
 
ciao
come gia detto io uso la filter_var in questo modo

PHP:
<?php
function CheckEmail($email)
	$email=filter_var($email, FILTER_SANITIZE_EMAIL);
	if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
		return FALSE;
	}else{
		return $email;
	}
}
?>
se mi ritorna false ritorno al form pulito, altrimenti proseguo.

p.s.
non proprio al form pulito,ripulisco il campo errato e passo gli altri campi in sessione in modo che se l'utente ha sbagliato solo a digitare non debba ridigitare il tutto
 
Ho fatto come mi avete consigliato, ho associato ad ogni controllo in js un controllo in php, e ho usato la funzione con filter_var di borgo e sembra che funzioni oltre che in locale anche in rete...

Grazie mille
 

Discussioni simili