PDA

View Full Version : [PHP + AJAX] Modifica variabile


ForgottenSpirit
11-11-2009, 11:39
Volevo sapere se è normale questo problema:
Tramite ajax lancio la richiesta ad una pagina php. Nel fil php c'è una variabile $accesso e 3 funzioni. La variabile $accesso è dichiarata globale all'interno delle funzioni visto che deve essere modificata.
Le funzioni girano, infatti quando tramite ajax (richiesta.responseText;) stampo in un div la risposta tutto funziona correttamente.
Il mio problema è che la variabile $accesso non viene modificata..

E' normale? Cioè con un responseText ovviamente ricevo solo una stringa, ma la funzione nel file PHP è cmq eseguita e se la variabile globale all'interno di quella funzione viene modificata, perchè non dovrebbe farlo?

E' un problema che mi sta facendo impazzire...

MEMon
11-11-2009, 12:26
Ci vuole il codiceeeeeeeeeeeee, altrimenti se vuoi tiro a indovinare!!
Dai provo, mmm vediamo...c'è un errore da qualche parte!!! Forse ci ho preso.

ForgottenSpirit
11-11-2009, 14:02
Ci vuole il codiceeeeeeeeeeeee, altrimenti se vuoi tiro a indovinare!!
Dai provo, mmm vediamo...c'è un errore da qualche parte!!! Forse ci ho preso.

Si scusate, la mia era una domanda al livello teorico.

Questo è un frammento della pagina php:

<?php
$accesso = 20;
switch ($_GET['campo']) {
case 'mail':
controllomail($_GET['input']); break;
case 'password':
controllopassword($_GET['input']); break;
case 'passwordCorrispondenza':
passwordCorrispondenza($_GET['input'], $_GET['input2']); break;
}



function controllomail($input) {
global $accesso = 2;
if (!preg_match("/^[A-Z0-9._%-]+@[A-Z0-9][A-Z0-9.-]{0,61}[A-Z0-9]\.[A-Z]{2,6}$/i", $input) && strlen($input)!=0){
$accesso = 1;
echo "<div class='fumetto rosso'><div>e-mail errata</div></div>";
}else if (strlen($input)!=0){
$accesso = 0;
echo "<div class='fumetto verde'><div>e-mail valida</div></div>";
}
}

controllomail() dovrebbe modificare la variabile globale accesso che è inizializzata a 2, se la mail è corretta passa a 1 altrimenti a 0.

Questo è il frammento Ajax che chiama la pagina:
function controllo(div,campo,input,input2){
//Assegno alla variabile div_esito il valore della variabile div che INSPIEGABILMENTE non può essere riutilizzata (per la funzione asincrono();
div_esito = div;
document.getElementById(div).innerHTML = "controllo...";
server = 'sys/controllodati.php?campo=' + campo + '&input=' + input + '&input2=' + input2;
richiesta = new XMLHttpRequest();
richiesta.onreadystatechange = updateasincrono;
richiesta.open("GET", server, true);
richiesta.send(server);
}

function updateasincrono()
{
if ((richiesta.readyState == 4) && (richiesta.status == 200))
{
var esito = richiesta.responseText;
document.getElementById(div_esito).innerHTML = esito;
}
}

E questo è il frammento che chiama la funzione:

<td><label for="email"><?php voc($l,20)?>:</label></td>
<td colspan="3"><div class="form_text"><div><input type="text" name="email" id="email" size="40" onBlur="controllo('avvisomail','mail',this.value);"/></div></div></td>
<td colspan="3"><div class="avviso"><div id="avvisomail"></div></div></td>

Ripeto che funziona tutto (ovvero il div si popola del testo che avvisa se la mail è nel formato corretto o meno), ma la variabile $accesso non viene modificata.

MEMon
11-11-2009, 14:05
Ma come fai a dire che non viene modificata visto che nel codice che hai postato non la controlli?

ForgottenSpirit
11-11-2009, 14:07
Ma come fai a dire che non viene modificata visto che nel codice che hai postato non la controlli?
Ovviamente la controllo con degli alert(), in un altro frammento.

MEMon
11-11-2009, 14:09
Ovviamente la controllo con degli alert(), in un altro frammento.

Allora fai vedere l'altro frammento... non ci sono le streghe del php.

ForgottenSpirit
11-11-2009, 14:46
Allora fai vedere l'altro frammento... non ci sono le streghe del php.

L'altro frammento e' semplicemente un alert($accesso) o anche un php echo $accesso, la variabile rimane a 2 non viene mai modificata, non ci possono essere errori qui.

Solo se chiamo la funzione dal php controllamail($input) allora ovviamente mi modifica $accesso, ma chiamando il file con ajax no...

MEMon
11-11-2009, 14:50
Si ma fammi capire, tu controlli la variabile richiamando tutto il file?
Se è così è ovvio che stampi sempre il valore alla quale la inizializzi...il file php ha vita e vibilità a se stante, ogni volta che lo "esegui" lo spazio di lavoro si ricrea.

ForgottenSpirit
11-11-2009, 14:54
Si ma fammi capire, tu controlli la variabile richiamando tutto il file?
Se è così è ovvio che stampi sempre il valore alla quale la inizializzi...il file php ha vita e vibilità a se stante, ogni volta che lo "esegui" lo spazio di lavoro si ricrea.

No praticamente il file è in un "include" dentro il file di registrazione.

Vuoi che ti posto gli interi files? tutti e tre?

MEMon
11-11-2009, 14:55
si dai posta tuuto, incluso dove fai il controllo della variabile globale così ci capiamo meglio.

ForgottenSpirit
11-11-2009, 15:02
Questo è il file registrazione:
<form name="registrazione" method="post">

<fieldset>
<legend><?php voc($l,19)?></legend>

<table class="rec">
<tr>
<td><label for="email"><?php voc($l,20)?>:</label></td>
<td colspan="3"><div class="form_text"><div><input type="text" name="email" id="email" size="40" onBlur="controllo('avvisomail','mail',this.value);"/></div></div></td>
<td colspan="3"><div class="avviso"><div id="avvisomail"></div></div></td>
</tr>

<tr>
<td><label for="pw"><?php voc($l,21)?>:</label></td>
<td colspan="3"><div class="form_text"><div><input type="password" name="password" id="pw" size="40" onKeyUp="controllo('avvisopassword','password',this.value);"/></div></div></td>
<td colspan="3"><div id="avvisopassword"></div></td>
</tr>
<tr>
<td><label for="pw"><?php voc($l,62)?>:</label></td>
<td colspan="3"><div class="form_text"><div><input type="password" name="passwordCorrispondenza" id="pwCorrispondenza" size="40" onChange="controllo('avvisocorrispondenza','passwordCorrispondenza',this.value,pw.value);"/></div></div></td>
<td colspan="3"><div id="avvisocorrispondenza"></div></td>
</tr>
</table>

</fieldset>


<fieldset>
<legend><?php voc($l,22)?></legend>

<table class="rec">

<tr>
<td><label for="nome"><?php voc($l,23)?>:</label></td>
<td colspan="3"><div class="form_text"><div><input type="text" name="nome" id="nome" size="40"/></div></div></td>
</tr>
<tr>
<td><label for="cognome"><?php voc($l,24)?>:</label></td>
<td colspan="3"><div class="form_text"><div><input type="text" name="cognome" id="cognome" size="40"/></div></div></td>
</tr>

<tr>
<td><label><?php voc($l,25)?>:</label></td>
<td><label for="giorno" class="sx"><?php voc($l,26)?></label>
<div class="form_text"><div>
<select name="giorno" id="giorno">
<?php
for($i=1; $i<=31; $i++) {
echo "<option value='".$i."'>".$i."</option>";
}?>

</select>
</div></div>

</td>

<td><label for="mese" class="sx"><?php voc($l,27)?></label>
<div class="form_text"><div>
<select name="mese" id="mese">
<?php
for($i=1; $i<=12; $i++) {
echo "<option value='".$i."'>".voc_cal($l, $i)."</option>";
}?>

</select>
</div></div>
</td>

<td><label for="anno" class="sx"><?php voc($l,28)?></label>
<div class="form_text"><div>
<select name="anno" id="anno">
<?php
for($i=date("Y",time()); $i>=1900; $i--) {
if ($i==date("Y",time())){
echo "<option selected value='".$i."'>".$i."</option>";
} else{
echo "<option value='".$i."'>".$i."</option>";
}
}?>

</select>
</div></div>
</td>
<td colspan="3"><div id="avvisodata"></div></td>
</tr>


</table>

</fieldset>


<fieldset id="immagine">
<legend><?php voc($l,29)?></legend>
<p class="verifica"><?php voc($l,30)?>:</p>
<table class="rec">
<tr>
<td>
<div id="sfondocodice" style="background:#fff url('sys/image.php') center center;">
<img src="images/sfondocodice.png"/>
</div>
<a class="minipul" href="javascript:void(0);" onClick="immagine();"><span><?php voc($l,33)?></span></a>
</td>
<td>
<table id="codcol">
<tr>
<td><label for="codice"><?php voc($l,31)?>:</label></td>
<td><div class="form_text"><div><input type="text" name="codice" id="codice" size="40" onBlur="controllocodice(this.value,'<?php echo $testo?>');"/></div></div></td>
<td><div id="avvisocodice"></div></td>
</tr>
<tr>
<td><label for="colore"><?php voc($l,32)?>:</label></td>
<td><div class="form_text"><div>
<select name="colore" id="colore" onChange="controllocolore(this.value, '<?php echo $colore?>');">
<option value="">Seleziona il colore</option>
<?php for($i=39;$i<=42;$i++) {?>
<option value="<?php voc($l,$i)?>"><?php voc($l,$i)?></option>
<?php }?>
</select>

</div></div></td>
<td><div id="avvisocolore"></div></td>
</tr>
</table>
</td>
</tr>
<tr>
<td></td>
</tr>
</table>
</fieldset>

<div class="centrato">
<center>
<table class="rec">
<tr>
</tr>
<td><div class="pulsante"><div><input type="button" value="<?php voc($l,35)?>" onClick="invioform(<?php echo "'".$accesso."'";?>);" /></div></div></td>
<td><div class="pulsante"><div><input type="button" value="<?php voc($l,36)?>" onClick="javascript:history.go(-1);"/></div></div></td>
</tr>
</table>
</center>
</div>
</form>

</body>


Questo è il file "controllodati.php":

<?php
$accesso = 2;
switch ($_GET['campo']) {
case 'mail':
controllomail($_GET['input']); break;
case 'password':
controllopassword($_GET['input']); break;
case 'passwordCorrispondenza':
passwordCorrispondenza($_GET['input'], $_GET['input2']); break;
}



function controllomail($input) {
global $accesso;
if (!preg_match("/^[A-Z0-9._%-]+@[A-Z0-9][A-Z0-9.-]{0,61}[A-Z0-9]\.[A-Z]{2,6}$/i", $input) && strlen($input)!=0){
$accesso = 1;
echo "<div class='fumetto rosso'><div>e-mail errata</div></div>";
}else if (strlen($input)!=0){
$accesso = 0;
echo "<div class='fumetto verde'><div>e-mail valida</div></div>";
}
}

function controllopassword($input) {
global $accesso;
if (strlen($input)<=4){
echo "<div class='fumetto rosso'><div>la password deve essere di almeno 5 caratteri</div></div>";
$accesso = 1;
}
else if (preg_match_all( "@[^a-z0-9 ]+@i", $input, $simboli)){
echo "<div class='fumetto rosso'><div>non sono ammessi caratteri speciali</div></div>";
$accesso = 1;
}else if (strlen($input)>=5 && strlen($input)<8){
if (preg_match_all('/[0-9]/', $input, $numeri)){
$count= count($numeri[0]);
if ($count>0 && $count<=2){
echo "<div class='fumetto blu'><div>livello di sicurezza medio</div></div>";
$accesso = 0;
}else if ($count>2){
echo "<div class='fumetto verde'><div>livello di sicurezza alto</div></div>";
$accesso = 0;
}
}else{
echo "<div class='fumetto rosso'><div>livello di sicurezza basso</div></div>";
$accesso = 0;
}
}else if (strlen($input)>=8){
if (preg_match_all('/[0-9]/', $input, $numeri)){
$count= count($numeri[0]);
if ($count>0 && $count<=2){
echo "<div class='fumetto blu'><div>livello di sicurezza medio</div></div>";
$accesso = 0;
}else if ($count>2){
echo "<div class='fumetto verde'><div>livello di sicurezza alto</div></div>";
$accesso = 0;
}
}
}
}

function passwordCorrispondenza($input1, $input2) {
if ($input1 == $input2){
echo "<div class='fumetto verde'><div>le passwords conincidono</div></div>";
$accesso = 0;
}else{
echo "<div class='fumetto rosso'><div>le passwords non conincidono</div></div>";
$accesso = 1;
}
}

?>


Infine questo è il pezzo di ajax che ci interessa (qua c'è un'altra variabile accesso che è gestita però all'interno di ajax, questa non da problemi):


var accesso = false;

function controllo(div,campo,input,input2){
//Assegno alla variabile div_esito il valore della variabile div che INSPIEGABILMENTE non può essere riutilizzata (per la funzione asincrono();
div_esito = div;
document.getElementById(div).innerHTML = "controllo...";
server = 'sys/controllodati.php?campo=' + campo + '&input=' + input + '&input2=' + input2;
richiesta = new XMLHttpRequest();
richiesta.onreadystatechange = updateasincrono;
richiesta.open("GET", server, true);
richiesta.send(server);
}

function updateasincrono()
{
if ((richiesta.readyState == 4) && (richiesta.status == 200))
{
var esito = richiesta.responseText;
document.getElementById(div_esito).innerHTML = esito;
}
}

function invioform(accesso1) {
alert(accesso1);
if (accesso == true && accesso1 == 0) {
document.registrazione.submit();
} else if (accesso1==1 && accesso==false){
document.getElementById('esito_registrazione').innerHTML="<h3>Attenzione: codice o colore di sicurezza e dati inseriti scorretti (controllare i suggerimenti accanto ai campi).</h3>";
}else if(accesso ==false){
document.getElementById('esito_registrazione').innerHTML="<h3>Attenzione: Codice o colore di sicurezza errato.</h3>";
} else if (accesso1==1){
document.getElementById('esito_registrazione').innerHTML="<h3>Attenzione: dati inseriti scorretti (controllare i suggerimenti accanto ai campi).</h3>";}
}


(accesso1 come parametro è appunto $accesso del file php)

MEMon
11-11-2009, 15:09
La variabile che passi a invioForm() è la variabile $accesso nel momento in cui hai caricato la pagina, inoltre quella non verra mai modificata fuori dal file registrazione.html.

ForgottenSpirit
11-11-2009, 15:16
La variabile che passi a invioForm() è la variabile $accesso nel momento in cui hai caricato la pagina, inoltre quella non verra mai modificata fuori dal file registrazione.html.

E perchè se cmq creo una funzinoe abc() global $a; $a = 0; e la chiamo all'interno del file php, invioform mi passa la variabile a 0? Non capisco.

La soluzione quale sarebbe?

Grazie mille

MEMon
11-11-2009, 15:42
Spiegati meglio, scrivi codice vero per favore.

ForgottenSpirit
11-11-2009, 17:20
Spiegati meglio, scrivi codice vero per favore.
Credo di avere capito il problema: ogni volta che il file ajax chiama quella pagina php la variabile $accesso torna al valore 2 vero? (dichiarazione iniziale).

Il mio obbiettivo è lasciare invariate le modifiche a quella variabile (se un utente inserisce tutti i campi corretti, la variabile $accesso sarà 0).

C'è un modo per fare questo? tu come procederesti?

MEMon
11-11-2009, 17:23
Quando fai la chiamata ajax, fai in modo che il valore di ritorno comprenda la variabile $accesso.

ForgottenSpirit
11-11-2009, 17:37
Quando fai la chiamata ajax, fai in modo che il valore di ritorno comprenda la variabile $accesso.
A questo volevo arrivare, come faccio a tornare una variabile?
Mi posteresti un frammento di codice esemplificativo?

MEMon
11-11-2009, 17:42
Ti basta fare un echo della variabile :D

echo $accesso;


Il responseText conterrà il suo valore, in questo modo puoi gestire cosa far apparire(eventuali messaggi di errore, o immagini) a seconda del responso, evitando così di farlo via php e dover quindi "passare" del codice html.

ForgottenSpirit
11-11-2009, 17:53
Ti basta fare un echo della variabile :D

echo $accesso;


Il responseText conterrà il suo valore, in questo modo puoi gestire cosa far apparire(eventuali messaggi di errore, o immagini) a seconda del responso, evitando così di farlo via php e dover quindi "passare" del codice html.
Sì giusto :D

Senti e se io volessi ritornare sia $accesso che il messaggio html? E' possibile?
Una soluzione sarebbe concatenarle nell'echo, ma poi dovrei splittarle (ad esempio le concateno $accesso+html, mi prendo il primo carattere del responseText ed ho il valore della variabile accesso).

MEMon
11-11-2009, 18:24
Esattamente come hai detto, considera che sarà poi una stringa e non un valore numerico.

Sarebbe comunque una cosa un pò "sporca".

ForgottenSpirit
11-11-2009, 19:53
Esattamente come hai detto, considera che sarà poi una stringa e non un valore numerico.

Sarebbe comunque una cosa un pò "sporca".

Sì dovrei poi convertirla etc...

Altrimenti potrei fare solo con il return della variabile $accesso e poi da Ajax con una serie di controlli su questa mandare ai div l'HTML, come mi avevi consigliato tu sorpa.

In ogni caso adesso provo un po' di soluzioni, se ho ancora difficoltà riutilizzerò questo topic.

Grazie mille per l'assistenza ;)