PDA

View Full Version : [PHP] Funzione per autenticazione


cionci
01-03-2004, 23:25
Volevo condividere con voi questa funzione per l'autenticazione in PHP...

Innanzi tutto ecco quello che volevo garantire era una protezione dalla forza bruta...

Questo sono le due tabelle necessarie...

#
# Table structure for table 'admins'
#

DROP TABLE IF EXISTS admins;
CREATE TABLE admins (
Username varchar(30) NOT NULL default '',
Password varchar(255) NOT NULL default '',
PRIMARY KEY (Username)
) TYPE=MyISAM;



#
# Table structure for table 'loginlog'
#

DROP TABLE IF EXISTS loginlog;
CREATE TABLE loginlog (
IP varchar(30) NOT NULL default '',
timestamp datetime NOT NULL default '0000-00-00 00:00:00',
last_result tinyint(1) unsigned NOT NULL default '0',
banned tinyint(1) unsigned NOT NULL default '0',
total_retrys int(10) unsigned NOT NULL default '1',
retrys int(10) unsigned NOT NULL default '1',
PRIMARY KEY (IP)
) TYPE=MyISAM COMMENT='Tentativi login';

I file di utilità:

<?php
function db_open($dbhost, $dbuser, $dbpass, $dbname, &$conn)
{
$conn=mysql_connect($dbhost, $dbuser, $dbpass)
or die("Errore nella connessione al database");
mysql_select_db($dbname, $conn)
or die("Impossibile selezionare il database $dbname");
}

function do_query($query, &$results)
{
$results = mysql_query($query)
or die( "Errore: $query \n" .mysql_error());
}

function lock_tables($tables) //NOMETABELLA [WRITE|READ] separati da virgola
{
$tables = "LOCK TABLES ".$tables.";";
do_query($tables, $res);
}

function unlock_tables()
{
do_query("UNLOCK TABLES;", $res);
}
?>

I dati di configurazione della funzione di login:

<?php
//tabella per il logging dei tentivi
$logtable = "loginlog";
//tabella che contiene username e password
$authtable = "admins";
//intervallo di controllo sui login falliti
$fail_interval = "20 MINUTE";
//intervallo di controllo sui login corretti
$success_interval = "2 MINUTE";
//non si possono fare più di fail_num login
//errati nell'intervallo fail_interval
$fail_num = 10;
//non si possono fare più di success_num
//login corretti nell'intervallo success_interval
$success_num = 10;
//comunque non si possono fare più di total_num
//tentativi nell'intervallo fail_interval
$total_num = 30;
?>

Ed ecco la funzione:

<?php
function verify_user($username, $password)
{
require("login_config.inc.php"); //contiene la definizione dei dati per configurazione del login
require("dbaccess.inc.php"); //contiene i dati per la connessione
require("mysql.inc.php");
require("main.inc.php"); //contiene la definizione di check_param (contro l'SQL injection)
if(!check_param($username) || !check_param($password))
return 0;
db_open($dbhost, $dbusername, $dbpassword, $dbname, $conn);
lock_tables("$authtable READ");
do_query("SELECT Username FROM $authtable WHERE Username = '$username' "
."AND Password = md5('$password');", $res);
$row = mysql_fetch_assoc($res);
$success = ($row["Username"] == $username && mysql_num_rows($res) > 0) ? 1 : 0;
mysql_free_result($res);
unlock_tables();
lock_tables("$logtable WRITE");
do_query("DELETE FROM $logtable WHERE (NOW() - "
."DATE_ADD(Timestamp, INTERVAL $fail_interval)) > 0;", $res);
do_query("SELECT *, (NOW() - DATE_ADD(timestamp, INTERVAL $fail_interval)) "
."As fail_flag, (NOW() - DATE_ADD(timestamp, INTERVAL $success_interval)) "
."As success_flag FROM $logtable WHERE IP = '"
.$_SERVER["REMOTE_ADDR"]."';", $res);
$row = mysql_fetch_assoc($res);
mysql_free_result($res);
if($row["IP"] != $_SERVER["REMOTE_ADDR"])
//nuovo IP
do_query("INSERT INTO $logtable (IP, last_result, banned, timestamp) "
."VALUES('".$_SERVER["REMOTE_ADDR"]."', $success, 0, NOW());", $res);
else if($row["banned"])
{
//ip bannato
$success = 0;
do_query("UPDATE $logtable SET timestamp = NOW() WHERE IP = '"
.$_SERVER["REMOTE_ADDR"]."';", $res);
}
else
{
//ip non bannato, ma presente sulla tabella
$banned = 0;
$time = "'".$row["timestamp"]."'";
$last_result = $success;
if($row["fail_flag"] < 0)
$total_retrys = $row["total_retrys"] + 1;
else
$total_retrys = 1;
if($success && $row["last_result"] == 1 && $row["retrys"] < $success_num
&& $row["success_flag"] < 0)
//successo con successo precedente
$retrys = $row["retrys"] + 1;
else if(!$success && $row["last_result"] == 0 && $row["retrys"] < $fail_num
&& $row["fail_flag"] < 0)
//insuccesso con insuccesso precedente
$retrys = $row["retrys"] + 1;
else if($success && $row["last_result"] == 1 && $row["retrys"] >= $success_num
&& $row["success_flag"] < 0)
{
//bannaggio di un ip, perchè ha superato il numero di successi
$banned = 1;
$retrys = $row["retrys"] + 1;
$success = 0;
$time = "NOW()";
}
else if(!$success && $row["last_result"] == 0 && $row["retrys"] >= $fail_num
&& $row["fail_flag"] < 0)
{
//bannaggio di un ip, perchè ha superato il numero di insuccessi
$banned = 1;
$retrys = $row["retrys"] + 1;
$success = 0;
$time = "NOW()";
}
else if($row["total_retrys"] >= $total_num && $row["fail_flag"] < 0)
{
//bannaggio per aver superato il num. massimo di tentativi
$banned = 1;
$retrys = 0;
$success = 0;
$time = "NOW()";
}
else
{
$retrys = 1;
$time = "NOW()";
}
do_query("UPDATE $logtable SET last_result = $last_result, banned = $banned, "
."timestamp = $time, retrys = $retrys, total_retrys = $total_retrys "
."WHERE IP = '".$_SERVER["REMOTE_ADDR"]."';", $res);
//a questo punto se $banned è uguale a 1 si potrebbero
//loggare i ban effettuati su un'altra tabella
}
unlock_tables();
mysql_close($conn);
return $success;
}
?>

Cosa ne pensate ? Come la migliorereste ?

Ciao

cionci
02-03-2004, 10:57
Up ;)

Fenomeno85
02-03-2004, 14:24
adesso me la studio questa funzione :) ma sicuramente sarà una bomba questo script :)

~§~ Sempre E Solo Lei ~§~

Fenomeno85
02-03-2004, 15:00
incomincio a chiederti delle cose:

nei file che includi non capisco le informazioni che ci devo mettere.
Forse sarà una domanda stupida ma che cosa è il check param???



~§~ Sempre E Solo Lei ~§~

Fenomeno85
02-03-2004, 16:02
ok tutto sistemato tranne che non so che devo fare nel file check_param, ho provato a vedere anche su php.net ma nisba.

Come funzione la trovo veramente fatta bene ... pensando che avrei solo fatto un controllo sull'utente e sulla pass.

~§~ Sempre E Solo Lei ~§~

VICIUS
02-03-2004, 20:20
check_param è una funzione definita in un'altro file. Da quello che ho capito cionci la usa per controllare che l'utente non tenti di fare alcuni giochetti strani con i parametri passati tramite form.

Sono curioso di veder questa funzione. Cosa controlli di solito in questi casi ?

Per ora l'unica cosa che mi viene in mente e l'utilizzo di qualche assert qua e la al posto di un qualche if.

ciao ;)

cionci
02-03-2004, 20:52
check_param per ora è molto semplice...non ci ho ancora pensato molto...

<?php
function check_param($param)
{
if(!isset($param) || stristr($param, ";") || stristr($param, "SELECT")
|| stristr($param, "UPDATE") || stristr($param, "INSERT")
|| stristr($param, "DELETE") || stristr($param, "CREATE"))
return FALSE;
return TRUE;
}
?>

cionci
02-03-2004, 20:55
Originariamente inviato da VICIUS
Per ora l'unica cosa che mi viene in mente e l'utilizzo di qualche assert qua e la al posto di un qualche if.

Dove li metteresti ? :)

cionci
02-03-2004, 20:56
Originariamente inviato da Fenomeno85
nei file che includi non capisco le informazioni che ci devo mettere.

In dbaccess.inc.php devi definire queste variabili:

$dbhost
$dbusername
$dbpassword
$dbname

Fenomeno85
02-03-2004, 21:04
Originariamente inviato da cionci
In dbaccess.inc.php devi definire queste variabili:

$dbhost
$dbusername
$dbpassword
$dbname

scusa ma username e pass non sono passate??

~§~ Sempre E Solo Lei ~§~

cionci
02-03-2004, 21:13
No...$dbusername e $dbpassword, da mettere nel file dbaccess.inc.php, sono i dati per accedere al database... $username e $password sono quelli da verificare...

Fenomeno85
02-03-2004, 21:20
scusa ma io non devo collegarmi con quel utente al db???

~§~ Sempre E Solo Lei ~§~

Fenomeno85
03-03-2004, 07:07
ok ho capito quello che si deve fare con l'autenticazione :) ... mi stavo incasinando pensando che si doveva modificare la tabella dei grant :)

~§~ Sempre E Solo Lei ~§~

cionci
03-03-2004, 08:41
Originariamente inviato da Fenomeno85
ok ho capito quello che si deve fare con l'autenticazione :) ... mi stavo incasinando pensando che si doveva modificare la tabella dei grant :)

~§~ Sempre E Solo Lei ~§~
Quella te la metti come ti pare a te...è per quello che non ho specificato il file dbaccess.inc.php...infatti contiene informazioni relativi alla connessione con il db che cambiano da server a server...

Avete capito come funziona ?

VICIUS
03-03-2004, 09:52
Originariamente inviato da cionci
Dove li metteresti ? :)

Ci ho dato un'occhiata piu approfondita e non mi pare ci sia bisogno di qualche assert.
Il mio deve essere stato un riflesso condizionato visto che di solito metto delle assert un po ovunque :p

ciao ;)

Fenomeno85
03-03-2004, 15:14
ma perchè success è sempre 0??? se provo con un utente inserito o meno nella tabella admin.

~§~ Sempre E Solo Lei ~§~

Fenomeno85
04-03-2004, 12:19
uppete :)

~§~ Sempre E Solo Lei ~§~

cionci
04-03-2004, 18:40
A me success non è sempre 0... Prova a fare un po' di debug...

Fenomeno85
04-03-2004, 18:56
bo non so il perchè non vuole funzionare :wtf:

comunque forse può essere utile ma aggiungerei nella funzione verify_user il controllo per l'eliminazione degli spazi facendo

$username = trim ($username);
$password = trim ($password);

adesso riprovo a controllare se non ho sbagliato qualcosa

~§~ Sempre E Solo Lei ~§~

cionci
04-03-2004, 19:06
Sì...ma non in questo modo...io farei così.. Se ci sono spazi allora il login è sbagliato...

if($username != trim ($username) || $password != trim ($password))
return FALSE;

Fenomeno85
04-03-2004, 19:15
$row = mysql_fetch_assoc($res);

in row non esiste niente ... ma è possibile?? eppure $res contiene Resource id #8 ... inspiegabile

~§~ Sempre E Solo Lei ~§~

cionci
04-03-2004, 19:26
md5('$password')

L'hai messa in md5 la password ?

Fenomeno85
04-03-2004, 20:02
dove???

~§~ Sempre E Solo Lei ~§~

cionci
04-03-2004, 20:07
Nel DB...le password non sono salvate in chiaro, ma va salvato l'md5 della password..

Fenomeno85
04-03-2004, 20:10
mmm allora forse ho capito dove ho sbagliato ..
una domanda forse stupida .. ma se uno conosce l'algoritmo md5 e accede sul db può leggere tutte le pass o no??

~§~ Sempre E Solo Lei ~§~

cionci
04-03-2004, 20:12
No...l'md5 non è reversibile...o almeno non è stato ancora crackato (al contrario di md4)...

Fenomeno85
04-03-2004, 20:17
ok grazie :D

~§~ Sempre E Solo Lei ~§~

[-°-3DM@RK-°-]©
05-03-2004, 13:32
Curiosità... poi come la gestisci la sessione dopo il login? con cookie? Io avevo fatto funzione simile per la gestione dell'accesso al server di un laboratorio (http://www.lido.dist.unige.it/LavoriStudenti/PortingDB/index.html) dell'università.

Fenomeno85
05-03-2004, 14:33
la gestione se non ho capito male viene gestita attraverso la variabile $_session

~§~ Sempre E Solo Lei ~§~

Fenomeno85
05-03-2004, 17:03
sorge il problema ... ma come faccio a far vedere la variabile $_session in modo globale??

~§~ Sempre E Solo Lei ~§~

VICIUS
05-03-2004, 18:58
Originariamente inviato da Fenomeno85
sorge il problema ... ma come faccio a far vedere la variabile $_session in modo globale??

~§~ Sempre E Solo Lei ~§~
$_SESSION è un array che contiene le variabili registrate nella sessione corrente. è gia accessibile ovunque.

ciao ;)

Fenomeno85
05-03-2004, 20:10
e perchè a me non rimangono globali?? se cerco di visualizzarle in un frame non me la vede

~§~ Sempre E Solo Lei ~§~

VICIUS
05-03-2004, 20:29
Originariamente inviato da Fenomeno85
e perchè a me non rimangono globali?? se cerco di visualizzarle in un frame non me la vede

~§~ Sempre E Solo Lei ~§~
probabilmente le varie pagine del frame vengono considerate come sessioni diverse quindi non viene salvata. fidati butta via i frame che creano solo dei problemi.

ciao ;)

Fenomeno85
05-03-2004, 21:18
e che uso??

~§~ Sempre E Solo Lei ~§~

cionci
05-03-2004, 21:57
Ma ti sei letto l'help sulle sessioni ?!?!? Devi far partire la sessione !!!

Fenomeno85
06-03-2004, 14:17
ops non sapevo manco che esistevano ... avevo provato a vedere se esisteva la variabile $_session ma su php.net non l'ho trovata ... comunque sai o mi puoi spiegare cosa serve e come si utilizza??

~§~ Sempre E Solo Lei ~§~

cionci
06-03-2004, 15:48
http://it.php.net/manual/it/ref.session.php

Credo che meglio dell'help ufficiale non saprei fare...

Fenomeno85
07-03-2004, 14:38
allora ... non ho capito dove sbaglio ... se uso la funzione session_start ();
$_SESSION ['logged_in'] = 1;

su session_start mi da errore ... :muro: eppure la riesco a salvare perchè se faccio echo $_SESSION ['logged_in'] = 1; vedo che è settata a 1.

~§~ Sempre E Solo Lei ~§~

cionci
07-03-2004, 18:26
session_start va eseguita prima di qualsiasi output...quindi mettila sulla prima riga della pagina (attenzione alle righe vuote prima di <%php...

Fenomeno85
07-03-2004, 19:36
ma perchè :muro:

Warning: session_start(): open(/tmp\sess_8e2c90d7dc76481322bb37702494804a, O_RDWR) failed: No such file or directory (2) in C:\Programmi\Apache Group\Apache2\htdocs\frameleft.php on line 37

~§~ Sempre E Solo Lei ~§~

cionci
08-03-2004, 07:20
Crea la directory c:\tmp...

Fenomeno85
08-03-2004, 16:13
creata la cartella C:/tmp e anche sulla cartella che si vede ma nisba esce:

Warning: session_start(): Cannot send session cookie - headers already sent by (output started at C:\Programmi\Apache Group\Apache2\htdocs\frameleft.php:8) in C:\Programmi\Apache Group\Apache2\htdocs\frameleft.php on line 37

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at C:\Programmi\Apache Group\Apache2\htdocs\frameleft.php:8) in C:\Programmi\Apache Group\Apache2\htdocs\frameleft.php on line 37

~§~ Sempre E Solo Lei ~§~

cionci
08-03-2004, 16:27
sessin_start lo devi eseguire prima di qualsiasi output...anche una riga vuota è un output...

Fenomeno85
08-03-2004, 16:30
allora questa è la prima parte dopo il body:
<?
session_start ();
if ($_SESSION ['logged_in'] == 1){
echo "Utente loggato";
include ("sicurezza/utente_registrato.php");
}
else{
echo "utente non loggato";
include ("sicurezza/utente_nonregistrato.php");
}
?>

~§~ Sempre E Solo Lei ~§~

cionci
08-03-2004, 16:32
Tutto ciò che è al di fuori dei tag <? ?> è un output... Quindi deve essere prima di qualsiasi codice HTML all'interno della tua pagina...

Fenomeno85
08-03-2004, 16:40
cacchio in ogni posto che lo metto sempre lo stesso

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Copyright</title>
<link rel="stylesheet" type="text/css" href="stili.css" />
<meta http-equiv="Content-Language" content="it" />
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252" />
<script language="JavaScript" type="text/javascript">
<!--
function FP_preloadImgs() {//v1.0
var d=document,a=arguments; if(!d.FP_imgs) d.FP_imgs=new Array();
for(var i=0; i<a.length; i++) { d.FP_imgs[i]=new Image; d.FP_imgs[i].src=a[i]; }
}

function FP_swapImg() {//v1.0
var doc=document,args=arguments,elm,n; doc.$imgSwaps=new Array(); for(n=2; n<args.length;
n+=2) { elm=FP_getObjectByID(args[n]); if(elm) { doc.$imgSwaps[doc.$imgSwaps.length]=elm;
elm.$src=elm.src; elm.src=args[n+1]; } }
}

function FP_getObjectByID(id,o) {//v1.0
var c,el,els,f,m,n; if(!o)o=document; if(o.getElementById) el=o.getElementById(id);
else if(o.layers) c=o.layers; else if(o.all) el=o.all[id]; if(el) return el;
if(o.id==id || o.name==id) return o; if(o.childNodes) c=o.childNodes; if(c)
for(n=0; n<c.length; n++) { el=FP_getObjectByID(id,c[n]); if(el) return el; }
f=o.forms; if(f) for(n=0; n<f.length; n++) { els=f[n].elements;
for(m=0; m<els.length; m++){ el=FP_getObjectByID(id,els[n]); if(el) return el; } }
return null;
}
// -->
</script>
</head>
<body bgcolor="#7EB2E5" onload="FP_preloadImgs(/*url*/'button3A.gif', /*url*/'button3B.gif', /*url*/'button90.gif', /*url*/'button91.gif',

/*url*/'buttonA2.gif', /*url*/'buttonA3.gif', /*url*/'buttonA8.gif', /*url*/'buttonA9.gif', /*url*/'buttonD4.gif', /*url*/'buttonD5.gif', /*url*/'buttonDA.gif',

/*url*/'buttonDB.gif', /*url*/'buttonDD.gif', /*url*/'buttonDE.gif', /*url*/'buttonE6.gif', /*url*/'buttonE7.gif', /*url*/'buttonF4.gif', /*url*/'buttonF5.gif',

/*url*/'immagini_bottoni/button4.gif', /*url*/'immagini_bottoni/button5.gif', /*url*/'immagini_bottoni/buttonDD.gif',

/*url*/'immagini_bottoni/buttonDE.gif', /*url*/'immagini_bottoni/button25.gif', /*url*/'immagini_bottoni/button26.gif',

/*url*/'immagini_bottoni/button28.gif', /*url*/'immagini_bottoni/button29.gif')">

<?
if ($_SESSION ['logged_in'] == 1){
echo "Utente loggato";
include ("sicurezza/utente_registrato.php");
}
else{
echo "utente non loggato";
include ("sicurezza/utente_nonregistrato.php");
}
?>

.....

</body>

</html>

se ho questa pagina dove lo metto??

~§~ Sempre E Solo Lei ~§~

cionci
08-03-2004, 16:45
Prima di questo !!!
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

Fenomeno85
08-03-2004, 16:57
ok, l'errore è scomparso ... ma non riesco a far funzionare ... se provo in un altro frame a guardare se questa variabile è settata non mi visualizza niente ...da cosa dipende?

io ho due frame:

frame a:
faccio il controllo (codice sopra)
frame b:
setto a 1 se reg o 0 se non è reg


~§~ Sempre E Solo Lei ~§~

cionci
08-03-2004, 17:27
Hai provato a ricaricare la pagina ?

Fenomeno85
08-03-2004, 17:32
si mille volte ma niente
non è che quando nel frame b modifico il valore devo anche registrarla per caso??

~§~ Sempre E Solo Lei ~§~

cionci
08-03-2004, 17:47
Devi fare session_start in ogni pagina in cui usi la sessione...l'hai fatto ?

Fenomeno85
08-03-2004, 17:53
è si che l'ho fatto ... in tutte le pagine in cui uso quella variabile

~§~ Sempre E Solo Lei ~§~

Fenomeno85
09-03-2004, 07:15
non ti viene in mente niente??

~§~ Sempre E Solo Lei ~§~

cionci
09-03-2004, 08:57
No... :(

Fenomeno85
09-03-2004, 14:13
e se provo a darti le pagine te non puoi vedere??

~§~ Sempre E Solo Lei ~§~

Fenomeno85
09-03-2004, 17:13
niente sistemato ... ho riscitto interamente le pagine e adesso funziona tutto bene.

~§~ Sempre E Solo Lei ~§~

cionci
09-03-2004, 18:39
Mah...chissà cosa era :confused:

Fenomeno85
13-03-2004, 14:20
allora, sto facendo il modulo per poter far rimandare a un utente l'username e la pwd a una determinato indirizzo e-mail.

Allora, sorge un piccolo problemino ... come faccio a riconvertire la pwd da md5?? Se non mi ricordo male mi avevi detto che non era possibile ... quindi che tecnica usare?? salvare nel db anche un campo con la pwd in chiaro?? mi sa che questa strada non è da fare perchè andrei a vanificare il riconoscimento dell'utente.

Una cosa che ho notato del programma è che frequentemente mi viene bannato l'utente se uno si disconnette e riprovava a riconnettersi. La cosa che ho fatto è stata quella di aumentare i valori del file.

~§~ Sempre E Solo Lei ~§~

cionci
13-03-2004, 14:35
Se uno si disconnette e si riconente spesso (ora non mi ricordo quanti login in quanti minuti dovevano avvenire prima del ban) te li banna...credo che vada bene...

Per la password la invii via mail al momento che viene inserita...e prima di immetterla nel DB...a qual punto è in chiaro...

Per una opzione che invia la password via mail in caso di richiesta devi salvare la password in chiaro... Il codice cambia solo nella SELECT...

Fenomeno85
13-03-2004, 16:26
Originariamente inviato da cionci
Se uno si disconnette e si riconente spesso (ora non mi ricordo quanti login in quanti minuti dovevano avvenire prima del ban) te li banna...credo che vada bene...

Per la password la invii via mail al momento che viene inserita...e prima di immetterla nel DB...a qual punto è in chiaro...

Per una opzione che invia la password via mail in caso di richiesta devi salvare la password in chiaro... Il codice cambia solo nella SELECT...

ok allora dopo mi devo mettere a modificare un pò tutte le parti ;)

~§~ Sempre E Solo Lei ~§~

kaworu.it
14-03-2004, 04:33
Originariamente inviato da cionci
check_param per ora è molto semplice...non ci ho ancora pensato molto...

<?php
function check_param($param)
{
if(!isset($param) || stristr($param, ";") || stristr($param, "SELECT")
|| stristr($param, "UPDATE") || stristr($param, "INSERT")
|| stristr($param, "DELETE") || stristr($param, "CREATE"))
return FALSE;
return TRUE;
}
?>


Ciao prima di tutto vi saluto tutti visto che mi sono appena iscritto :D

una picolezza...è inutile fare il controllo se $param è settato visto che viene passato alla funzione è sempre settato
:)

cionci
14-03-2004, 11:57
Se chiami check_param su una variabile del genere :

check_param($_POST["ciao"]);

Se ciao non è defnita isset torna FALSE (trona FALSE anche se $param è null) ;)

kaworu.it
14-03-2004, 12:22
Originariamente inviato da cionci
Se chiami check_param su una variabile del genere :

check_param($_POST["ciao"]);

Se ciao non è defnita isset torna FALSE (trona FALSE anche se $param è null) ;)

il problema è che se passi $_POST['ciao'] che non è definita ti ritornerebbe comunque un notice (se hai l'error reporting per farlo) ed è sempre meglio evitarli quindi il controllo andrebbe fatto prima della chiamata alla funzione, per il valore null hai ragione ma è impossibile che venga passato un valore null alla funzione visto che i dati provegono da un form...avrebbe valore null solo se lo dichiari tu come tale altrimenti la variabile ha sempre un valore anche se vuoto... per esempio $ciccio="" questo non è null :)

cionci
14-03-2004, 13:57
Originariamente inviato da kaworu.it
il problema è che se passi $_POST['ciao'] che non è definita ti ritornerebbe comunque un notice (se hai l'error reporting per farlo)
Che intendi per error reporting ? A me lo passa anche se non è definito e lo valorizza come null...

kaworu.it
14-03-2004, 20:27
in php ci sono fondamentalmente tre tipi di errori gli errori fatali, i warning e i notice.
I notice sono piccoli errori che di solito l'interprete php riesce a sistemare da solo ma sempre di piccoli errori si tratta.
Quando installi php nel php.ini di solito è settato di non mostrare i notice (error report) per fare in modo che vangano visualizzati devi modificare il php.ini alla vore error_reporting e mettere E_ALL cioè appunto che ti visualizzi tutti gli errori.
Fatto questo ti accorgerai che se richiami la tua funzione passando una variabile non settata ti spunterà fuori un notice perchè cerchi di passare qualcosa che non esiste...siccome io programmo con l'error reporting che stampa tutto per questo ti ho detto che era inutile fare il controllo sul settaggio della variabile passata ad una funzione....sarebbe buona norma per tutti i bravi programmatori php programmare tenendo conto dei notice :)