Newsgroup: it.comp.www.php
Titolo: check form

Ho un problema...
poniamo di avere un form che chiede l'età da inserire in un campo di testo, 
ecco il form:
<html>
<body>
<form method="get" action="elabora.php">
Inserisci la tua età <input type="text" name="età">
<input type="submit" value="invia">
</form>
</body>
</html>
Voglio assicurarmi che l'utente inserisca un valore numerico intero, 
altrimenti non lo accetto.
Purtroppo, con il codice che riporto qui di seguito non riesco del tutto a 
controllare questa richiesta, perché se il balordo :-) mi inserisce un 
valore del tipo 123abc, lo script mi tronca la stringa e mi restituisce 123, 
ma non lo trovo corretto. Ecco il codice:
<?php
$eta = $_GET['età'];
settype($eta,"integer");
if (gettype ($eta) == "integer" && ($eta == 0)) {
echo "$eta: questo NON è un numero";
} else {
echo "Il numero va bene: $eta";
}
?>
C'è il modo di risolvere questo problema?
ciao pisolo 

Ho risolto:
<?php
$eta = $_GET['età'];
if (is_numeric($eta)) {
settype($eta,"integer");
echo "Tu hai $eta anni";
} else {
echo "Cazzone, devi inserire un età valida!!!";
}
?>
ps: perdonate l'else... :-)
ciao pisolo 

 ?>
Però scusate la mia pignoleria, ma se uno inserisce un numero in virgola 
mobile viene troncato da integer e mi dà per corretta la prima parte. No, 
non ci siamo...
Cerco altre soluzioni, se non vedete nulla vuol dire che non ci sono 
riuscito.
ciao pisolo 

In men che non si dica, ho trovato, spero, la soluzione definitiva, un po' 
artigianale ma funziona:
<?php
$eta = $_GET['età'];
if (is_numeric($eta)) {
if (strpos($eta,".")) {
echo "Cazzone, devi inserire un età valida!!!";
exit;


Domanda stupida:
perchè in questo caso non utilizzare un po di sano javascript ?
"Pisolo" <-> ha scritto nel messaggio 
news:447ba572$0$18299$4faf...@reader1.news.tin.it...


<?php
   if (is_numeric($tuovalore))
{
   echo "Sono sicuro che è numerico";
}
?>
-- 
Cordialmente.
Melus.
dal mio e-mail togli i simboli di Zorro.

 altrimenti non lo accetto.
[..]
tramite regex (controlla anche che sia un numero compreso tra 0 e 129)..
preg_match('/^0*([0-9][0-9]?|1[0-2][0-9])$/', $eta)
-- 
www.iuz-lab.info

 prima parte. No, non ci siamo...
Potresti usare una semplice espressione regolare.
<?php
if (isset($_GET['eta']) && preg_match('/^[0-9]+$/', $_GET['eta'])) {
  $eta_sicura = $_GET['eta'];
} else {
  $eta_sicura = 'Valore non valido'; // Valore di default
} 
Poi usi $eta_sicura.
Ciao.
-- 
Federico

 perchè in questo caso non utilizzare un po di sano javascript ?
Magari - chi può dirlo - Pisolo lo utilizza, ma è un'altra cosa:
javascript lavora sul client, php sul server. Il controllo lato client
non offre alcuna garanzia di successo (è facilmente aggirabile, va
inteso unicamente come "sostegno" per l'utente), quello lato server ha
tutt'altra affidabilità, è indispensabile.
-- 
mailto: y = i
----------------------------------------
Vivo nel terrore di non essere frainteso 
(Oscar Wilde)

 Poi usi $eta_sicura.
Hai ragionissima, è che devo sempre farle le espressioni regolari, php lo 
studio da circa 3 giorni :-/
Comunque la mia soluzione può andar bene per il momento?
ciao pisolo 

 tutt'altra affidabilità, è indispensabile.
Sì, già lo conosco il javascript, ma come ha detto tu volevo qualcosa di più 
(rima baciata).
ciao pisolo 

 preg_match('/^0*([0-9][0-9]?|1[0-2][0-9])$/', $eta)
Sě, me le devo proprio studiare le regex, ma sul mio libro ho visto che non 
vengono approfondite. Mi sai consigliare un sito valido, possibilmente in 
italiano, che le spieghi dettagliatamente, magari facendo anche degli 
esempi?
So che con google posso trovare di tutto, ma chiedo a voi perché essendo 
nell'ambiente forse mi potete suggerire per il meglio.
thx pisolo 

 Comunque la mia soluzione può andar bene per il momento?
Dipende. La tua soluzione accetta anche valori negativi e (in parte)
valori nel formato esponenziale, tipo 2e1 o 7e-3.
Ciao.
-- 
Federico

 valori nel formato esponenziale, tipo 2e1 o 7e-3.
Adesso sono riuscito a togliere i valori esponenziali ma non riesco a 
togliere i valori negativi, perchè?
<?php
$eta = $_GET['età'];
if (is_numeric($eta)) {
if (strpos($eta,".") || strpos($eta,"e") || strpos($eta,"-")){
echo "Cazzone, devi inserire un età valida!!!";
exit;


LO script definitivo, adesso funziona in tutti i modi.
<?php
$eta = $_GET['età'];
if (is_numeric($eta)) {
if (strpos($eta,".") || strpos($eta,"e")){
echo "Cazzone, devi inserire un età valida!!!";
# elaboro... ritorno al form.
exit;
}
settype($eta,"integer");
if ($eta < 0) {
echo "Cazzone, devi inserire un età valida!!!";
# elaboro... ritorno al form.
exit;
}
echo "Tu hai $eta anni";
} else {
echo "Cazzone, devi inserire un età valida!!!";
# elaboro... ritorno al form.
}
?>
Vero? :-)))) 

 Vero? :-)))) 
Forse sì, ma ora che ci hai lavorato ti propongo una soluzione
alternativa :) Tu mi dirai che contiene uno spreco di risorse; io ti
rispondo che è vero, ma lo spreco è minimo, non si fa uso di RegExp
(come sembra tu desideri) e il successo è garantito. O almeno, così mi
sembra alle 2:40 del mattino :D
$etaMin=18;
$etaMax=120;
$arEta=array();
    for ($i=$etaMin; $i <= $etaMax; $i++) {
    array_push($arEta,$i);
// nell'array inserisco tutte le età che voglio accettare
    }   
    if (!in_array($eta, $arEta)) {
 // guardo se l'età inserita dal cazzone NON è presente nell'array
 // ed eventualmente:
    echo "Cazzone, devi inserire un'età valida!";
    } else {
    echo "Tu hai $eta anni";
    }
-- 


 sembra alle 2:40 del mattino :D
[..]
l'angoscia ed un'po' di vino..
se vogliamo esagerare.. va bene anche un..
for($i = 0; isset($eta[$i]); $i++) 
  if(!($eta[$i] === '0' || $eta[$i] - 9 > -9)) 
    { $i = -1; break; }
echo "$eta ", ($i == -1) ? "NOT VALID" : "VALID", "<br />";
tipo variabile permettendo..
-- 
www.iuz-lab.info

> valori nel formato esponenziale, tipo 2e1 o 7e-3.
[..]
non rilevi i negativi perche' strpos() trova il '-' alla posizione 0, lo
restituisce e nell'espressione viene valutato come false..
http://php.net/strpos
comunque lo strumento migliore IMHO sono le regex..
in italiano non so dove le puoi studiare.. ma anche se in lingua straniera
non sono difficili da comprendere..
-- 
www.iuz-lab.info

    }
Catarsi...grande! Innanzitutto perché una delle cose che amo di più nella 
programmazione, per quel poco che la conosco, è la possibilità di 
intraprendere strade diverse per giungere alla medesima conclusione. Dunque 
sono sempre più che aperto ad apprendere nuovi sistemi, perché avverto che 
solo così la padronanza del linguaggio si fa sempre più consolidata nel 
tempo.
Poi non conoscendo la funzione array_push() ho imparato qualcosa di nuovo e 
mi sembra anche utilissima.
La tua soluzione, a discapito della mia che sicuramente è molto artigianale, 
mi piace, è molto più solida e sofisticata, ed al contempo semplice, 
lineare.
thx a lot!
pisolo (che per paradosso sta sveglio ancora alle...4.20 a.m.):-) 

 echo "$eta ", ($i == -1) ? "NOT VALID" : "VALID", "<br />";
ehm...questa sarà meglio che me la guardi domani ad un orario più consono 
:-)
ciao pisolo 

"Pisolo" <-> wrote:

ancor piu' criptica e divertente (dovrebbe funzionare ma non ho
completamente testato)..
for($i = 0; $i !== false && isset($eta[$i]); $i = ($eta[$i] === '0' ||
$eta[$i] - 9 > -9) ? $i+1 : false);
echo $eta . ($i ? ' ' : ' NOT ') . 'VALID<br />';
-- 
www.iuz-lab.info

> in italiano non so dove le puoi studiare.. 
http://rsoftware.altervista.org/index.php?mod=none_php&file=regexp
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 se vogliamo esagerare.. va bene anche un..
A me andrebbe bene anche "un..." (e non solo a quell'ora), ma se non
erro il testo diceva "voglia di bestemmiare" :)


> 
http://rsoftware.altervista.org/index.php?mod=none_php&file=regexp
bookmarked
thx pisolo 

 echo $eta . ($i ? ' ' : ' NOT ') . 'VALID<br />';
See... ci sono un sacco di cose che mi sfuggono.
Ad esempio, a partire dal ciclo for :-) Ma come caspita è costruito?
Io conosco la sintassi base:
for ($i=0, 1<10, i++)
Voglio dire... io pensavo fosse in dispensabile avere come primo argomento 
l'inizializzazione del contatore, come secondo la condizione e come terzo il 
contatore che aumenta o diminuisce.
La tua costruzione è tutta diversa... sigh! :-\
Proveresti a farmi la "parafrasi"? :-)
pisolo 

 bookmarked
Bucmarca anche questo:
http://fido.altervista.org/RegExp/regex.html
Non so se č ben fatto (da uno sguardo veloce mi pare proprio di sě) e ho
visto che contiene anche degli esercizietti niente male.


 contatore che aumenta o diminuisce.
No.
for (a ; b ; c) {...}
- esegue a all'inizio del ciclo
- ad ogni iterazione controlla la condizione b. Se e` vera continua il
ciclo
- alla fine di ogni iterazione esegue la c
a, b e c possono essere qualsiasi cosa
Ora per esercizio cerca di capire il ciclo for, dovrebbe essere piu`
semplice da capire. :)
Se non ci riesci, torna a cheidere.
Bye.
-- 
Alessandro Pellizzari

 visto che contiene anche degli esercizietti niente male.
Buucmarcato anche questo :-)
Da quello che ho visto anche a me sembra buono, e sicuramente sempre meglio 
del mio libro... Poi quegli esercizietti sono comodi, aiutano a mettere in 
pratica la teoria, ed io cosě riesco a fissarle meglio in memoria.
ciao pisolo 

 Se non ci riesci, torna a cheidere.
Ok. 

Vero? :-)))) 
Forse te lo hanno gia' detto, ma con alcuni browser ci sta che ti sbarelli
la "a" accentata :-)
Leonardo
-- 
My county is Kiltartan Cross,
My countrymen Kiltartan's poor,
No likely end could bring them loss
Or leave them happier than before.              
http://snipurl.com/eloha

 la "a" accentata :-)
Ti riferisci a questa a accentata $_GET['età']; ?
Cioè alla variabile età passata dal form? Ma avendola elaborata e 
trasformata, come sopra, in $eta non va bene? Mi spiegheresti in che modo il 
browser può avere problemi con quell'accento, se lo script viene elaborato 
da php? Oppure mi sfugge qualcosa? O|O
ciao pisolo