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

luigichi

Nuovo Utente
28 Feb 2017
29
1
3
31
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.
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
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"
 

luigichi

Nuovo Utente
28 Feb 2017
29
1
3
31
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);
?>
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
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);
}
 

luigichi

Nuovo Utente
28 Feb 2017
29
1
3
31
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
 

luigichi

Nuovo Utente
28 Feb 2017
29
1
3
31
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
Un' altra cosa che ho notato è che solo il campo description è racchiuso da " . Gli altri campi invece no...
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
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($fp, array_map("utf8", $row));
}
 

luigichi

Nuovo Utente
28 Feb 2017
29
1
3
31
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?
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
deve cambiare, hai messo anche array_map() ?
 

luigichi

Nuovo Utente
28 Feb 2017
29
1
3
31
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
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
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
 

luigichi

Nuovo Utente
28 Feb 2017
29
1
3
31
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
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
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 />", "",
 

luigichi

Nuovo Utente
28 Feb 2017
29
1
3
31
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.
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
dipende come è formata la stringa che hai nel database, ma non la inserisci tu ? è uguale per tutti i record ?
postala per intero
 

luigichi

Nuovo Utente
28 Feb 2017
29
1
3
31
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)
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.041
146
63
PR
www.borgo-italia.it
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
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.041
146
63
PR
www.borgo-italia.it
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";
?>
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
per andare a capo prova cosi
PHP:
return str_replace("<br />", "\r", utf8_encode($value));
a me ha funzionato