Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
PHP - Generare variabili con ciclo do
Forum - PHP - Generare variabili con ciclo do

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
alfredom15 (Normal User)
Newbie


Messaggi: 12
Iscritto: 01/03/2014

Segnala al moderatore
Postato alle 10:32
Sabato, 01/03/2014
Salve , sono un ragazzo di 19 anni con la passione per la programmazione , e dopo aver approfondito il c++ , il basic e il java, da poco mi sono affacciato al mondo del php. Ora mi e' sorto un problema quasi banale : ho tre pagine in php , la prima fa inserire un numero cui la pagina dopo troviamo N textbox quante il numero scritto in precedenza. Ora dentro queste textbox autogenerate va inserito un valore che verrà richiamato nella pagina 3.
Siccome le textbox potrebbero anche essere 1000, come faccio ad evitare di scrivere tutto il codice a mano , ma bensì inserire in un ciclo che ad esempio attribuisca una variabile incrementata (non so se sia possibile , per questo chiedo) finchè non si raggiunge il numero delle textbox (ad esempio :

Codice sorgente - presumibilmente PHP

  1. <?php
  2. $a="a";
  3. $cont=0;
  4. do
  5. {
  6. $a=$_POST[$(nome textbox)]
  7. $a++;
  8. $cont++
  9. $(nome textbox)++;
  10. }
  11. while(cont <= $(numero inserito all' inizio)




Ecco il codice che utilizzo adesso


Codice sorgente - presumibilmente Plain Text

  1. <?php
  2. session_start();
  3. if($_SESSION['primo']=1)
  4. {
  5. $a = $_POST['a'];
  6. }
  7. if($_SESSION['primo']=2)
  8. {
  9. $a = $_POST['a'];
  10. $b = $_POST['b'];
  11. }
  12. if($_SESSION['primo']=3)
  13. {
  14. $a = $_POST['a'];
  15. $b = $_POST['b'];
  16. $c = $_POST['c'];
  17. }
  18. if($_SESSION['primo']=4)
  19. {
  20. $a = $_POST['a'];
  21. $b = $_POST['b'];
  22. $c = $_POST['c'];
  23. $d = $_POST['d'];
  24. }
  25. if($_SESSION['primo']=5)
  26. {
  27. $a = $_POST['a'];
  28. $b = $_POST['b'];
  29. $c = $_POST['c'];
  30. $d = $_POST['d'];
  31. $e = $_POST['e'];
  32. }
  33. ECC ECC



Spero di essere stato chiaro , e grazie in anticipo.

PM Quote
Avatar
GN (Member)
Guru


Messaggi: 772
Iscritto: 30/04/2011

Segnala al moderatore
Postato alle 14:05
Sabato, 01/03/2014
Se ho capito bene cosa intendi fare, io farei così (senza ricorrere alle sessioni):
pagina1.php:
Codice sorgente - presumibilmente Plain Text

  1. <form method="GET" action ="pagina2.php">
  2.   Numero:<input name="n" type="text">
  3.   <input type="submit" value="Avanti"></input>
  4. </form>


pagina2.php:
Codice sorgente - presumibilmente Plain Text

  1. <form method="POST" action="pagina3.php">
  2.   <?php
  3.     for($i=0; $i < $_GET['n']; $i++){
  4.       echo '<input name="' + $i + '" type="text">';
  5.     }
  6.   ?>
  7.   <input type="submit" value="Avanti"></input>
  8. </form>


pagina3.php:
Codice sorgente - presumibilmente PHP

  1. <?php
  2. foreach($_POST as $i => $valore){
  3.   //qui puoi eseguire le operazioni, $valore è l'$i-esimo valore inserito.
  4. }
  5. ?>


PM Quote
Avatar
alfredom15 (Normal User)
Newbie


Messaggi: 12
Iscritto: 01/03/2014

Segnala al moderatore
Postato alle 11:54
Lunedì, 03/03/2014
Il codice funziona bene, grazie mille.

Ora però ho un problema : Volendo moltiplicare i valori dentro le text ho fatto cosi'
Codice sorgente - presumibilmente PHP

  1. foreach($_POST as $i => $valore){
  2. $ris=$ris*$valore;
  3. echo "<br>$ris";
  4.  //qui puoi eseguire le operazioni, $valore è l'$i-esimo valore inserito.
  5. }



(Ho messo l' echo per capire meglio l' errore)
Alla fine del calcolo mette sempre uno 0 finale , annullando l' operazione stessa.

Codice sorgente - presumibilmente Plain Text

  1. (es. 2
  2. 4
  3. 8
  4. 16
  5. 32
  6. 64
  7. 128
  8. 256
  9. 512
  10. 1024
  11. 0)



Come posso risolvere? grazie ancora per l' aiuto.

Se invece metto l' operatore "+" mi ripete l' ultimo numero

Codice sorgente - presumibilmente Plain Text

  1. (es.3
  2. 5
  3. 7
  4. 9
  5. 11
  6. 13
  7. 15
  8. 17
  9. 19
  10. 21
  11. 23
  12. 25
  13. 25)


Ultima modifica effettuata da alfredom15 il 03/03/2014 alle 12:10
PM Quote
Avatar
Uno sciame di API (Member)
Pro


Messaggi: 66
Iscritto: 10/07/2012

Segnala al moderatore
Postato alle 13:42
Lunedì, 03/03/2014
Forse perché non assegni un valore a $ris (che quindi vale 0) quando moltiplichi la variabile $ris per $valore.
Prova, prima del ciclo foreach, a scrivere:
Codice sorgente - presumibilmente Plain Text

  1. $ris=1;


Ciao :)

PM Quote
Avatar
alfredom15 (Normal User)
Newbie


Messaggi: 12
Iscritto: 01/03/2014

Segnala al moderatore
Postato alle 16:17
Lunedì, 03/03/2014
No , purtroppo il problema me lo da con la variabile già settata a
$ris=1;

Grazie lo stesso :)

PM Quote
Avatar
Qwertj (Dev Team)
Guru


Messaggi: 678
Iscritto: 30/05/2011

Segnala al moderatore
Postato alle 17:20
Lunedì, 03/03/2014
Stai iterando su $_POST, probabilmente c'è una chiave a cui corrisponde un valore non numerico che casta a 0 quando lo converti
Non iterare direttamente su $_POST. :nono:
Codice sorgente - presumibilmente Plain Text

  1. $i = 0;
  2. while(isset($_POST[++$i])) {
  3.     //htmlspecialchars() filtra quei caratteri che potrebbero essere intepretati come HTML (<,>, &, ecc...)
  4.     echo "nella casella di testo $i hai scritto " . htmlspecialchars($_POST[$i]);
  5. }


Una cosa più sensata sarebbe settare name negli <input> come se fossero elementi di un array
Codice sorgente - presumibilmente Plain Text

  1. <form method="POST" action="pagina3.php">
  2.   <?php
  3.     for($i=0; $i < $_GET['n']; $i++){
  4.       echo '<input name="textbox[' + $i + ']" type="text">';
  5.     }
  6.   ?>
  7.   <input type="submit" value="Avanti"></input>
  8. </form>


PHP interpreta automaticamente questa notazione e la converte in un array i cui elementi sono i valori dei <input>
Codice sorgente - presumibilmente Plain Text

  1. //primo elemento
  2. $_POST["textbox"][0];
  3. //secondo elemento
  4. $_POST["textbox"][1];
  5. //ecc..


Quindi il codice di sopra diventerebbe
Codice sorgente - presumibilmente Plain Text

  1. $i = 0;
  2. while(isset($_POST["textbox"][++$i])) {
  3.     echo "nella casella di testo $i hai scritto " . htmlspecialchars($_POST["textbox"][$i]);
  4. }


PM Quote
Avatar
alfredom15 (Normal User)
Newbie


Messaggi: 12
Iscritto: 01/03/2014

Segnala al moderatore
Postato alle 20:17
Lunedì, 03/03/2014
Grazie per l' aiuto , ora è perfetto , ho fatto una semplice modifica dal tuo codice:
Così come l' hai scritto tu creava tante text quante scritte dall' utente  ,però nel momento della stampa dei valori (dato che i=0) escludeva la prima textbox , allora ho risolto in questo modo .

DA

Codice sorgente - presumibilmente Plain Text

  1. for($i=0; $i < $_GET['n']; $i++){


A
Codice sorgente - presumibilmente Plain Text

  1. for($i=1; $i <= $_GET['primo']; $i++){



Grazie mille :k:

PM Quote
Avatar
alfredom15 (Normal User)
Newbie


Messaggi: 12
Iscritto: 01/03/2014

Segnala al moderatore
Postato alle 13:01
Martedì, 04/03/2014
Ora mi e' sorto un dubbio , se io all' inizio inserisco due text di acquisizione , in cui la prima mi genera una textbox , e il secondo , una coppia di textbox (es. alla prima l' utente scrive 5 , e alla seconda 3 , vengono create 5 textbox + 3 coppie (quindi 6) di textbox) , ho provato ad usare due indici per il ciclo con questa istruzione (inizia da "seconda acquisizione") però mi ripete due volte il comando.

Codice sorgente - presumibilmente Php

  1. //***************************************PRIMA ACQUISIZIONE ***************************************
  2.  
  3.   if ($_GET['primo'] > 0)
  4.   {
  5.   echo "<hr>";
  6.     for($i=1; $i <= $_GET['primo']; $i++){
  7.         echo "Inserisci il $i valore della fissa<br>";
  8.       echo '<input name="valorea['.$i.']" type="text" value="1.00"><br>';
  9.     }
  10.         }
  11.                         elseif($_GET['primo'] ==0)
  12.         {}
  13.         else
  14.         {
  15.         echo "Inserisci un valore corretto.<br>";
  16.         }
  17.        
  18.        
  19.        
  20.        
  21.          //**********************************SECONDA  ACQUISIZIONE ***************************************
  22.        
  23.           if ($_GET['secondo'] > 0)
  24.   {
  25.   echo "<hr>";
  26.   for($j=1; $j<= $_GET['secondo']; $j++){
  27.     for($i=1; $i <= $_GET['secondo']; $i++){
  28.         echo "Inserisci i valori della $i doppia <br> ";
  29.      echo '<input name="valoreb['.$i.']" type="text" value="2.00"><br>';
  30.           echo '<input name="valoreb['.$j.']" type="text" value="3.00"><br>';
  31.           }
  32.         }
  33.         }
  34.         elseif($_GET['secondo'] ==0)
  35.         {
  36.         }
  37.         else {
  38.         echo "Inserisci un valore corretto.<br>";
  39.         }




Ad esempio se inserisco 2 alla prima text e 2 alla seconda mi esce quori questo :

Codice sorgente - presumibilmente Plain Text

  1. Inserisci il 1 valore della fissa
  2. [textbox]
  3.  
  4. Inserisci il 2 valore della fissa
  5. [textbox]
  6.  
  7. Inserisci i valori della 1 doppia
  8. [textbox]
  9.  
  10. Inserisci i valori della 2 doppia
  11. [textbox]
  12.  
  13. Inserisci i valori della 1 doppia
  14. [textbox]
  15.  
  16. Inserisci i valori della 2 doppia
  17. [textbox]



Come posso risolvere?

Ultima modifica effettuata da alfredom15 il 04/03/2014 alle 13:02
PM Quote
Avatar
Qwertj (Dev Team)
Guru


Messaggi: 678
Iscritto: 30/05/2011

Segnala al moderatore
Postato alle 18:03
Martedì, 04/03/2014
Perchè parti da 1? In PHP (e circa in ogni linguaggio di programmazione), gli array sono 0-based

In quanto al secondo problema... Perchè iteri due volte su $_GET['secondo']? Così scrivi N^2 <input>! :noway:

Io avrei scritto molto semplicemente
Codice sorgente - presumibilmente Php

  1. //prima acquisizione
  2. if ($_GET['primo'] > 0) {
  3.         echo "<hr>";
  4.         for($i = 0; $i <= (int)$_GET['primo']; ++$i) {
  5.                 echo "Inserisci il $i valore della fissa<br>",
  6.                          '<input name="valorea[', $i, ']" type="text" value="1.00"><br>';
  7.         }
  8. } elseif((int)$_GET['primo']) { //valuta a vero se != da zero
  9.         echo "Inserisci un valore corretto.<br>";
  10. }
  11.  
  12. //seconda acquisizione      
  13. if ((int)$_GET['secondo'] > 0) {
  14.         echo "<hr>";
  15.         for($i = 0; $j <= (int)$_GET['secondo']; ++$j){
  16.                 echo "Inserisci i valori della $i doppia <br> ",
  17.                          '<input name="valoreb[',$i,'][0]" type="text" value="2.00"><br>',
  18.                          '<input name="valoreb[',$i,'][1]" type="text" value="3.00"><br>';
  19.         }
  20. } elseif((int)$_GET['secondo']) { //valuta a vero se != da zero
  21.         echo "Inserisci un valore corretto.<br>";
  22. }



Gli <input> "doppi" sono a loro volta array, che puoi accedere poi come un array qualsiasi
Altrimenti vai a sovrascrivere altri valoreb[$i] e viene fuori un caos assurdo e grazie che non funziona nulla

(Hai fatto un corso per indentare il codice così? :-|)

PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo