[PHP] Elementi di un array non visualizzabili

alessandra86

Nuovo Utente
10 Mag 2018
16
0
1
37
Salve a tutti, questa è la mia prima discussione. Spero di aver inquadrato il titolo correttamente.
Non riesco a visualizzare tutti i codici che inserisco in dei form (creati dinamicamente), ma solo l'ultimo.
Ho il seguente codice, che serve per scegliere il numero di codici che dovrò inserire (e quindi di righe della tabella):

PHP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=windows-1250">     
    </head>
    <body>
        <form name="index" action="index_php.php" enctype="multipart/form-data" method="post">
            <br><br>   
            <p>Specifica il numero delle righe 
                <input type="number" name="n_righe" min="1" max="2000" value="1" >
            </p>
            <br><br>     
            <input type="submit" value="Clicca per proseguire">
            <input type=reset value="Cancella">
         </form>       
    </body>
</html>

Questo codice comunica con il file index_php.php, che posto qui sotto, su cui ho inserito dei commenti e serve a creare una tabella, con un numero di righe pari al numero che ho scelto.
PHP:
<?php
# Qui verrà presa la variabile del numero delle righe
if (isset($_POST['n_righe'])){$N_RIGHE=$_POST['n_righe']; }
?>
<form name="index" action="index_php_risultati.php" enctype="multipart/form-data" method="post">   
    <p>Scheda:</p>  
    <table border="1">          
        <tr>          
            <th><p>Codice:</p></th>      
        </tr>            
        <?php
        //ciclo che gira per tutte le righe, creando tanti input quante righe ho. Ho diversificato il name, aiutandomi col contatore {$i}
        for($i=0; $i<$N_RIGHE; $i++)
        {    ?>
        <tr>    
            <td><input type="text" name="codice{$i}" size="11" maxlength="11" value=""></td>      
        </tr>
        <?php
        }
        //Passero' l'imput del numero righe con hidden. Questo passaggio invia il numero di righe all'ultima pagina (risultati)
        echo "<br><input type='text' name='n_righe' value='{$i}'><br><br>";
        ?>      
    </table>
    <br><br><br>     
    <input type="submit" value="Invia">
    <input type=reset value="Cancella">         
 </form>

Infine, questo codice comunica con il file index_php_risultati.php, che posto qui sotto.
PHP:
<?php
//prendo il numero di righe, passate precedentemente dal comando echo "<br><input type='text' name='n_righe' value='{$i}'><br><br>";
if (isset($_POST['n_righe'])){$N_RIGHE=$_POST['n_righe']; }
//tentativo di visualizzare i tre codici
for($i=0; $i<$N_RIGHE; $i++)
{  
    //tentativo di prendere i codici che ho precedentemente inserito  :(
    if (isset($_POST['codice{$i}'])){$CODICE[$i]=$_POST['codice{$i}']; }
}
//ciclo che gira per tutte le righe che ho
for($i=0; $i<$N_RIGHE; $i++)
{
    //visualizza soltanto l'ultimo codice inserito :(
    echo "<br>CODICE =$CODICE[$i]<br>";
}
?>
Non riesco a visualizzare tutti i codici, ma solo l'ultimo. Dove sbaglio? Mi suggerite il codice corretto?
Grazie in anticipo.
 
Hai sagliato qui:
<tr>
<td><input type="text" name="codice{$i}" size="11" maxlength="11" value=""></td>
</tr>


Nel file index_php.php sostituisci quello che hai con questo:
PHP:
<?php
        //ciclo che gira per tutte le righe, creando tanti input quante righe ho. Ho diversificato il name, aiutandomi col contatore {$i}
        for($i=0; $i<$N_RIGHE; $i++)
        {    ?>
            <tr>
                <td><input type="text" name="codice[]" size="11" maxlength="11" value=""></td>
            </tr>
            <?php
        }
        //Passero' l'imput del numero righe con hidden. Questo passaggio invia il numero di righe all'ultima pagina (risultati)
        echo "<br><input type='text' name='n_righe' value='{$i}'><br><br>";
        ?>


Mentre nel file index_php_risultati.php cancella quello che hai scritto e metti questo:
PHP:
foreach ($_POST['codice'] as $item){
    echo "<br>CODICE =$item<br>";
}
 
  • Like
Reactions: alessandra86
Ci tengo particolarmente a pubblicare il codice seguente, perchè è l'evoluzione di quello che cercavo.
Di seguito il secondo file:
PHP:
<?php
# Qui verrà presa la variabile del numero delle righe
if (isset($_POST['n_righe'])){$N_RIGHE=$_POST['n_righe']; }
?>
<form name="index" action="index_php_risultati.php" enctype="multipart/form-data" method="post">     
    <p>Scheda:</p>   
    <table border="1">           
        <tr>           
            <th><p>Codice:</p></th>   
            <th><p>Codice2:</p></th>   
        </tr>             
        <?php
        //ciclo che gira per tutte le righe, creando tanti input quante righe ho. Ho diversificato il name, aiutandomi col contatore {$i}
        for($i=0; $i<$N_RIGHE; $i++)
        {    ?>
        <tr>     
            <td><input type="text" name="codice[]" size="11" maxlength="11" value=""></td>
            <td><input type="text" name="codicepari[]" size="11" maxlength="11" value=""></td>               
         </tr>
        <?php
        }
        //Passero' l'imput del numero righe con hidden. Questo passaggio invia il numero di righe all'ultima pagina (risultati)
        echo "<br><input type='text' name='n_righe' value='{$i}'><br><br>";
        ?>       
    </table>   
    <br><br><br>     
    <input type="submit" value="Invia">
    <input type=reset value="Cancella">           
 </form>


e il terzo:

PHP:
<?php
// prendo il numero di righe, passate precedentemente dal comando echo "<br><input type='text' name='n_righe' value='{$i}'><br><br>";
if (isset($_POST['n_righe'])){$N_RIGHE=$_POST['n_righe']; }
//array dei box compilati e stampa elementi
$array = array();
$array= ($_POST['codice']);
foreach ($_POST['codice'] as $item){echo "<br>CODICE_DISPARI =$item<br>";}
$array2 = array();
$array2= ($_POST['codicepari']);
foreach ($_POST['codicepari'] as $item){echo "<br>CODICE_PARI =$item<br>";}
//ciclo for che stampa tutto quello che ho inserito nei box
for($i=0; $i<$N_RIGHE; $i++)
{
        echo "<br>CODICE DISPARI =$array[$i], CODICE PARI=$array2[$i]   <br>";
}



?>

Ho praticamente aggiunto un'altra colonna, messo tutti i valori in un array e tirato fuori assieme le coppie di valori. Sicuramente c'è un modo più elegante e soprattutto efficiente per farlo e se qualcuno vuole darmi suggerimenti mi farebbe molto piacere. Intanto ancora grazie!
 
Creando una struttura variabile......

index_php.php
PHP:
<form name="index" action="index_php_risultati.php" enctype="multipart/form-data" method="post">
    <p>Scheda:</p>
    <table border="1">
        <tr>
        <?php
       //array di variabili per gli input e intestazioni
        $ar_val=['codice','codicepari'];

        foreach ($ar_val as $item){
            ?>
                <th>
                    <?php echo $item;?>
                </th>
            <?php
        }

        ?></tr><?php

        //ciclo che gira per tutte le righe, creando tanti input quante righe ho. Ho diversificato il name, aiutandomi col contatore {$i}
        for($i=0; $i<$N_RIGHE; $i++)
        {    ?>
            <tr>
                <?php

                foreach ($ar_val as $items){
                    ?>
                    <td><input type="text" name="<?php echo$items;?>[]" size="11" maxlength="11" value=""></td>
                <?php
                }
                ?>

            </tr>
            <?php
        }
//ho eliminato il numero di righe che non serve
        ?>
    </table>
    <br><br><br>
    <input type="submit" value="Invia">
    <input type=reset value="Cancella">
</form>

Nel file index_php_risultati.php
Fai cosi:
PHP:
//recupero tutte le chiavi passate
$keys=array_keys($_POST);

//ciclo sulla prima chiave in quanto saranno sempre uguali a meno di manipolazione dom
foreach ($_POST[$keys[0]] as $items){

//ciclo sulle chiavi
    foreach ($keys as $key){
        echo "$key = $items ; ";
    }
    echo '<br><br>';
}
Per completezza ti invito a leggere come utilizzare correttamente l'html tramite un template engine:
QUI così da non mischiare php e html....! ;)
 
  • Like
Reactions: alessandra86
Mamma mia complimenti! Non ci sarei mai arrivata a farlo così! Solo una cosa, credo sia una svista tua: ottengo come output questo:
codice = 1 ; codicepari = 1 ;
codice = 3 ; codicepari = 3 ;
codice = 5 ; codicepari = 5 ;
Ma io vorrei ottenere questo:
codice = 1 ; codicepari = 2;
codice = 3 ; codicepari = 4 ;
codice = 5 ; codicepari = 6 ;
Ci ho provato a smanettare, ma ovviamente manco mi avvicino al risultato :oops::rolleyes:
In questo modo poi come potrei ottenere delle variabili con cui (ciclando opportunamente con un for che gira per tutte le righe) potrei poi fare delle insert? lo scopo di tutto è infilare tutta la tabella in un database, riga per riga (basta anche un suggerimento o teoria da guardare). Comunque un while che looppa di grazie!
 
Non è una svista, non so l'output.... come deve uscire?


Visto solo ora.....
PHP:
$keys=array_keys($_POST);

$my_queries=[];



foreach ($_POST[$keys[0]] as $k=>$items){

    $my_queries[$k]='INSERT INTO TABLE_NAME ('.join(',',$keys).') VALUES (';
    foreach ($keys as $key){
        $my_queries[$k].='"'.trim($_POST[$key][$k]).'",';
    }
    $my_queries[$k]=substr($my_queries[$k],0,strlen($my_queries[$k])-1).');';
}

print_r($my_queries);
 
Ultima modifica:
  • Like
Reactions: alessandra86
Oddio si scusa, non ho specificato cosa ho fatto per fare uscire quell'output. In pratica ho impostato il numero di righe a 3 e ho poi scelto, a titolo di esempio, dei numeri da 1 a 6, dunque l'output dovrebbe visualizzare una riga della tabella per volta.
Nella prima riga ho 1 e 2, nella seconda 3 e 4, nella terza 5 e 6.
La logica di queste tre paginette è creare una tabella con molte colonne (nel codice ne ho messe solo due per semplicità) in cui un utente può specificare il numero delle righe a piacere e compilare così man mano tutta la tabella. I dati poi dovrebbero essere messi in un database. Ho provato a farlo cercando di mettere almeno una riga della tabella per default e poi con un bottone aggiungi man mano avrei permesso la compilazione, ma non essendoci riuscita ho optato per far decidere subito il numero di righe.
 

Discussioni simili