Invio di array tramite POST

di il
14 risposte

Invio di array tramite POST

Buon giorno a tutti, sono un nuovo iscritto ma vi seguo da tanto, ho approfittato per risolvere i mie problemi leggendo i vostri post senza aver bisogno di dover chiedere e di questo vi ringrazio moltissimo. ora mi trovo in una situazione diciamo "imbarazzante" ed eccomi qui a chiedere aiuto.

ho una pagina php dove all'interno di una <form></form> creo una tabella html da dati prelevati da una tabella mysql
l'ultima cella contiene una checkbox con nome xx[] ed a cui come valore associo alcuni dati della tabella

<tr>
	<td>
		<?php   echo "<input type=checkbox   name='pro[]' value=".$cod_pro."|".$mese."|".$anno.">"; ?>
		<?php echo $i."-".$cod_pro."-".$mese."-".$anno; ?>
	</td>
</tr>
successivamente alla pressione di un tasto invio i dati tramite il metodo POST ad un'altra pagina php che legge i valori all'interno dell'array che contiene esclusivamente i valori delle checkbox spuntate ed esegue delle operazioni.

Ora il mio problema è che se l'indice della checbox è inferiore a 82 il programma funziona perfettamente se invece è superiore non vengono inviate,o per lo meno nell'array non vengono inserite. ora mi direte come fai ad essere sicuro che si blocchi proprio in quel punto?
Nella pagina di ricezione ho fatto un semplice ciclo for per stampare i valori dell'array

$riga = $_POST['pro'];
print_r($riga);
echo "<br>";
for ($i=0;$i<count($riga);$i++) {
    $dati = explode("|",$riga[$i]);
    $cod_pro =$dati[0];
    $mese_pro=$dati[1];
    $anno_pro=$dati[2];
    echo "Record ".$i;
    echo "   Codice Progetto = ".$cod_pro;
    echo "   Mese Progetto = ".$mese_pro;
    echo "   Anno Progetto = ".$anno_pro."<br>";
 }
sia utilizzando print_r() che "spacchettando" i valori, in entrambi i casi il risultato è il medesimo.

Sicuramente devo aver commesso qualche "stron...." ma non riesco proprio a venirne a capo se mi potete aiutare ve ne sarei veramente grato.

14 Risposte

  • Re: Invio di array tramite POST

    Ciao,

    cosa intendi per "indice della checkbox inferiore a 82"?

    Se spunti 81 checkbox funziona, invece se ne spunti di più non ti invia nulla? E ti da qualche errore o avviso? Ovviamente devi avere attiva la visualizzazione di tutti gli errori, compresi i warning.

    Per fare debug veloci ti consiglio di utilizzare var_dump() e non print_r().
  • Re: Invio di array tramite POST

    Grazie per l'interessamento ... sinceramente sono stupito anche io.. mi spiego meglio:
    durante la creazione della tabella all'array vengono assegnati nome e relativo valore contenuto
    pro[0] => variabile
    pro[1] => variabile
    pro[2] => variabile
    .....
    pro[n] => variabile

    invio tramite POST

    nel ciclo for mi stampa solo fino all' 82° elemento anche se ne o spuntati di più

    è un comportamento anomalo ed è la prima volta che mi capita, sicuramente commetto qualche errore ma non riesco proprio a vederlo.
    Giusto la visualizzazione degli errori ... dato che funzionava anche se parzialmente pensavo a qualche errore logico/sintattico
    grazie per la dritta
  • Re: Invio di array tramite POST

    Per essere più preciso vi faccio vedere l'output della pagina di ricezione
    array(83) { [0]=> string(23) "18171-4107-2018|02|2019" [1]=> string(23) "18303-5137-2018|02|2019" [2]=> string(23) "18558-5137-2019|02|2019" [3]=> string(23) "18144-4340-2018|02|2019" [4]=> string(23) "18312-5093-2018|02|2019" [5]=> string(23) "18510-5131-2019|02|2019" [6]=> string(23) "18462-4218-2019|02|2019" [7]=> string(23) "18530-5170-2019|02|2019" [8]=> string(23) "17949-4609-2018|02|2019" [9]=> string(23) "18450-4609-2019|02|2019" [10]=> string(23) "18346-4407-2018|02|2019" [11]=> string(23) "18198-5023-2018|02|2019" [12]=> string(22) "18475-817-2019|02|2019" [13]=> string(23) "18448-1936-2019|02|2019" [14]=> string(23) "18503-3831-2019|02|2019" [15]=> string(23) "18334-4395-2018|02|2019" [16]=> string(23) "18295-5050-2018|02|2019" [17]=> string(23) "18217-4209-2018|02|2019" [18]=> string(23) "18278-4980-2018|02|2019" [19]=> string(23) "18474-5094-2019|02|2019" [20]=> string(23) "18261-5094-2018|02|2019" [21]=> string(23) "18435-1612-2019|02|2019" [22]=> string(23) "18406-3894-2018|02|2019" [23]=> string(23) "18365-5003-2018|02|2019" [24]=> string(22) "18313-834-2018|02|2019" [25]=> string(23) "18375-5155-2018|02|2019" [26]=> string(23) "18414-4258-2018|02|2019" [27]=> string(23) "15858-4444-2016|02|2019" [28]=> string(23) "18439-4444-2019|02|2019" [29]=> string(23) "18546-5066-2019|02|2019" [30]=> string(23) "18231-5066-2018|02|2019" [31]=> string(23) "18416-3498-2018|02|2019" [32]=> string(23) "16939-4732-2017|02|2019" [33]=> string(23) "18302-4309-2018|02|2019" [34]=> string(23) "18219-4447-2018|02|2019" [35]=> string(23) "17510-4875-2017|02|2019" [36]=> string(22) "18293-906-2018|02|2019" [37]=> string(23) "18113-5013-2018|02|2019" [38]=> string(23) "18467-5013-2019|02|2019" [39]=> string(23) "18486-2832-2019|02|2019" [40]=> string(23) "18407-3552-2018|02|2019" [41]=> string(23) "18339-5053-2018|02|2019" [42]=> string(23) "18491-5162-2019|02|2019" [43]=> string(23) "18393-5110-2018|02|2019" [44]=> string(23) "18263-4866-2018|02|2019" [45]=> string(23) "18545-4866-2019|02|2019" [46]=> string(23) "18314-5138-2018|02|2019" [47]=> string(23) "18330-4791-2018|02|2019" [48]=> string(23) "18167-4547-2018|02|2019" [49]=> string(23) "18419-4449-2018|02|2019" [50]=> string(23) "18400-2555-2018|02|2019" [51]=> string(23) "17579-3435-2017|02|2019" [52]=> string(23) "18352-5143-2018|02|2019" [53]=> string(23) "15150-4288-2015|02|2019" [54]=> string(23) "18532-5177-2019|02|2019" [55]=> string(23) "18372-5108-2018|02|2019" [56]=> string(23) "17498-4741-2018|02|2019" [57]=> string(23) "18547-5039-2019|02|2019" [58]=> string(22) "18408-847-2018|02|2019" [59]=> string(23) "18373-2636-2018|02|2019" [60]=> string(23) "18216-3294-2018|02|2019" [61]=> string(23) "18254-4618-2018|02|2019" [62]=> string(23) "18534-4618-2019|02|2019" [63]=> string(23) "18335-4549-2018|02|2019" [64]=> string(23) "18549-4867-2019|02|2019" [65]=> string(23) "18469-3582-2019|02|2019" [66]=> string(23) "18245-1775-2018|02|2019" [67]=> string(23) "18482-1775-2019|02|2019" [68]=> string(23) "18458-4928-2019|02|2019" [69]=> string(23) "17147-1997-2017|02|2019" [70]=> string(23) "18277-5083-2018|02|2019" [71]=> string(23) "18018-4595-2018|02|2019" [72]=> string(23) "18423-4595-2018|02|2019" [73]=> string(23) "18370-5139-2018|02|2019" [74]=> string(23) "18427-4754-2018|02|2019" [75]=> string(23) "18357-2244-2018|02|2019" [76]=> string(23) "18471-5077-2019|02|2019" [77]=> string(23) "18320-5125-2018|02|2019" [78]=> string(23) "18360-3809-2018|02|2019" [79]=> string(23) "18401-4748-2018|02|2019" [80]=> string(23) "18440-4645-2019|02|2019" [81]=> string(23) "18411-5161-2018|02|2019" [82]=> string(23) "18284-4625-2018|02|2019" }
    ho già controllato la correttezza dei dati delle righe successive ed è tutto a posto
  • Re: Invio di array tramite POST

    Posta tutto il codice allora, se replico quello che hai postato all'inizio non ho problemi e mi stampa tutti i valori che spunto.
  • Re: Invio di array tramite POST

    Ok grazie ... purtroppo posso solo postare il codice (è una modifica ad un programma in PHP Version 5.6.22-2) perché la tabella html viene creata leggendo i dati da un db mysql, comunque il sorgente della pagina che genera la tabella con i check da spuntare è questo :
    
    <?php
    include ("funzioni/errori.php"); //visualizzazione errori e warning
    include ("settaggi/Set_page_db.php");// connessione al db
    //if ($data_progetti==''){$data_progetti=$_REQUEST['data_progetti'];}
    $query = "SELECT * FROM tab_elab_pro WHERE anno='$anno' and mese='$mese' ORDER BY cognome,nome";
    $res_elab= mysql_query($query) or die ("Errore nella query : ".$query."  ".mysql_error());
    $num = mysql_num_rows($res_elab);
    echo "Progetti trovati ".$num." Mese. ".$mese."  Anno.  ".$anno."<br>";
    ?>
    <button class="btn btn-xs" type="submit" id="submit" name="tasto" form="form_elab_pro" style="width: 300px;">Annulla i Progetti Selezionati</button>
    <table id="tab_pro"  class="table-striped table" cellpadding ="2" border="1" >
               <tr>
                    <th align="left"><font size="1.5em">Cognome</font></th>
                    <th align="left"><font size="1.5em">Nome</font></th>
               <!--     <th align="left"><font size="1.5em">Data Nascita</font></th> -->
                    <th align="left"><font size="1.5em">Cod. Pro.</font></th>
                    <th align="left"><font size="1.5em">Anno</font></th>
                    <th align="left"><font size="1.5em">Mese</font></th>
                    <th align="left"><font size="1.5em">Data Inizio </font></th>
                    <th align="left"><font size="1.5em">Data Fine</font></th>
                    <th align="left"><font size="1.5em">Fine Pro</font></th>
            <!--        <th align="left"><font size="1.5em">Mod.</font></th> -->
                    <th align="left"><font size="1.5em">GG. P.C.</font></th>
                    <th align="left"><font size="1.5em">Ass.80%</font></th>
                    <th align="left"><font size="1.5em">Ass.100%</font></th>
             <!--       <th align="left"><font size="1.5em">Ass.60%</font></th> 
                    <th align="left"><font size="1.5em">Fig.</font></th> -->
                    <th align="left"><font size="1.5em">elab.</font></th>
                </tr>
                <form name="elab_pro" id="form_elab_pro" method="POST" action="cont_pro_elab_multi_select.php">
                <?php
                $x=0;
                $i=0;
                while ($dati_elab = mysql_fetch_array($res_elab)){
                        $cod_cart =explode("-",$dati_elab[3]);
                        $query = "SELECT * FROM anagrafica WHERE idanag='$cod_cart[1]'";
                        $res_anag = mysql_query($query) or die ("Errore nella query : ".mysql_error());
                        $dati_anag = mysql_fetch_array($res_anag);
                        $query = "SELECT * FROM tab_progetto WHERE cod_pro='$dati_elab[3]'";
                        $res = mysql_query($query) or die ("Errore nella query : ".mysql_error());
                        $dati = mysql_fetch_array($res);
                    // dati anagrafici ------------------------------
                        $cognome = $dati_anag[2];
                        $nome = $dati_anag[3];
                        $App = new class_db();
                        $data_nascita=$App->data_ita($dati_anag[4]);
                    //-----------------------------------------------    
                    //dati progetto ---------------------------------    
                        $cod_pro = $dati[2]; //codice progetto
    
                        $App = new class_db();
                        $data_inizio_pro=$App->data_ita($dati[3]);//data inizio progetto
    
                        $App = new class_db();
                        $data_fine_pro=$App->data_ita($dati[5]);//data fine progetto
    
                        if ($dati[5]!= $dati[16]){
                            $App = new class_db();
                            $data_fine_eff_pro=$App->data_ita($dati[16]);
                        }
                        else {
                            $data_fine_eff_pro = $data_fine_pro;
                        }
                        if ($dati[9]==1){
                            $mod_int_pro ="Estensivo";
                        }
                        else{
                            $mod_int_pro ="Mantenimento";
                        }
                        $gg_eff_pc = $dati_elab[4];
                        $ass100= $dati_elab[5];
                        $ass80= $dati_elab[6];
                        $ass60= $dati_elab[7];       
                        ?>
                    <tr>
                        <td><font size="1.5em"><input type="text" name="cognome" size="15" value="<?php echo $x.")".$cognome; ?>" style="text-align: left;"</font></td>
                        <td><font size="1.5em"><input type="text" name="nome" size="15" value="<?php echo $nome; ?>" style="text-align: left;"</font></td>
                        <td><font size="1.5em"><input type="text" name="cod_pro" size="15" value="<?php echo $cod_pro; ?>" style="text-align: left;"</font></td>
                        <td><font size="1.5em"><input type="text" name="anno_pro" size="3" value="<?php echo $anno; ?>" style="text-align: left;"</font></td>
                        <td><font size="1.5em"><input type="text" name="mese_pro" size="3" value="<?php echo $mese; ?>" style="text-align: left;"</font></td>
                        <td><font size="1.5em"><input type="text" name="data_inizio_pro" size="8" value="<?php echo $data_inizio_pro; ?>" style="text-align: left;"</font></td>
                        <td><font size="1.5em"><input type="text" name="data_fine_pro" size="8" value="<?php echo $data_fine_pro; ?>" style="text-align: left;"</font></td>
                        <td><font size="1.5em"><input type="text" name="data_fine_eff_pro" size="8" value="<?php echo $data_fine_eff_pro; ?>" style="text-align: left;"</font></td>
                        <td><font size="1.5em"><input type="text" name="gg_eff_pc" size="3" value="<?php echo $gg_eff_pc; ?>" style="text-align: center;"</font></td>
                        <td><font size="1.5em"><input type="text" name="ass80" size="3" value="<?php echo $ass80; ?>" style="text-align: center;"></font></td>
                        <td><font size="1.5em"><input type="text" name="ass100" size="3" value="<?php echo $ass100; ?>" style="text-align: center;"></font> </td>
                        <td><?php   echo "<input type=checkbox   name='pro[]' value=".$cod_pro."|".$mese."|".$anno." checked >"; ?> <?php echo $i."-".$cod_pro."-".$mese."-".$anno; ?></td>
    
                    </tr>
                      <?php
                      $x++;
                      $i++;
                }
                      ?>
                       </form>
    </table>
    
    mentre la pagina di ricezione è sempre quella postata precedentemente....
    grazie per la tua pazienza... è probabile che mi faranno fare il porting a php 7 ..ma come sai... "al momento questa modifica è urgente"
  • Re: Invio di array tramite POST

    PS: nel codice ho impostato che tutti i checkbox siano "checked" di default per evitare di doverlo fare manualmente.. poiché si sono accorti dell'errore solo quando hanno spuntato le box dopo la 83 riga
  • Re: Invio di array tramite POST

    Ciao,
    dunque con l'html generato dinamicamente sono sempre mezzo impazzito...allora vedo che il tag input non è <input ... /> chiuso con />.
    poi, dunque scriverei type = "checkbox" e poi checked = "checked" con i doppi apici (non si sa mai).
    poi ok sono tutti checked all'inizio, ma non è che nella riga 84 c'è qualche dato che sta leggendo che gli fa generare un html non corretto?
    inoltre vedo che value non è seguito da doppi apici dovrebbe essere value=" .... "

    Davide
  • Re: Invio di array tramite POST

    Grazie nyiragongo .. si in effetti proverò a correggere la sintassi nel modo corretto... quello che mi fa incavolare è il funzionamento parziale .....

    per quanto riguarda i dati a fianco della checkbox faccio visualizzare i dati che passo come value alla check e vengono visualizzati tutti correttamente

    ho abilitato gli errori e warning e non risulta nulla (a parte un warning deprecated per la funzione mysql_connect)

    comunque la tabella html viene visualizzata correttamente nello specifico sono 291 righe... ed i valori che faccio visualizzare a fianco della check sono tutti validi e formattati correttamente .......

    ma la variabile $_POST ha dei limiti per la quantità di dati che può inviare ...?
  • Re: Invio di array tramite POST

    Mh dunque il limite della $_POST non me lo sono mai chiesto in effetti...però è così strano proprio dalla riga 83 mi fa solo pensare a quei dati in particolare.
    per essere sicuri del limite potresti mandargli la tabella solo dalla riga 83 in poi o addirittura solo la riga 83. se fallisce, mi sa è errore html (posta qui la riga) altrimenti comincio seriamente a pensare a limiti del $_POST e cercare configurazioni varie...

    Davide
  • Re: Invio di array tramite POST

    Pensavo potresti non metterli all'inizio tutti checked e mettere un contatore di debug $dbgcnt = 0; all'altezza del checkbox if($dbgcnt++ == 83) metti checked = "checked" con il resto della sintassi tutto aggiornato con i doppi apici e l'input con il finale />
  • Re: Invio di array tramite POST

    Ottime idee grazie mille appena fatto tutte le prove vi faccio sapere ..... stavo provando anche con serialize/unserialize e urlencode/urldecode ma nisba... questa sera probabilmente sono pure un pò rinco
  • Re: Invio di array tramite POST

    <?PHP
    if(isset($_POST['pro'])) {
    $riga=$_POST['pro'];
    for($i=0,$size=count($riga);$i<$size;$i++) {
    //bla bla bla
    }
    }
    
    Immettere il codice corretto al posto di bla bla, comunque visto che i dati provengono da fonte esterna li devi validare per codice prodotto, mese e anno e devi anche aggiungere un limite (questo per non subire attacchi che possono rendere down il tuo server).
    Ho tolto la ripetizione del count dal momento che sai a priori quanti array esistono.
    Inoltre é buona abitudine iniziallizare gli array
    $arr = array(); multidimensionale $arr = array('a' => array()); //Significa $arr['a']['qualsiasi_sintassivalida_per_un_indice'];
    Mi dispiace non sono a conoscenza di errori nel tuo script ma puoi sempre abilitare la registrazione degli errori del PHP nel tuo web server.
    Note* in PHP 7 non é possibile utilizzare indici vuoti e nemmeno mysql , per quest'ultimo usa mysqli con le differenze ad esso abbinate..
  • Re: Invio di array tramite POST

    Scusate se non mi sono più fatto sentire, ma ho dovuto risolvere momentaneamente in un'altra maniera, poiche mi hanno spostato in un altro progetto, ma appena ho un pò di tempo mi ci rimetto comunque per il momento grazie a tuuti
  • Re: Invio di array tramite POST

    Ciao,
    hai verificato la direttiva max_input_vars nel php.ini?

    Probabilmente hai un valore troppo basso, anche perché non c'è altra spiegazione al tuo problema
Devi accedere o registrarti per scrivere nel forum
14 risposte