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

luigichi

Nuovo Utente
28 Feb 2017
29
1
3
34
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
34
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
34
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
34
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
34
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
34
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
34
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
34
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
34
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.046
150
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.046
150
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
 
Discussioni simili
Autore Titolo Forum Risposte Data
E Progressbar estrazione dati da tabella mySQL Ajax 9
P Menu a discesa con estrazione dati da datbase mysql PHP 21
A problema: estrazione dati da query mysql e assegnazione ad una variabile PHP 2
L Estrazione dati php Database 6
L Estrazione dati casuali non doppioni MySQL 1
D Chiave unica in estrazione dati da array php PHP 0
ronny1710 Estrazione Dati Tessera Sanitaria .NET Framework 1
creatorweb [PHP] estrazione ciclica dati con 2 dati alla volta PHP 2
Gigi87 [PHP] Estrazione dati da forum o da social network PHP 1
E [PHP] estrazione dati in modo non continuativo PHP 1
C Estrazione Dati da Pagine Gialle PHP 0
A Estrazione dati da tabella sql MySQL 27
T Codice per estrazione dati da db PHP 4
L estrazione dati per login PHP 0
W Estrazione dati da DB PHP 20
L Estrazione dati per settimana. PHP 13
L estrazione dati e immagini in contemporanea PHP 4
M estrazione dati casuali da database Database 0
C [PHP][MY SQL] - Estrazione dati database tramite form PHP 8
G estrazione dati da DB tramite PHP errore time out PHP 2
B Estrazione dati utente loggato MySQL 1
W Estrazione dati DB da lista MySQL 1
M Connessione Database ed estrazione dati Javascript 6
A [risolto] Istruzione per estrazione di dati casuali dal db PHP 25
B Estrazione dati Classic ASP 3
U Estrazione dati da un db con un menu selezione in cascata PHP 6
Sargon estrazione dati PHP 17
A Estrazione dati da file.html PHP 8
G estrazione dati da xml ed inserimento in db PHP 0
M problema con estrazione dati da più tabelle MySQL 1
L Estrazione dati PHP 32
M caratteri speciali ed estrazione dati Database 4
L Estrazione dati da 2 tabelle non relazionate Classic ASP 26
R Aiuto estrazione dati Database 0
G estrazione dati da più record in un solo nuovo campo Database 0
E Difficile estrazione dati da tabella PHP 3
K Estrazione di più risultati da tabelle correlate PHP 5
L Estrazione valori max su più campi MySQL 4
M [PHP] Estrazione random con nomi presi dal db PHP 22
gandalf1959 Estrazione e visualizzazione del simbolo dell'euro php/mysqli PHP 0
F Estrazione Email di persone selezionate e attive / facebook + invio di massa! Annunci servizi di Social Media Marketing 0
V Estrazione di una singola banda da file multi banda (RGB) con Python Programmazione 0
O [PHP] problema estrazione immagine da db PHP 12
V [PHP] Estrazione con SQL PHP 1
M [MS Access] Estrazione record multipli MS Access 1
S [PHP] estrazione dal DB complicata PHP 7
asevenx [Javascript] Estrazione dal database di un valore in base ad una scelta Javascript 7
S Php e mysql, estrazione da una tabella e inserimento in un'altra tabella PHP 14
P Probelma estrazione stringa PHP 5
L Estrazione Articoli Random da Tabella senza doppioni PHP 1

Discussioni simili