CF – Scope o non Scope?


Tratto dal Blog di Merlinox!

Provocato dall’amico Galapagoss ho scoperto che purtroppo anche questo funziona:

<cfset url.client.id_utente=10>
<cfoutput>#client.id_utente#</cfoutput>

Chiaramente funziona anche con le variabili session!!!


In ColdFusion gli scope delle variabili base, delle variabili URL e delle variabili FORM sono facoltativi.

Si possono non usare, ma al momento che vengono usati le cose cambiano.

Spieghiamo meglio.

Se io scrivo:

<cfif isDefined(“id_utente”)>

il server verifica l’esistenza della variabile id_utente negli scope variables, url, form indipendentemente.

Se ne trova uno ritorna true.

Se invece scrivo:

<cfif isDefined(“form.id_utente”)>

il server cerca solamente quel tipo di variabile.

Nel caso in cui fosse definita una variabile variables.id_utente o url.id_utente ma non form.id_utente, la funzione di controllo ritornerebbe False.

Dove nasce il problema?

Il problema nasce al momento in cui utilizzo una variabile form/url, es.: form.id_utente

 

Se viene chiamata la pagina:

test.cfm?form.id_utente=13

viene create onDemand una variabile form.id_utente come oggetto della struttura url.

Ad esclusione del tag cfparam e della funzione isDefined, ogni operazione fatta sulla variabile form.id_utente, viene fatta su url.form.id_utente (allo stesso modo in cui possiamo evitare lo scope usando miaVariabile al posto di url.miaVariabile).

 

Per risolvere il problema è necessario fare il check della variabile in arrivo necessaria tramite isDefined() che invece funziona correttamente, riconoscendo la variaibile in modo corretto come url.form.id_utente oppure tramite <cfparam …>

Questo perchè trova la variabile form.id_utente all’interno della struttura url

trova cioè url.form.id_utente che però legge come form.id_utente, bypassando i controlli.

Per capire meglio provate questo breve codice:

<cfif form.id_utente gt 10>
Ciao mamma
</cfif>

<cfdump var=”#url#” label=”URL”>
<cfdump var=”#form#” label=”FORM”>

 

richiamate la pagina (test.cfm) in questo modo: test.cfm?form.id_utente=100

e vedrete che “Ciao mamma” compare,

mentre dentro alla struttura form non esiste alcuna variabile id_utente

 

Per ovviare si può correggere il codice in questo modo:

<cfif isDefined(“form.id_utente”) and form.id_utente gt 10>
Ciao mamma
</cfif>

<cfdump var=”#url#” label=”URL”>
<cfdump var=”#form#” label=”FORM”>

Segnalo inoltre che lo scope corretto risulta prioritario rispetto ad uno scope “alternativo”.

Quindi l’esempio che riporto:

 

<cfset form.id_utente=”idUtenteForm”>
<cfset url.form.id_utente=”idUtenteUrl”>
<cfoutput>#form.id_utente#</cfoutput>

 

Restituirà in output la variabile corretta, quindi pre-dichiarando

<cfparam name=”form.id_utente” default=”0″>

 

Possiamo essere sicuri che le operazioni (<cfif>,…) saranno sempre basate sullo scope corretto!

CF – Scope o non Scope? ultima modifica: 2006-05-22T00:00:00+00:00 da Enrico

Comments are closed.