Discussione:
Somma variabili da form
(troppo vecchio per rispondere)
Tastaglione
2004-07-07 15:37:29 UTC
Permalink
Ciao a tutti,
vi dico qual'è il problema che non riesco a risolvere:

Una pagina php mi genera una lista di righe in una tabella con delle voci,
ognuna delle quali ha un campo di tipo checkbox che contiene il prezzo.
Il checkbox ha come id l'id del record e come valore quello assegnato in
fase di inserimento del record.


Quello che vorrei è che il valore dei checkbox selezionati vengano sommati
per darmi il totale, magari inviando le variabili ad un'altra pagina php.

Come fare?

Grazie per ogni eventuale suggerimento.

Ciao.
Francesco.
Asso
2004-07-07 15:47:48 UTC
Permalink
Post by Tastaglione
Quello che vorrei è che il valore dei checkbox selezionati vengano sommati
per darmi il totale, magari inviando le variabili ad un'altra pagina php.
Come fare?
nella pagina del form

<form action=calcola.php method=post>
<input type=checkbox name=listaspesa[] value='40,23'>
<input type=checkbox name=listaspesa[] value='51.25'>
<input type=checkbox name=listaspesa[] value='9.69'>
<input type=checkbox name=listaspesa[] value='8.43'>
</form>
una riga per ogni prezzo da selezionare

nella pagina seguente

<?
$listaspesa = HTTP_POST_VARS[$listaspesa];
foreach ($listaspesa as $oggetto) {
$somma = $somma + $oggetto;
}

print "In totale hai speso $somma";
?>


Bada però che questa soluzione non trasporta alcuna informazioni su quali
siano gli oggetti da acquistare.

Il mio consiglio è quello di trasmettere alla pagina il codice del prodotto
da acquistare e di fare estrarre il prezzo dal database nella pagina che
compie il calcolo.

Considera anche che se metti i prezzi nell'html tutti quelli un po' scafati
potranno mettere trasmettere ordini per 0,01 ? semplicemente trasmettendo
alla tua pagina di calcolo un post con i prezzi scelti a piacere.
stefano
2004-07-07 16:09:38 UTC
Permalink
Post by Asso
nella pagina del form
<form action=calcola.php method=post>
<input type=checkbox name=listaspesa[] value='40,23'>
<input type=checkbox name=listaspesa[] value='51.25'>
<input type=checkbox name=listaspesa[] value='9.69'>
<input type=checkbox name=listaspesa[] value='8.43'>
</form>
una riga per ogni prezzo da selezionare
nella pagina seguente
<?
$listaspesa = HTTP_POST_VARS[$listaspesa];
foreach ($listaspesa as $oggetto) {
$somma = $somma + $oggetto;
forse è meglio così:
array_sum($_POST['listaspesa'])


stefano
Nicoletta
2004-07-07 16:29:28 UTC
Permalink
Asso <***@tis-providersardo-cali.it> wrote:

<snip>
Post by Asso
Considera anche che se metti i prezzi nell'html tutti quelli un po' scafati
potranno mettere trasmettere ordini per 0,01 ? semplicemente trasmettendo
alla tua pagina di calcolo un post con i prezzi scelti a piacere.
Scusa Asso, ma come è possibile? Non che voglia conoscere il "trucco",
anzi, se sei certo che esista ti prego di non farne accenno, credo sia
proprio meglio.

La mia domanda è un'altra e attiene - casomai - alla possibilità di
stare tranquilli qualora si presenti un'esigenza analoga a quella di
Tastaglione.

Se nell'html ho il checkbox col suo valore, il method è post, nella
pag.php che elabora i dati metto un bel REQUEST_METHOD == 'POST'
(intendo prima di eleborarli, ed eventualmente per rifiutarne
l'elaborazione), sei sicuro che lo scafato di turno riesca ad aggirare
l'ostacolo?

Vorrei solo lavorare serena :)
--
Nicoletta
Setec Astronomy
2004-07-07 16:44:03 UTC
Permalink
Post by Nicoletta
Se nell'html ho il checkbox col suo valore, il method è post, nella
pag.php che elabora i dati metto un bel REQUEST_METHOD == 'POST'
(intendo prima di eleborarli, ed eventualmente per rifiutarne
l'elaborazione), sei sicuro che lo scafato di turno riesca ad aggirare
l'ostacolo?
Si, e' possibile e facile, basta conoscere l'HTML e l'HTTP.
--
I am what I am, I do what I can
L'uomo, conscio di sbagliare, persevera.
Asso
2004-07-07 17:23:15 UTC
Permalink
Post by Nicoletta
Scusa Asso, ma come è possibile? Non che voglia conoscere il "trucco",
anzi, se sei certo che esista ti prego di non farne accenno, credo sia
proprio meglio.
Nessun trucco, solo un po' di conoscenza di come le informazioni viaggiano
in HTTP.
Tra l'altro, i trucchi bisogna diffonderli, perchè l'ignoaranza è la
migliore complice dei malintenzionati.
Post by Nicoletta
Se nell'html ho il checkbox col suo valore, il method è post, nella
pag.php che elabora i dati metto un bel REQUEST_METHOD == 'POST'
(intendo prima di eleborarli, ed eventualmente per rifiutarne
l'elaborazione), sei sicuro che lo scafato di turno riesca ad aggirare
l'ostacolo?
Quello che dico è che non ci si può fidare di ricevere i prezzi dal form, in
quanto il metodo di trasmissione è ben visibile nel codice sorgente della
pagina.

Facciamo conto che tu mi devi spedire un Renoir e che il prezzo te lo fai
inviare da un form così.

<form action="acquista.php" method="post">
<input type=hidden name=prezzo value=1000000>
<input type=submit value=acquista>

Il codice html del tuo form è perfettamente visibile facendo
Visualizza->HTML dal browser. Quindi ora so come tu ricevi le informazioni
sul prezzo della merce da spedire.
Cosa mi impedisce di scrivere un form identico al tuo e di azionarlo dal mio
desktop, sostituendo il valore di un milione con 10 euro?

Questo discorso vale per un sacco di altri esempi. I dati segreti o quelli
che non vogliamo siano modificabili dall'utente non devono essere messi
dentro ai form.
Nicoletta
2004-07-07 18:10:35 UTC
Permalink
Post by Asso
Il codice html del tuo form è perfettamente visibile facendo
Visualizza->HTML dal browser. Quindi ora so come tu ricevi le informazioni
sul prezzo della merce da spedire.
Cosa mi impedisce di scrivere un form identico al tuo e di azionarlo dal mio
desktop, sostituendo il valore di un milione con 10 euro?
Io sapevo che i dati di un form (con method post) non vengono accettati
se la pagina d'invio non è sullo stesso dominio di quella ricevente.
Ecco perché non capivo. Del resto non ho mai fatto esperimenti in
merito, mi fidavo di un'informazione letta su qualche manuale e presa
per buona. Evidentemente era poco buona :)

E di una protezione di questo tipo che ne pensi?

$url_R="form.htm";
$url_A="http://". $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF'])
. "/" . $urlR;

if ($_SERVER['HTTP_REFERER'] == $url_A) {
// lavoro, altrimenti no

Non badare a possibili errori sintattici, parlo di sostanza. Ritieni che
il furbacchione sappia far fronte anche a questo? (La domanda è rivolta
a tutti, naturalmente). Se mi dite di sì mi metto a piangere ;-)
--
Nicoletta
Setec Astronomy
2004-07-07 19:13:54 UTC
Permalink
Post by Nicoletta
Io sapevo che i dati di un form (con method post) non vengono
accettati se la pagina d'invio non è sullo stesso dominio di quella
ricevente.
Mai sentita, ti ricordi dove l'hai letta di preciso?
Post by Nicoletta
E di una protezione di questo tipo che ne pensi?
[cut]
Post by Nicoletta
Ritieni che il furbacchione sappia far fronte anche a questo?
Si, e comunque:

[quoto http://www.php.net/manual/en/reserved.variables.php]
'HTTP_REFERER'
The address of the page (if any) which referred the user agent to the
current page. This is set by the user agent. Not all user agents will
set this, and some provide the ability to modify HTTP_REFERER as a
feature. In short, it cannot really be trusted.
[/quoto]
--
I am what I am, I do what I can
L'uomo, conscio di sbagliare, persevera.
Nicoletta
2004-07-08 00:07:39 UTC
Permalink
Post by Setec Astronomy
Post by Nicoletta
Io sapevo che i dati di un form (con method post) non vengono
accettati se la pagina d'invio non è sullo stesso dominio di quella
ricevente.
Mai sentita, ti ricordi dove l'hai letta di preciso?
Assolutamente no. Ho appena sfogliato gli indici dei miei libri di casa
e non sembra ve ne sia traccia, ho fatto una ricerca con google per
vedere se ne parla qualche tutorial: niente da fare (o comunque, chi lo
sa, c'è talmente tanta di quella roba in rete), insomma, mi sta venendo
il sospetto di essermi fatta quell'idea prendendo fischi per fiaschi. Ma
è strano, perché se è vero che è poco più di un anno che mi sono tuffata
nell'HTML, PHP e Javascript (e dunque ho anche molta confusione in
testa), di solito quando memorizzo, memorizzo bene. Può darsi che in
questo caso abbia memorizzato male; a volte faccio anche dei bei casini,
non lo nego.
Post by Setec Astronomy
Post by Nicoletta
Ritieni che il furbacchione sappia far fronte anche a questo?
Maremma! Non c'è verso di stare tranquilli. L'unica sembra davvero
quella suggerita da Asso: usare i dati dell'html solo per mostrarli
all'utente, per il resto servirsi di un database.

Alla prossima :)
--
Nicoletta
Asso
2004-07-08 08:31:47 UTC
Permalink
Post by Nicoletta
if ($_SERVER['HTTP_REFERER'] == $url_A) {
// lavoro, altrimenti no
Non badare a possibili errori sintattici, parlo di sostanza. Ritieni che
il furbacchione sappia far fronte anche a questo? (La domanda è rivolta
a tutti, naturalmente). Se mi dite di sì mi metto a piangere ;-)
Quella del REFERER è una informazione che il browser invia assieme alla
richiesta HTTP. Come tale può essere emulata.

Cioè con un semplice header() di php posso far credere al tuo server che la
pagina sia stata caricata da un'altra pagina del tuo sito.

La morale è: non fidarti mai di ciò che ti arriva via HTTP, anche se ce
l'hai messo tu pochi attimi prima.

Tastaglione
2004-07-07 16:44:10 UTC
Permalink
Sono d'accordo sull'utilità di "trasmettere" anche gli id dei prodotti come
dici tu, ma solo quelli relativi alle checkbox selezionati!!!
Quindi il problema è: come var visualizzare solo gli id selezionati? Se ci
riuscissi non sarebbe nemmeno necessario sommare i valori dei checkbox, ma
sommando semplicemente il prezzo memorizzato nel campo prezzo nella tabella
in database corrispondente all'articolo.
Quest'ultima soluzione per me sarebbe ancora meglio che visualizzare solo il
valore somma totale.

Grazie.
Post by Asso
Post by Tastaglione
Quello che vorrei è che il valore dei checkbox selezionati vengano sommati
per darmi il totale, magari inviando le variabili ad un'altra pagina php.
Come fare?
nella pagina del form
<form action=calcola.php method=post>
<input type=checkbox name=listaspesa[] value='40,23'>
<input type=checkbox name=listaspesa[] value='51.25'>
<input type=checkbox name=listaspesa[] value='9.69'>
<input type=checkbox name=listaspesa[] value='8.43'>
</form>
una riga per ogni prezzo da selezionare
nella pagina seguente
<?
$listaspesa = HTTP_POST_VARS[$listaspesa];
foreach ($listaspesa as $oggetto) {
$somma = $somma + $oggetto;
}
print "In totale hai speso $somma";
?>
Bada però che questa soluzione non trasporta alcuna informazioni su quali
siano gli oggetti da acquistare.
Il mio consiglio è quello di trasmettere alla pagina il codice del prodotto
da acquistare e di fare estrarre il prezzo dal database nella pagina che
compie il calcolo.
Considera anche che se metti i prezzi nell'html tutti quelli un po' scafati
potranno mettere trasmettere ordini per 0,01 ? semplicemente trasmettendo
alla tua pagina di calcolo un post con i prezzi scelti a piacere.
Setec Astronomy
2004-07-07 16:52:03 UTC
Permalink
Post by Tastaglione
come var visualizzare solo gli id selezionati?
Non capisco bene il problema.

<form action="<?php print ($_SERVER['PHP_SELF']); ?>" method="post">
<input name="id[1]" type="checkbox" value="1" />
<input name="id[2]" type="checkbox" value="1" />
<input name="id[3]" type="checkbox" value="1" />
<input name="id[4]" type="checkbox" value="1" />
<input name="id[5]" type="checkbox" value="1" />
<input type="submit" value="Invia" />
</form>
<pre>
<?php
print_r ($_POST);
if (isset ($_POST['id'])) {
foreach ($_POST['id'] as $key => $value) {
print ("Chiave $key, valore $value \r\n");
}
}
?></pre>

oppure

<form action="<?php print ($_SERVER['PHP_SELF']); ?>" method="post">
<input name="id[]" type="checkbox" value="1" />
<input name="id[]" type="checkbox" value="2" />
<input name="id[]" type="checkbox" value="3" />
<input name="id[]" type="checkbox" value="4" />
<input name="id[]" type="checkbox" value="5" />
<input type="submit" value="Invia" />
</form>
<pre>
<?php
print_r ($_POST);
if (isset ($_POST['id'])) {
foreach ($_POST['id'] as $key => $value) {
print ("Chiave $key, valore $value \r\n");
}
}
?></pre>

a seconda se hai la necessita' di passare 2 valori per ogni checkbox.

P.S.
Please http://wiki.news.nic.it/QuotarBene
--
I am what I am, I do what I can
L'uomo, conscio di sbagliare, persevera.
Continua a leggere su narkive:
Loading...