estrazione dati da mysql in php e salvataggio in cartella del server

Discussione in 'PHP' iniziata da luigichi, 28 Febbraio 2017.

Tag (etichette):
  1. luigichi

    luigichi Nuovo Utente

    Registrato:
    28 Febbraio 2017
    Messaggi:
    29
    Mi Piace Ricevuti:
    1
    Punteggio:
    3
    Sesso:
    Maschio
    Buongiorno a tutti,

    ho un problema e non riesco a risolvere e dopo qualche giorno di prova ho deciso di scrivere a voi, sperando in un aiuto risolutivo
    Ho un database in mysql con una tabella 'tblprojects' che contiene questi dati:
    Intestazioni:
    name / description / status / deadline
    Valori delle colonne:
    alberto rossi / testo della descrizione / attivo / 10-01-2017
    giacomo neri / testo della descrizione / sospeso / 08-02-2017
    roberto bianchi / testo della descrizione / disattivo / 20-02-2017

    Ho bisogno, tramite php, di esportare in automatico un file in .csv contenente questi dati e di salvarlo dentro una cartella ftp del mio server per poter dare l'accesso da remoto ad altre persone.

    fino ad ora sono riuscito a scrivere questo codice che mi permette di generare il file nella cartella ftp del mio server ma non so come richiamare i valori delle colonne. In sostanza quando eseguo il link mi genera in automatico il file ma quando lo apro ha solo le intestazioni delle colonne e non tutti i valori inseriti nel db mysql. Come posso fare?

    PHP:
    <?php
    $host
    ="mio_host";
    $user="utente";
    $pass="psw_utente";
    $db_name="nome_db_mysql";
    $table="tblprojects";
    $conn mysqli_connect($host,$user,$pass,$db_name) or die("Errore connessione");
    $query "SELECT name, description, status, deadline FROM $table ORDER BY ID";
    $result mysqli_query($conn,$query) or die("Errore della query");

    //Open a file in write-mode (he creates it, if it not exists)
    $fp fopen('./export/nome_file.csv''w');

    // output the column headings
    fputcsv($fp, array('name','description','status','deadline'));

    // output the rows
    ???

    // print message on display
    $i 0;
    if (
    $number 1) {
      print 
    "<center><p>L'export del file .csv non è avvenuto correttamente</p></center>";
    }else{
      while (
    $number $i) {
      print 
    "<center><p>Ho effettuato correttamente l'export del file .csv</p></center>";
        
    $i++;
      }
    }

    // loop over the rows, outputting them
    // while ($row = mysql_fetch_assoc($rows))
    fputcsv($fp$row);

    //close the handler
    fclose($fp);
    ?>
    Una volta risolto questo avrei poi altri due problemi:
    - fare in modo che il file si sovrascrivi automaticamente (ogni giorno il file deve essere aggiornato con i record del db. si può fare in modo che il file si cancelli e si ricrei in automatico?)
    - qual'è il processo di cronjob tramite il quale posso richiamare la pagina php ad esempio alle ore 6 di ogni giorno in modo che tutta l'automazione funzioni in automatico?

    Ho provato a vedere diverse discussioni che trattano l'argomento ma non ho trovato in nessuna la risoluzione al mio problema.
     
  2. criric

    criric Super Moderatore Membro dello Staff SUPER MOD MOD

    Registrato:
    21 Agosto 2010
    Messaggi:
    5.607
    Mi Piace Ricevuti:
    54
    Punteggio:
    48
    Sesso:
    Maschio
    Località:
    TN
    Ciao, decommenta questa riga
    PHP:
    // while ($row = mysql_fetch_assoc($rows))
    è il ciclo di estrazione dei dati. Cambia solo con mysqli_fetch_assoc($rows)
    questa non ha senso, eliminala
    PHP:
    $i 0;
    if (
    $number 1) {
      print 
    "<center><p>L'export del file .csv non è avvenuto correttamente</p></center>";
    }else{
      while (
    $number $i) {
      print 
    "<center><p>Ho effettuato correttamente l'export del file .csv</p></center>";
        
    $i++;
      }
    }
    prima di creare il file puoi eliminarlo con unlink(), controlla prima se esiste con file_exist()
    per il cronjobs devi controllare sul tuo host se è abilitato, su aruba si chiama "schedule task"
     
  3. luigichi

    luigichi Nuovo Utente

    Registrato:
    28 Febbraio 2017
    Messaggi:
    29
    Mi Piace Ricevuti:
    1
    Punteggio:
    3
    Sesso:
    Maschio
    Grazie Criric per la risposta. Ho provato come detto ma l'esito non è cambiato. Si genera il file .csv nella cartella specificata ma contiene solo le intestazioni delle colonne e non i relativi valori delle righe del db... come mai?

    Riposto il codice aggiornato:
    PHP:
    <?php
    $host
    ="xxx";
    $user="xxx";
    $pass="xxx";
    $db_name="xxx";
    $table="tblprojects";
    $conn mysqli_connect($host,$user,$pass,$db_name) or die("Errore connessione");
    $query "SELECT name, description, status, deadline FROM $table ORDER BY ID";
    $result mysqli_query($conn,$query) or die("Errore della query");

    //Open a file in write-mode (he creates it, if it not exists)
    $fp fopen('./export/nome_file.csv''w');

    // output the column headings
    fputcsv($fp, array('name','description','status','deadline'));

    // loop over the rows, outputting them
    while ($row mysqli_fetch_assoc($rows))
    fputcsv($fp$row);

    //close the handler
    fclose($fp);
    ?>
     
  4. criric

    criric Super Moderatore Membro dello Staff SUPER MOD MOD

    Registrato:
    21 Agosto 2010
    Messaggi:
    5.607
    Mi Piace Ricevuti:
    54
    Punteggio:
    48
    Sesso:
    Maschio
    Località:
    TN
    perchè la variabile $rows non esiste, modifica con $result
    PHP:
    // loop over the rows, outputting them
    while ($row mysqli_fetch_assoc($result)) {
        
    fputcsv($fp$row);
    }
     
  5. luigichi

    luigichi Nuovo Utente

    Registrato:
    28 Febbraio 2017
    Messaggi:
    29
    Mi Piace Ricevuti:
    1
    Punteggio:
    3
    Sesso:
    Maschio
    Funziona! grazie Criric!
    Una domanda però: il campo description è un campo note nel db e quindi contiene ad esempio alcuni valori come le parentesi oppure il simbolo dell'euro che non vengono visualizzati correttamente nel .csv
    Inoltre ho notato che vedo "<br />" ...
    c'è un modo per far si che l'estrapolazione sia corretta nella formattazione?

    Grazie ancora
     
  6. luigichi

    luigichi Nuovo Utente

    Registrato:
    28 Febbraio 2017
    Messaggi:
    29
    Mi Piace Ricevuti:
    1
    Punteggio:
    3
    Sesso:
    Maschio
    Un' altra cosa che ho notato è che solo il campo description è racchiuso da " . Gli altri campi invece no...
     
  7. criric

    criric Super Moderatore Membro dello Staff SUPER MOD MOD

    Registrato:
    21 Agosto 2010
    Messaggi:
    5.607
    Mi Piace Ricevuti:
    54
    Punteggio:
    48
    Sesso:
    Maschio
    Località:
    TN
    puoi provare a sistemare la stringa con utf8_encode() e array_map()
    PHP:
    function utf8($value) {
        return 
    str_replace("<br/>""\n"utf8_encode($value));
    }

    // loop over the rows, outputting them
    while ($row mysqli_fetch_assoc($result)) {
        
    fputcsv($fparray_map("utf8"$row));
    }
     
  8. luigichi

    luigichi Nuovo Utente

    Registrato:
    28 Febbraio 2017
    Messaggi:
    29
    Mi Piace Ricevuti:
    1
    Punteggio:
    3
    Sesso:
    Maschio
    ho provato a sostiture il codice e a riestrapolare ma il risultato non cambia.
    Continuo a vedere nella colonna 'description' dei valori contenenti <br />
    Invece ora non vedo più ai valori description gli apici.

    Come posso sistemare per fare in modo di leggere correttamente il contenuto di description?
     
  9. criric

    criric Super Moderatore Membro dello Staff SUPER MOD MOD

    Registrato:
    21 Agosto 2010
    Messaggi:
    5.607
    Mi Piace Ricevuti:
    54
    Punteggio:
    48
    Sesso:
    Maschio
    Località:
    TN
    deve cambiare, hai messo anche array_map() ?
     
  10. luigichi

    luigichi Nuovo Utente

    Registrato:
    28 Febbraio 2017
    Messaggi:
    29
    Mi Piace Ricevuti:
    1
    Punteggio:
    3
    Sesso:
    Maschio
    si ti confermo. non so se può esserti utile ma... vedo che i <br /> sono uniti al testo... faccio un esempio:
    nel csv estrapolato mi vedo...
    N.1 TAVOLO&nbsp;<br />N.6 SEDIE
     
  11. criric

    criric Super Moderatore Membro dello Staff SUPER MOD MOD

    Registrato:
    21 Agosto 2010
    Messaggi:
    5.607
    Mi Piace Ricevuti:
    54
    Punteggio:
    48
    Sesso:
    Maschio
    Località:
    TN
    prova aggiungi uno spazio al br nel replace
    PHP:
     return str_replace("<br />"
    ma bisognerebbe pensare a qualcosa di più intelligente, ci rifletto intanto fai cosi
     
  12. luigichi

    luigichi Nuovo Utente

    Registrato:
    28 Febbraio 2017
    Messaggi:
    29
    Mi Piace Ricevuti:
    1
    Punteggio:
    3
    Sesso:
    Maschio
    ho modificato il codice. ora succede una cosa strana.
    mi ha diviso (credo di capire dove ha trovato i <br />) il contenuto della cella aggiungendomi una nuova riga.
    Faccio un esempio:
    4 | ANTONIO ROSSI | N.1 TAVOLO&nbsp;
    N.6 SEDIE

    io vorrei invece vedere N.6 SEDIE sempre nel campo N.1 TAVOLO ...

    Grazie per la pazienza
     
  13. criric

    criric Super Moderatore Membro dello Staff SUPER MOD MOD

    Registrato:
    21 Agosto 2010
    Messaggi:
    5.607
    Mi Piace Ricevuti:
    54
    Punteggio:
    48
    Sesso:
    Maschio
    Località:
    TN
    il br in html è un ritorno a capo. La funzione str_replace permetter di sostituire dei caratteri con altri in una stringa.
    Nel tuto caso il <br /> viene sostituito con il \n che è un altro ritorno a capo. Se vuoi eliminarlo puoi sostituirlo con una stringa vuota.
    PHP:
    return str_replace("<br />""",
     
  14. luigichi

    luigichi Nuovo Utente

    Registrato:
    28 Febbraio 2017
    Messaggi:
    29
    Mi Piace Ricevuti:
    1
    Punteggio:
    3
    Sesso:
    Maschio
    ci siamo quasi. Adesso rivedo il contenuto tutto nella stessa cella ma in questo modo:
    N.1 TAVOLON.6 SEDIE
    C'è un modo per far si che nel file .csv, all'interno della stessa cella io leggo:
    N.1 TAVOLO
    N.6 SEDIE

    Con la str_replace mi hai aperto un nuovo mondo. A quanto ho capito sostituisce i caratteri di una stringa con un'altra.
    Se io ho una colonna dove ho questi dati:
    VENDITORE
    NOME1
    NOME2
    NOME3
    posso usare questa funzione per dire "se trovi solo nella colonna venditore il NOME1 sostituiscilo con 1, se trovi solo nella colonna VENDITORE il Nome2 sostituiscilo con 2 e se trovi solo nella colonna VENDITORE il NOME3 sostituiscilo con 3?
    Come dovrei fare? Ovviamente fa parte sempre dello stesso file .csv che dopo devo estrapolare.
     
  15. criric

    criric Super Moderatore Membro dello Staff SUPER MOD MOD

    Registrato:
    21 Agosto 2010
    Messaggi:
    5.607
    Mi Piace Ricevuti:
    54
    Punteggio:
    48
    Sesso:
    Maschio
    Località:
    TN
    dipende come è formata la stringa che hai nel database, ma non la inserisci tu ? è uguale per tutti i record ?
    postala per intero
     
  16. luigichi

    luigichi Nuovo Utente

    Registrato:
    28 Febbraio 2017
    Messaggi:
    29
    Mi Piace Ricevuti:
    1
    Punteggio:
    3
    Sesso:
    Maschio
    si ti posto alcune stringhe di esempio

    status,deadline,name, description,VENDITORE
    1 11/11/2016,CLIENTE1,N.1 TAVOLON.2 SEDIE,NOME1
    4 16/11/2016,CLIENTE2,N.1 TAVOLO GRIGION.6 SEDIE,NOME2
    4 12/11/2016,CLIENTE3, N.2 TAVOLIN.8 SEDIE,NOME3

    io vorrei che ad esempio il n.2 sedie sia a capo ma sempre nella stessa cella
    e vorrei capire se ho un modo per far si che in automatico quando estraggo il csv mi sostituisce solo nella colonna venditore i valori (praticamente voglio dare dei valori numerici agli agenti perchè non voglio che chi deve ricevere questo file veda chi sono gli agenti)
     
  17. borgo italia

    borgo italia Super Moderatore Membro dello Staff SUPER MOD MOD

    Registrato:
    4 Febbraio 2008
    Messaggi:
    16.028
    Mi Piace Ricevuti:
    146
    Punteggio:
    63
    Sesso:
    Maschio
    Località:
    PR
    Home Page:
    ciao
    devi specificare meglio come sono slavati i nomi dei venditori, se ad esempio sono scritti così

    Zuzzurro1
    Pallo2
    Pallino3
    ...ecc...
    Pinco98


    non c'è problema a sotituire esempio Pallo con 2, ma se sono così

    Zuzzurro
    Pallo
    Pallino
    ...ecc...
    Pinco


    credo che la cosa si complichi notevolmente
     
  18. luigichi

    luigichi Nuovo Utente

    Registrato:
    28 Febbraio 2017
    Messaggi:
    29
    Mi Piace Ricevuti:
    1
    Punteggio:
    3
    Sesso:
    Maschio
    purtroppo è il secondo caso...
     
  19. borgo italia

    borgo italia Super Moderatore Membro dello Staff SUPER MOD MOD

    Registrato:
    4 Febbraio 2008
    Messaggi:
    16.028
    Mi Piace Ricevuti:
    146
    Punteggio:
    63
    Sesso:
    Maschio
    Località:
    PR
    Home Page:
    ciao
    se i venditori non sono molti forse ti conviene creare due array, uno con i nomi dei venditori e l'altro con i codici numerici
    l'unica cosa da stare attenti che i due array abbiano lo stesso numero di elementi e usare ireplace che è caseinsensitive
    PHP:
    <?php
    $venditori
    =array('Pinco','Pallo','Sempronio');
    $codice=array('v1','v2','v3');
    $stringa="1 11/11/2016,CLIENTE1,N.1 TAVOLON.2 SEDIE,Pallo";
    echo 
    "$stringa <br />";
    $stringa str_ireplace($venditori$codice$stringa);
    echo 
    "$stringa";
    ?>
     
  20. criric

    criric Super Moderatore Membro dello Staff SUPER MOD MOD

    Registrato:
    21 Agosto 2010
    Messaggi:
    5.607
    Mi Piace Ricevuti:
    54
    Punteggio:
    48
    Sesso:
    Maschio
    Località:
    TN
    per andare a capo prova cosi
    PHP:
    return str_replace("<br />""\r"utf8_encode($value));
    a me ha funzionato
     
Sto caricando...

Condividi questa Pagina