Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2017
    Messaggi
    48

    Aiuto con ricezione dati da form

    Salve a tutti provo a spiegare la mia situazione:
    Ricevo da delle API un JSON che con il metodo decode ciclo in un foreach per accedere solo alle info che mi servono:

    Codice PHP:
    $data json_decode($datatrue);

    <
    tbody>
    foreach(
    $data as $row) : 
    <
    tr>
         <
    td>$row['firstname']</td>
         <
    td>$row['lastname']</td>
         <
    td>$row['address']</td>
         <
    td>$row['email']</td>
    </
    tr>
    endforeach;
    </
    tbody
    ecco tanto per rendere un idea grezza, mi vengono stampate 100 righe di queste info qui..
    Ora io ho racchiuso la tabella in un form con action al file createcsv.php con metodo post.
    e nei tr ho creato degli input di tipo hidden con name="esempio[]" e con value esattamente quello che che stampo nella td.
    o inserito anche un <td> che porta una checkbox perche vorrei inviare solo le righe selezionate
    Ora quando nel file createcsv.php vado a fare la ricezione del post e qui che mi incarto.

    Codice PHP:
    if(isset($_POST['submit']){
     
    l'idea ï¿½ quella di ricevere solo i dati che invio <tr> per <tr> con i vari dati e creare un array per poi ciclare e creare un csv. nel form il name="esempio[]" già crea un array,il problema è che non so metterlo qui insieme alle altre info di quel tr....

    https://www.php.net/manual/en/function.fputcsv.php

    grazie, aiutatemi a sbrogliare la mente. Un caro saluto a tutti
    Ultima modifica di phelps; 01-06-2021 a 11:44 Motivo: ui in

  2. #2
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    io farei così:
    1. mi salvo il file json su disco (server) con un nome (semi)casuale.
    2. nel form metto in un campo hidden questo nome
    3. Nel ciclo (per ogni riga) metto un solo checkbox con nome = esempio[] e value il numero di riga (metti un $index=0 che incrementi nel while)

    Nel post su createcsv.php
    1. faccio $data=decode del file json con il nome ripreso dal post
    2. fai un ciclo su $_POST['esempio'] (foreach($_POST['esempio'] as $value) )
    3. riprendi $data[$value] e lo passi a fputcsv
    Ultima modifica di boots; 01-06-2021 a 15:55

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2017
    Messaggi
    48
    Quote Originariamente inviata da boots Visualizza il messaggio
    io farei così:
    1. mi salvo il file json su disco (server) con un nome (semi)casuale.
    2. nel form metto in un campo hidden questo nome
    3. Nel ciclo (per ogni riga) metto un solo checkbox con nome = esempio[] e value il numero di riga (metti un $index=0 che incrementi nel while)

    Nel post su createcsv.php
    1. faccio $data=decode del file json con il nome ripreso dal post
    2. fai un ciclo su $_POST['esempio'] (foreach($_POST['esempio'] as $value) )
    3. riprendi $data[$value] e lo passi a fputcsv
    ciao non ho capito perche il sistema mi blocca la risposta. Rispondo con uno screenshoot
    Ho messo in un solo campo hidden un astringa separata da virgole di quello che mi serve......
    risposta-min.JPG
    Ultima modifica di phelps; 03-06-2021 a 15:57

  4. #4
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Scusa ma dal file non si capisce...come è fatto il form?

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2017
    Messaggi
    48
    Quote Originariamente inviata da boots Visualizza il messaggio
    Scusa ma dal file non si capisce...come è fatto il form?

    Allora ricevo le woocomerce API con le consuete chiavi segrete poi questo infine mi mette una funzione che memorizzo in una variabile, del tipo:


    Codice PHP:
    $data json_encode($woocommerce->get('orders', array('per_page'=>100) )); 

    ok ora nella stessa pagina procedo al JSON decode:



    codice:
    $data = json_decode($data, true);
    
    
    //a questo punto ho la tabella in formato bootstrap che mi cicla il tutto,
    ti faccio un esempio ridotto, non posto tutto
    
    
    <form action="createcsv.php" method="post">
    		<div class="table-responsive">
    			<table class="table table-striped table-fixed">
    				<thead>
    					<tr>
    						<th>X</th>
    						<th>N.Ordine</th>
    						ecc ecc
    					</tr>
    				</thead>
    				<tbody>
    					 foreach ( $data as $row ) : 
    				<td><input type="checkbox" name="selected" id=""></td> //questo è il selected che ho messo</td>
    				<td>qui una serie di campi del tipo $row['order_numer']</td>
    				//ecco che qui ad un certo punto ho inserito l'input nascosto
    				<input type="hidden" name="esempio" "$row['name'], $row['surname'] , $row['address], ecc ,ecc"/>
    				//non metto i tag php perche ho paura che siano questi a farmi bloccare dal forum HTML
    				</tbody>
    				</tr>
    					 endforeach
    				</tbody>
    			</table>
    		</div>
    		<button type="submit"name="submit">Invia</button>
    		</form>
    Poi il file createcsv.php si pò vedere chiaramente dall'immagine quello che riceve e quello che fà.
    Ultima modifica di phelps; 04-06-2021 a 21:25

  6. #6
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    in un foreach con input dovresti usare come name un "array" altrimenti ti verrà postato solo l'ultimo input in quanto avranno tutti lo stesso nome.
    Inoltre dovresti correlare il checkbox con il campo hidden in quanto i campi hidden verranno tutti iniviati mentre i checkbox solo quelli selezionati.
    Quindi

    Codice PHP:

    $i 
    0;
    foreach(
    $data as $row): 
      ...
      <
    input type="checkbox" name="selected[]" value="<php echo $i >" >
       <
    input type="hidden" name="esempio[<php echo $i >]"  value="$row['name'], $row['surname'] , $row['address], ecc ,ecc" >
      ...
      
    $i++;
     endforeach; 
    Nel createcsv.php
    Codice PHP:
    //per ogni checkbox
    foreach($_POST['selected'] as $i){
        
    $arr explode(','$_POST[esempio][$i]);

    Ora, io non ti consiglierei cmq di procedere in questo modo per i seguenti motivi:
    1. Ogni volta fai il post di ogni riga (esempio[]) indipendentemente se il checkbox è checked o meno.
    ricorda che ci sono limiti sul numero di input inviabili da una form (max_input_vars) e la dimensione massima del post (post_max_size)
    che di default sono alti (3000 e 2mb) ma possono essere cambiati dal hosting
    2. i valori che metti nel value (indirizzo, nome, cognome ) potrebbero avere caratteri che ti vanno a "rompere" il codice html. per esempio
    se address contiene " (doppi apici) o il carattere che usi per separare i valori (la virgola in questo caso), etc

    Per questo ti avevo consigliato di metter nel form solo l'indice di riga del json ed usarlo a mo di database

    PS non mi prende i tag di php, quindi ho messo solo "<php"

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2017
    Messaggi
    48
    Quote Originariamente inviata da boots Visualizza il messaggio
    in un foreach con input dovresti usare come name un "array" altrimenti ti verrà postato solo l'ultimo input in quanto avranno tutti lo stesso nome.
    Inoltre dovresti correlare il checkbox con il campo hidden in quanto i campi hidden verranno tutti iniviati mentre i checkbox solo quelli selezionati.
    Quindi

    Codice PHP:

    $i 
    0;
    foreach(
    $data as $row): 
      ...
      <
    input type="checkbox" name="selected[]" value="<php echo $i >" >
       <
    input type="hidden" name="esempio[<php echo $i >]"  value="$row['name'], $row['surname'] , $row['address], ecc ,ecc" >
      ...
      
    $i++;
     endforeach; 
    Nel createcsv.php
    Codice PHP:
    //per ogni checkbox
    foreach($_POST['selected'] as $i){
        
    $arr explode(','$_POST[esempio][$i]);

    Ora, io non ti consiglierei cmq di procedere in questo modo per i seguenti motivi:
    1. Ogni volta fai il post di ogni riga (esempio[]) indipendentemente se il checkbox è checked o meno.
    ricorda che ci sono limiti sul numero di input inviabili da una form (max_input_vars) e la dimensione massima del post (post_max_size)
    che di default sono alti (3000 e 2mb) ma possono essere cambiati dal hosting
    2. i valori che metti nel value (indirizzo, nome, cognome ) potrebbero avere caratteri che ti vanno a "rompere" il codice html. per esempio
    se address contiene " (doppi apici) o il carattere che usi per separare i valori (la virgola in questo caso), etc

    Per questo ti avevo consigliato di metter nel form solo l'indice di riga del json ed usarlo a mo di database

    PS non mi prende i tag di php, quindi ho messo solo "<php"
    Grandissimo grazie, funziona.
    ero arrivato al fatto che ci voleva nel name il formato array, ma mi ingrippavo sul checkbok il quale aveva di bisogno un value per differenziarlo dagli altri file.

    Allora il programmino gira in localhost, crea lo stesso problemi file massimi inviabili? Nel caso dovrei cambiare il file.ini in xampp

    si alcuni campi portano i doppi apici, potrei pulire la stringa prima che diventi array solo dalle virgolette?.

    Il tuo secondo approccio invece sarebbe stato quello invece di mettere tutto il JSON in un input hidden.
    In questo caso nel createcsv.php dopo aver ricevuto il post e fatto il JSON decode, come si sarebbe dovuto fare poi?

    Grazie tanto, saluti
    Ultima modifica di phelps; 06-06-2021 a 09:25

  8. #8
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Quote Originariamente inviata da phelps Visualizza il messaggio
    Allora il programmino gira in localhost, crea lo stesso problemi file massimi inviabili? Nel caso dovrei cambiare il file.ini in xampp
    Dovresti vedere...se non superi i limiti puoi lasciare tutto cosï. Un centinaio di input non dovrebbero crearti problemi (a parte rendere il tutto più pesante)

    Quote Originariamente inviata da phelps Visualizza il messaggio
    si alcuni campi portano i doppi apici, potrei pulire la stringa prima che diventi array solo dalle virgolette?.
    Potresti anche provare a fare una codifica base64 e poi decodificare il tutto:

    Codice PHP:
    $value64 base64_encode($row['name'] .','$row['surname'] .','$row['address].','. ecc ,ecc');
    <
    input type="hidden" name="esempio[<php echo $i >]"  value="<php echo $value64 >" >

    // createcsv.php
    $arr explode(','base64_decode($_POST[esempio][$i])); 
    per� andrebbe provato e non risolverebbe il problema del carattere che usi come separatore(magari al posto della virgola potresti usare un carattere meno usato es #, $ o una coppia tipo <>)

    Quote Originariamente inviata da phelps Visualizza il messaggio
    Il tuo secondo approccio invece sarebbe stato quello invece di mettere tutto il JSON in un input hidden.
    In questo caso nel createcsv.php dopo aver ricevuto il post e fatto il JSON decode, come si sarebbe dovuto fare poi?
    Il file lo salvi sul server, in hidden solo il nome:
    Codice PHP:
    $file_name '<qualcosa>.json';
    file_put_contents('<path>/'.$file_name$data);
    $data json_decode($datatrue);

    ...

    <
    form>
    <
    input type="hidden" value="<$filename>" name="file_json">
    ...
    $i 0;
    foreach(
    $data as $row): 
      ...
      <
    input type="checkbox" name="selected[]" value="<php echo $i >" >
      
    // Non ti serve il campo dei dati
      
    $i++;
     endforeach;  


    //nel createcsv.php

    $data json_decode(file_get_contents('<path>./'.$_POST['file_json']), true);

    foreach(
    $_POST['selected'] as $i){
        
    $arr $data[$i];

    Pi� o meno cosï...forse c'è qualche errore, ma la logica è quella: ti porti dietro solo l'indice del file json e non i dati
    Ultima modifica di boots; 06-06-2021 a 13:08

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2017
    Messaggi
    48
    Codice PHP:
    if (isset($_POST['submit'])) {            
    foreach (
    $_POST['selected'] as $i) {                
    $str $_POST['buyer'][$i];                
    $cleaned preg_replace('/"/','',$str);                
    $arr explode(","$cleaned);                
    outputCSV(array($arr),'download.csv');                     
    }     

    Codice PHP:
    $a='"some text';
        echo 
    'String Replace Function<br>';
        echo 
    'O/P : ';
        echo 
    $rs =str_replace('"','',$a);
        echo 
    '<br>===================<br>';
        echo 
    'Preg Replace Function<br>';
        echo 
    'O/P : ';  
        echo 
    preg_replace('/"/','',$a);
        echo 
    '<br>===================<br>';
        echo 
    'Left Trim Function<br>';
        echo 
    'O/P : ';  
        echo 
    ltrim($a'"');
        echo 
    '<br>==================='


    Ho provato il base64 ma mi lasica sempre le due virgolette sulla via e sul paese.
    Ho provato anche i metodi di cui sopra. Come mai non le toglie?
    Ultima modifica di phelps; 06-06-2021 a 15:57

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.