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??
 

Eliox

Utente Attivo
25 Feb 2005
4.390
3
0
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);
 

alessandro1997

Utente Attivo
6 Ott 2009
5.302
1
0
26
Roma
alessandro1997.netsons.org
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})$/", '[email protected]');
}
?>
Viene eseguito in 4,978 secondi.

Quest'altro:
PHP:
<?php
for ($i = 0; $i < 1000000; $i++) {
    filter_var('[email protected]', 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:

alessandro1997

Utente Attivo
6 Ott 2009
5.302
1
0
26
Roma
alessandro1997.netsons.org
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.
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
 

Eliox

Utente Attivo
25 Feb 2005
4.390
3
0
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?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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("[email protected]", 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("[email protected]", 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
 

Eliox

Utente Attivo
25 Feb 2005
4.390
3
0
@Borgo
Per caso hai fatto dei test con FILTER_VALIDATE_EMAIL e i caratteri accentati?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
 

andrex1191

Utente Attivo
5 Apr 2011
78
0
0
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
 

Eliox

Utente Attivo
25 Feb 2005
4.390
3
0
E' facilmente aggirabile perchè dipende dal browser, ti conviene sempre associare un controllo lato client con JS a uno lato server con PHP.
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
 

andrex1191

Utente Attivo
5 Apr 2011
78
0
0
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
Autore Titolo Forum Risposte Data
Max 1 [PHP] Script che funziona in locale e non online PHP 16
N Come mai non mi funziona nessun server locale? Mac e Software 4
A insert funziona in server locale ma non in remoto MySQL 7
L pagina che funziona in locale ma non in remoto (MENU seleziona) PHP 6
L Pagina php non funziona in locale PHP 3
C Asp.net in locale non funziona ASP.NET 0
T [Javascript] Google maps con puntatore animato funziona solo in locale Javascript 1
YellowMan Video HTML5: in locale funziona, on-line no! HTML e CSS 1
G funzione che su locale funziona ma su remoto no PHP 1
T Mess. No such file or directory - Ma in locale funziona PHP 5
I Sto progettando nuovi siti utilizzando bootstrap e devo dire funziona bene, l'unico problema e la maschera -moz- HTML e CSS 0
F comando di inclusione file audio in I-Pad non funziona HTML e CSS 1
R jquery che cambia css di un elemento non mi funziona sulla pagina caricata da ajax Ajax 5
zorro CREATE TABLE non funziona PHP 6
P jquery refresh div non funziona Javascript 0
zorro modulo di registrazione: funziona ma non sempre PHP 2
T IP INFO NON FUNZIONA PHP 0
P Data scraping in PHP non funziona PHP 4
P Pagina modifica record che non funziona PHP 0
Shyson Codice wp-login non funziona PHP 2
R INSERT INTO tabella non funziona Classic ASP 2
F Script java elenco alfabetico non funziona Javascript 3
R Select concatenata che non funziona la seconda volta Ajax 3
S Come funziona un estrattore di emails automatico? Posta Elettronica 1
A funzione iconv () non mi funziona PHP 4
D Alias AS non funziona più con DATE_FORMAT? MySQL 2
M Richiamare una singola funziona da file php PHP 2
Alex_70 Button non funziona nella form PHP 2
Tommy03 Order by non funziona MySQL 6
D FPDF non funziona PHP 3
M Richiamare funziona da file esterno jQuery 0
M Guestbook - non funziona dopo upgrade di PHP PHP 5
T script jquery non funziona più dopo il passaggio a MVC jQuery 5
F [Javascript] comando innerHTML non funziona Javascript 5
P [Joomla] Il mio iframe non funziona più Joomla 0
gandalf1959 [PHP] Inserimento di più righe non funziona come mi aspetto... PHP 2
felino [Windows 8.1] Windows Update non funziona correttamente Windows e Software 3
max1974 [Javascript] Grafico ajax non funziona Javascript 0
M [HTML] Picture Tag non funziona in header-Element HTML e CSS 0
A Libero mail non funziona Posta Elettronica 3
mferri Collegamento con xampp non funziona più da cambio di operatore. Web Server 2
L [HTML] Caricato sito sul server, ma non funziona con tutti i browser HTML e CSS 2
L Caricato sito sul server, ma non funziona con tutti i browser Presentati al Forum 1
I PHPMailer non funziona PHP 13
H [Photoshop] Filtro Nik Dfine non funziona. Photoshop 1
K Ipcam 4g e smartphone 4g non funziona IP Cam e Videosorveglianza 4
M [RISOLTO]Windows media player non mi funziona più su win 10 pro 64 bit Windows e Software 2
Federico.Marcelo Cos’è un bot di Instagram e come funziona? Social Media Marketing 0
F [MS Access] VBA non funziona più MS Access 2
A [Photoshop] Tavoletta grafica Huion non funziona con PS CS6 Photoshop 2

Discussioni simili