Newsgroup: it.comp.www.php
Titolo: Variabili boolene passate e rese da funzione

Buongiorno!
Nel mio programma PHP uso una variabile $errors definita booleana.
Questa variabile viene passata ad una function che esegue dei controlli, e 
se fossero rilevati errori, la variabile $errors dovrebbe tornare TRUE.
Non capisco dove sbaglio, perchè la variabile in questione conserva il 
valore originario.
Questo è il codice:
#-------------------------------------------------------------------------------
$errors = FALSE;
if(isset($_REQUEST["seen_already"])) {
  Controllo_Dati($errors);
  if($errors == TRUE) {
   Emissione_Pagina();
  } else {
    Elaborazione();
     }
} else {
    Emissione_Pagina();
  }
#-------------------------------------------------------------------------------
# Controllo_Dati
#-------------------------------------------------------------------------------
function Controllo_Dati($errors) {
  $errors = FALSE;
 $connection = mysql_connect("localhost", "root","pwd")
               or die("Impossibile connettersi al server.");
 $db = mysql_select_db("unicars", $connection)
       or die("Impossibile selezionare il database.");
 $query = "Select * From utenti ".
          "Where CodiceCliente = '". $_REQUEST["CodiceCliente"]. "' ".
       "  and CodiceDestin = '". $_REQUEST["CodiceDestin"]. "' ";
 $result = mysql_query($query)
           or die("Utente non registrato". mysql_error());
 $RigheLette = mysql_affected_rows();
 if($RigheLette > 0) {
    while ($riga = mysql_fetch_array($result)) {
    /* Controlla la Password */
    if($riga ['PwdCliente'] !=  $_REQUEST["Password"]) {
       $errors = TRUE;
           echo "<script language=\"JavaScript\">\n";
           echo "alert(\"Password errata.\");\n";
           echo "</script>\n";
        }
   }
 } else {
    $errors = TRUE;
     echo "<script language=\"JavaScript\">\n";
      echo "alert(\"Codice Cliente o Codice Destinazione 
inesistente.\");\n";
      echo "</script>\n";
  }
 mysql_free_result($result);
 mysql_close($connection);
 return($errors);
}
#-------------------------------------------------------------------------------
Dove sbaglio?
Grazie
Ciao
Eugenio 

 function Controllo_Dati($errors) {
La passi per valore. Devi passarla per riferimento.
Bye.

 ha scritto nel messaggio 
news:58h81fF...@mid.individual.net...

Cosa significa passarla per riferimento?
Grazie 

 Cosa significa passarla per riferimento?
http://www.php.net/manual/en/functions.arguments.php
Bye.

 ha scritto nel messaggio 
news:58h8k8F...@mid.individual.net...

Grazie Alessandro.
Mi son perso in un bicchier d'acqua.
L'istruzione doveva essere
$errors = Controllo_Dati($errors);
 

 Dove sbaglio?
Al volo: scope.

 $errors = Controllo_Dati($errors);
Non necessariamente. Passare per riferimento (o per dirla all'inglese 
"reference") significa che non gli passi una copia della variabile, ma 
proprio la variabile stessa (diciamo il suo indirizzo va).
Quindi le modifiche andranno a interessare proprio la variabile che 
passi.
Per far ciò, nella definizione della funzione, anziché scrivere:
function Controllo_Dati($errors)
scrivi
function Controllo_Dati(&$errors)
Una cosa che comunque non ha senso è:
function Controllo_Dati($errors) {
  $errors = FALSE;
  ...
Che senso ha passare $errors se tanto lo imposti sempre a FALSE come 
primissima istruzione?
ps: sbaglio o eri tu che programmavi da quindici anni? Possibile che 
non sai che vuol dire passare per riferimento?
--
rob4you


Innanzitutto grazie per le spiegazioni
Non devo passare nulla alla funzione, ma mi deve rendere la variabile.
In PHP non si opera cosě?
Giorni fa ho fatto alcune richieste, ma il topic č rimasto senza risposta 
(Nessuna pretesa, sia chiaro).
Il fatto che non abbia capito al volo quello che ha scritto Alessandro č 
semplicemente per il fatto che nel linguaggio che uso piů di frequente 
(VB/VBA) il "passare per riferimento" (ByRef) č una impostazione 
predefinita, quindi automatica anche per me. "Passare per valore" mi succede 
raramente e per scelta preferisco denominare le variabili in modo 
differente.
Per quanto riguarda il "p.s.", cos'č questo NG? Un Tribunale?
Beh, scusami, sa un po' di scortesia. Che serve riprendere quello che posso 
aver scritto in un altro post e in un altro contesto?
Tra l'altro non mi ricordo bene il contesto, se non che l'ho scritto nel 
topic del "Goto".
Non credo che dicendo "programmo da molti anni" ne abbia fatto un vanto come 
qualcuno ne fa per il titolo di commendatore o mi sia spacciato da 
accademico, anzi ho detto che vado molto sul pratico e non mi scandalizzo 
per l'uso del Goto.
Salvo che quelle affermazioni abbiano offeso qualcuno.
E' cosě?
Vabbč, Signori della Corte, qual'č la mia condanna?
:-)))))))
Grazie
Ciao
Eugenio

 risposta (Nessuna pretesa, sia chiaro).
Ti riferisci a quello sulle pratiche di programmazione? E` quasi
impossibile rispondere a una domanda del genere, sia perche` ognuno ha le
sue, sia perche` per ognuno, le proprie tecniche sono date per scontate,
non viene in mente che qualcun'altro possa programmare in altro modo, a
meno che non lo si facesse in passato, quindi, almeno io personalmente non
sapevo nemmeno da dove partire a risponderti.
Posso dirti cosa non mi piace del tuo codice e come lo farei io:
------------------
$errors = FALSE;
if(isset($_REQUEST["seen_already"])) {
  Controllo_Dati($errors);
  if($errors == TRUE) {
   Emissione_Pagina();
  } else {
    Elaborazione();
     }
} else {
    Emissione_Pagina();
}
------------------
Qui non mi piace l'uso di $_REQUEST. E` come usare le register_globals,
non sai da dove vengono i tuoi dati.
Usa $_POST o $_GET
Inoltre io nomino sempre le funzioni_in_minuscolo_con_gli_underscore.
Altri usano il camelCase con l'iniziale minuscola, ma qui va a gusti.
Per il resto, il codice e` abbastanza chiaro, tranne quell'errors passato
come argomento.
Usa
$errors = Controllo_Dati();
------------------
function Controllo_Dati($errors) {
  $errors = FALSE;
------------------
Qui e` una pignoleria, ma e` false, non FALSE
PHP la prende comunque, ma meglio prendersi avanti :)
false e` un valore, FALSE e` la notazione che si usa di solito per
definire le costanti.
------------------
 $connection = mysql_connect("localhost", "root","pwd")
               or die("Impossibile connettersi al server.");
 $db = mysql_select_db("unicars", $connection)
       or die("Impossibile selezionare il database.");
 $query = "Select * From utenti ".
          "Where CodiceCliente = '". $_REQUEST["CodiceCliente"]. "' ".
       "  and CodiceDestin = '". $_REQUEST["CodiceDestin"]. "' ";
------------------
Vedi sopra, $_REQUEST.
Come convenzione, alcuni scrivono le keyword SQL tutte in MAIUSCOLO, altri
(tra cui me) tutte in minuscolo.
Ti conviene prendere l'abitudine di chiamare tutti i campi in minuscolo,
invece, perche` molti DB non distinguono, quindi potresti trovarti con
"Via" e "via" che su un DB funziona e distingue due campi, su un altro ti
da` errore.
Quando fai query, passa sempre tutte le stringhe che ti arrivano
dall'utente per mysql_real_escape_string():
 $query  = "select * from utenti ";
 $query .= "where CodiceCliente='".
            mysql_real_escape_string($_POST["CodiceCliente"])."' ";
 $query .= " and CodiceDestin='".
             mysql_real_escape_string($_REQUEST["CodiceDestin"]). "' ";
Questo per evitare SQL Injection.
------------------
 $result = mysql_query($query)
           or die("Utente non registrato". mysql_error());
------------------
Qui non e` vero che la query da` errore se l'utente non e` registrato. Il
messaggio di errore e` ambiguo quando ti capita.
La mysql_query fallisce quando la query e` sintatticamente sbagliata (hai
dimenticato uno spazio, un'apice, ecc.)
------------------
 $RigheLette = mysql_affected_rows();
------------------
mysql_affected_rows() si usa per le operazioni di inserimento.
Per la select si usa mysql_num_rows()
------------------
 if($RigheLette > 0) {
    while ($riga = mysql_fetch_array($result)) { /* Controlla la Password
    */
------------------
Per avere un array associativo usa mysql_fetch_assoc() o
mysql_fetch_array($result, MYSQL_ASSOC)
Se lo vuoi sia numerico che associativo mysql_fetch_array($result,
MYSQL_BOTH)
------------------
    if($riga ['PwdCliente'] !=  $_REQUEST["Password"]) {
       $errors = TRUE;
           echo "<script language=\"JavaScript\">\n"; echo
           "alert(\"Password errata.\");\n"; echo "</script>\n";
        }
   }
------------------
Tutta questa pappardella la puoi evitare cambiando la query:
 $query  = "select * from utenti ";
 $query .= "where CodiceCliente='".
            mysql_real_escape_string($_POST["CodiceCliente"])."' ";
 $query .= " and CodiceDestin='".
             mysql_real_escape_string($_REQUEST["CodiceDestin"]). "' ";
 $query .= " and PwdCliente='". 
             mysql_real_escape_string($_POST["Password"]). "'";
Se ti torna 0 righe, uno dei tre dati e` sbagliato.
Ma qui dipende dal dettaglio di errore che vuoi.
------------------
 } else {
    $errors = TRUE;
     echo "<script language=\"JavaScript\">\n";
      echo "alert(\"Codice Cliente o Codice Destinazione
inesistente.\");\n";
      echo "</script>\n";
  }
 mysql_free_result($result);
 mysql_close($connection);
 return($errors);
}
------------------
Qui, giustamente, torni $errors al chiamante, quindi non ti serve passarlo
come parametro.
Un paio di consigli:
Conviene aprire la connessione al DB ad inizio pagina, e non chiuderla,
tanto si arrangia PHP a chiuderla alla fine dello script.
Il mysql_free_result e` una buona pratica, utile quando fai lavoro pesante
sul DB per liberare un po' di risorse (visto che in PHP sono limitate da
php.ini).
Non dovresti mischiare PHP e codice HTML (o Javascript), ma fare una
funzione che torni l'errore, e poi da script principale passare i valori
al template.
Fare un esempio qui sarebbe lungo, ma per esempio, invece di tornare solo
true o false come errore, puoi definirti delle costanti (e` solo uno dei
metodi):
define ("OK", 0);
define ("ERR_WRONGPASS", 1);
define ("ERR_WRONGCLIENTCODE", 2);
define ("ERR_WRONGUSERNAME", 4);
Se usi il sistema binario li puoi combinare:
return ERR_WRONGPASS | ERR_WRONGUSERNAME;
ti torna 5 (4+1), ma tu dall'altra parte puoi usare
$error = Controllo_Dati();
if ($error & ERR_WRONGPASS) {
  print ("password errata");
}
if ($error & ERR_WRONGUSERNAME) {
  print ("username errato");
}
Come vedi, se posti il codice e` piu` facile dirti quali sono le best
practices e come correggerlo. ;)
Bye.

 :-)))))))
La condanna è...... imparare ASP! :-)
--
rob4you

 ha scritto nel messaggio 
news:58hmbaF...@mid.individual.net...

Grazie ancora Alessandro.
Il fatto è che sto imparando il PHP da autodidatta, non potendo fare un 
corso PHP in aula per mancanza di tempo. Lo faccio seguendo corsi su testi o 
quelli disponibili nel web o acquisendo suggerimenti come i vostri.
Non potendo ricordare a memoria quei volumoni da 600/700 pagine, ho deciso 
di seguire quei corsi su testo tipo Passo-Passo per avere l'idea di come si 
sviluppano programmi PHP (Steven Holzer - PHP5 -collana Subito e Facile - 
Mondadori Informatica).
Purtroppo essendo libri molto pratici, tralasciano molto della teoria, per 
cui dove non hai l'informazione, che magari troverai alla pag 449 del testo 
completo, vai a descrivere il più possibile. Lo so che questi corsi/testi 
non sono il meglio, ma almeno hanno il pregio di farti familiarizzare il 
linguaggio.
In merito al passaggio delle variabili nelle funzioni, io arrivo dal VB, non 
dal C e in VB dichiarare gli argomenti delle funzioni è obbligatorio.
In merito all'uso del $_Request, invece, è proprio il testo che lo 
preferisce a $_Post e $_Get, perchè è un array che contiene i precedenti e 
così mi sono adeguato.
Detto questo, che può essere una leggerezza, non ho capito cosa intendi, 
quando dici "non sai da dove vengono i tuoi dati". E' così importante sapere 
lato server se arrivano da get o da post?
Se sì, perchè?
SQL: anch'io preferisco usare le keyword in minuscolo, tranne che per 
l'iniziale, che mi piace di più. L'uso di troppi caratteri maiuscoli mi 
rendano illeggibile il codice.
Che il die della query funziona solo in caso di errori della sintassi, l'ho 
già notato nelle mie prove. Ho imprecato per un po' per capire che se la 
query non trova nulla, non ritorna il messaggio, tant'è che ho messo il 
controllo del numero di righe lette. Hai ragione, sarebbe meglio un'altra 
descrizione.
Ma non è possibile testare un End of File? In VB si esegue un controllo del 
genere IF EOF = true THEN.... Cosa si fa in PHP?
Sul controllo dei tre dati contemporaneamente non sono molto d'accordo, nel 
senso che se può essere accettabile in questo caso, trovo che è meglio che 
chi inserisce i dati sappia con precisione cosa è sbagliato, ma ovviamento 
questo è un punto di vista.
Sul suggerimento di aprire il DB all'inizio pagina, OK, mi lascia perplesso 
il fatto di non chiuderlo e demandare la chiusura a PHP. Non resta proprio 
più nulla in memoria?
Per il Javascript/HTML vedo di adeguarmi. In un altro programma dove ci sono 
più controlli, ho adottato un array, dove per ogni elemento è contenuta la 
descrizione del dato immesso o la segnalazione d'errore, ma vedo di capire 
meglio il tuo suggerimento.
Infine, nella mia richiesta del post di qualche giorno fa chiedevo se esiste 
qualche sito dove una comunità di programmatori, in questo caso PHP, mette a 
disposizione soluzioni per essere confrontate oppure proprio per essere 
utilizzate.
Nel caso di VB, ma in particolare VBA (Access) ci sono veramente tanti siti 
(esempio 
www.sitocomune.com
) in cui si possono condividere piccole 
applicazioni, dalla più banale alla più complessa.
Per PHP non esiste nessun sito italiano o internazionale al di fuori di 
quelli "istituzionali"?
Grazie
Ciao
Eugenio


Ora che ho scelto volontariamente di passare dall'altra parte persino con 
MySQL, tu mi vuoi rimandare indietro.
Bravo!!!!
Complimenti!!!!
Però potrei anche pentirmi della scelta fatta e tornare indietro 
volontariamente. ;-)
Ho fatto qualcosina di ASP 3.0 qualche anno fa. Poca roba per la verità.
Ciao

 quelli "istituzionali"?
Modello Surceforce, Hotscipts o 
phpclasses.org
 
	Francesco

 
Visto che sei passato dalla "nostra" parte, hai pensato a valutare anche 
l'uso dei vari framework? In lista sono poco presenti, forse per colpa 
che i vari hosting non offrono molte possibilità, ma il risparmio in 
termini "temporali" è notevole (ovviamente dopo aver "speso" tempo per 
studiarli)
	Francesco

 Eugenio
p.s.
ti consiglio *caldamente* ;) di leggere:
http://wiki.news.nic.it/QuotarBene

 Francesco
Puoi spiegarmi meglio?
Ti riferisci a ASP o PHP?
Grazie 

 
http://wiki.news.nic.it/QuotarBene
Non ho capito cosa non va nel mio modo di quotare?
Grazie
Ciao
Eugenio


Ok, ma quindi qual'è la funzione di $_REQUEST?
Grazie 

 Ok, ma quindi qual'è la funzione di $_REQUEST?
Ci sono molte cose in PHP che sono eredita` del passato, mantenute per
compatibilita` coi vecchi script.
$_REQUEST, nonostante il nome e il fatto che sia una "nuovissima"
superglobal, deriva da li`. Per tenere buoni alcuni utenti, in pratica. :)
Bye.

 Non ho capito cosa non va nel mio modo di quotare?
tutto :) non indichi a chi stai rispondendo per dirne una ... leggi gli
esempi nella pagina che ti ho indicato

 "istituzionali"?
Te ne hanno gia` suggeriti alcuni. Quello che preferisco e` phpclasses,
che copre un po' di tutto.
Tieni conto pero` che sono classi, quindi devi usare la programmazione a
oggetti. E ti consiglio di impararla il piu` presto possibile. Ti aiuta a
isolare meglio i problemi e a progettare meglio il software.
Bye.

 Bye.
Grazie Alessandro.
Ciao