Un saluto a tutti !
qualcuno mi può dire come estrarre i dati da database SQlite in formato csv con php 7
Ho provato cosi:
exec(' sqlite3 -header -csv 'test.db' "select * from table1;" > 'data.csv' ');
ma non funziona
Mille grazie in anticipo.
Un saluto a tutti !
qualcuno mi può dire come estrarre i dati da database SQlite in formato csv con php 7
Ho provato cosi:
exec(' sqlite3 -header -csv 'test.db' "select * from table1;" > 'data.csv' ');
ma non funziona
Mille grazie in anticipo.
Non funziona perché le exec non sono utilizzabili su AlterVista (e, in generale, negli hosting condivisi). Ance se lo fossero, quel codice non sarebbe portabile in quanto non puoi assumere che un client sqlite3 sia disponibile.
Devi leggere la tabella SQLite, ad esempio come mostrato in Export sqlite table using php, e poi esportare in CSV, ad esempio con fputcsv.
I suggerimenti che do più spesso:
- Le funzioni mysql_* non fanno più parte di PHP. Usa PDO o MySQLi.
- Il supporto a PHP 5.x è cessato l'1 gennaio 2019, e con esso le funzioni mysql_*. Che ti piaccia o no.
- Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
- Indenta correttamente il codice e usa nomi significativi per gli identificatori.
Molte grazie per la risposta, poi scusami sono un alle prime armi, e leggo che la funzione
fputcsv() scrive in un file CSV i dati di un array
a me serve convertire i dati di una tabella sqlite.db in formato csv
e da qualche parte ho letto che si poteva fare con ;
sqlite3 -header - csv 'test.db' "select * from table;" > data.csv
...che come tu stesso hai visto non funziona per i motivi sopra citatie da qualche parte ho letto che si poteva fare con ;
sqlite3 -header - csv 'test.db' "select * from table;" > data.csv
Funzionerebbe egregiamente se tu lavorassi da linea di comando, ma non è così.
Esatto, e...fputcsv() scrive in un file CSV i dati di un array
... puoi semplicemente mettere insieme le due cose: leggi i dati dalla tabella sqlite.db, riga per riga, e li memorizzi temporaneamente in un vettore, quindi usi fputcsv per scrivere quel vettore in un file CSV.a me serve convertire i dati di una tabella sqlite.db in formato csv
I suggerimenti che do più spesso:
- Le funzioni mysql_* non fanno più parte di PHP. Usa PDO o MySQLi.
- Il supporto a PHP 5.x è cessato l'1 gennaio 2019, e con esso le funzioni mysql_*. Che ti piaccia o no.
- Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
- Indenta correttamente il codice e usa nomi significativi per gli identificatori.
Buongiorno mzanella,
sei stato davvero gentilissimo.
Molte grazie per il suggerimento.
Ti auguro un buon inizio settimana.
Prego !
Poi se hai dubbi specifici riguardo al codice da scrivere, non farti scrupoli a chiedere.
I suggerimenti che do più spesso:
- Le funzioni mysql_* non fanno più parte di PHP. Usa PDO o MySQLi.
- Il supporto a PHP 5.x è cessato l'1 gennaio 2019, e con esso le funzioni mysql_*. Che ti piaccia o no.
- Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
- Indenta correttamente il codice e usa nomi significativi per gli identificatori.
Buonasera mzarella, ti ringrazio per la disponibilità, della quale non avrei voluto approfittare.
Ho seguito i tuoi consigli, quindi ho letto il manuale e una miriade di esempi, che ho provato a mettere in pratica, ma la maggior parte erano riferiti a versioni precedenti di sqlite.
Sono però riuscito finalmente a leggere una tabella del database, e anche ad inserire dei dati in un vettore e da questo avere un file.csv con la funzione fputcsv da te suggerita.
Ma non riesco a mettere insieme le due cose.
Se per te va bene ti mostrerei i due codici.
Certo, riporta pure i codici e vediamo il da farsi :)
Buongiorno ! ecco di seguito i codici :
selezionatab.php
<?php
class MyDB extends SQLite3 {
function __construct() {
$this->open('test.db');
}
}
$db = new MyDB();
if(!$db) {
echo $db->lastErrorMsg();
} else {
echo "Apertura database con successo\n";
}
$sql =<<<EOF
SELECT * from COMPANY;
EOF;
$ret = $db->query($sql);
while($row = $ret->fetchArray(SQLITE3_ASSOC) ) {
echo "ID = ". $row['ID'] . "\n";
echo "NOME = ". $row['NOME'] ."\n";
echo "INDIRIZZO = ". $row['INDIRIZZO'] ."\n";
echo "TELEFONO = ". $row['TELEFONO'] ."\n";
echo "EMAIL = ". $row['EMAIL'] ."\n";
echo "USER = ".$row['USER'] ."\n\n";
}
echo "Operazione conclusa con successo\n";
$db->close();
?>
creacsv.php
<?
$list = array (
array('ID', 'NOME', 'COGNOME', 'INDIRIZZO'),
array('TELEFONO', 'EMAIL', 'USER')
);
$file = fopen('file.csv', 'w');
foreach ($list as $fields) {
fputcsv($file, $fields);
}
fclose($file);
?>
Ok, cominciamo dalla scrittura del CSV. UN CSV ha una struttura di questo tipo:
che rappresenta un insieme di M elementi, ciascuno con N attributi. Ogni elemento, immaginato atomico, occupa una singola riga.Codice:valore_1_1,valore_1_2,valore_1_3,...,valore_1_N valore_2_1,valore_2_2,valore_2_3,...,valore_2_N ... valore_M_1,valore_M_2,valore_M_3,...,valore_M_N
Una struttura alternativa per rappresentare un singolo elemento è il vettore, in cui ciascuna componente contiene il valore di un attributo. In pseudocodice:
Quest'ultima rappresentazione è utile per ragionare con fputcsv: il codice per esportare un singolo elemento in formato CSV è quindiCodice:[valore_1_1, valore_1_2, valore_1_3, ..., valore_1_N]
Attento che, nel tuo codice, stai facendo una cosa piuttosto strana:Codice PHP:
$file = fopen('file.csv', 'w');
...
$row = ... // Per esempio $row = array(5, 'Mario', 'Rossi', 'via Corso 1', '0000 - 123456', 'mail@mail.it', 'user');
fputcsv($file, $row);
...
fclose($file);
ovvero stai mettendo alcuni attributi di un singolo elemento (ID, NOME, COGNOME, INDIRIZZO) in una riga, gli altri (TELEFONO, EMAIL, USER) in un'altra riga. Il "CSV" risultante sarebbe quindi:Codice:$list = array ( array('ID', 'NOME', 'COGNOME', 'INDIRIZZO'), array('TELEFONO', 'EMAIL', 'USER') );
il che non è quello che vuoi (credo).Codice:ID,NOME,COGNOME,INDIRIZZO TELEFONO,EMAIL,USER
Il tutto sta nell'ottenere il vettore con le componenti dell'elemento da esportare. Ma questo ce l'hai già in:
La variabile $row è già pronta all'uso . Mettendo -letteralmente- insieme i due codici risulta:Codice PHP:
...
while($row = $ret->fetchArray(SQLITE3_ASSOC)) {
}
...
E questo è sufficiente a far funzionare il meccanismo. Di seguito qualche indicazione su come migliorare alcune cose:Codice PHP:
...
$fd = fopen('file.csv', 'w');
$result = $db->query($sql);
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
fputcsv($fd, $fields);
}
fclose($fd);
echo "Operazione conclusa con successo\n";
...
- non estendere classi come SQLite3, usa piuttosto la composizione...
- ...azione comunque inutile in questo contesto, in quanto non hai bisogno di wrapper, adapter, decorator o simili: usa direttamente un oggetto della classe SQLite3
- usa nomi evocativi per gli identificatori, per esempio SQL è universalmente noto come acronimo di STRUCTURED QUERY LANGUAGE, dunque se chiami una variabile $sql uno si aspetta che quella variabile contenga un intero linguaggio, mentre tu la stai usando per definire una query: chiamala dunque $query; lo stesso per $ret, che immagino stia per returned value: molto più semplice chiamarla $result;
- non usare heredoc se non è necessario, la variabile $sql può essere inizializzata semplicemente come
Codice PHP:
$sql = "SELECT * from COMPANY;"
Mettendo tutto insieme, ottieni:
Codice PHP:
$db = new SQLite3('test.db');
if (!$db) {
echo $db->lastErrorMsg();
}
else {
echo "Apertura del database avvenuta con successo.\n";
}
$query = "SELECT * FROM COMPANY;";
$result = $db->query($query);
$file_handle = fopen('file.csv', 'w');
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
fputcsv($file_handle, $row);
}
fclose($file_handle);
$db->close();
echo "Operazione conclusa con successo\n";
I suggerimenti che do più spesso:
- Le funzioni mysql_* non fanno più parte di PHP. Usa PDO o MySQLi.
- Il supporto a PHP 5.x è cessato l'1 gennaio 2019, e con esso le funzioni mysql_*. Che ti piaccia o no.
- Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
- Indenta correttamente il codice e usa nomi significativi per gli identificatori.
Wow Grazie ci provo e ti faccio sapere. Mille Grazie
Ultima modifica di aessido : 28-05-2019 alle ore 11.43.35
Funziona Perfettamente !
Ultima modifica di aessido : 28-05-2019 alle ore 12.14.32
Qualcosa è andato storto nella query. Capita! Vediamo cosa aggiungendo un if... dopo l'interrogazione:
Codice PHP:
...
$result = $db->query($query);
if ($result === false) {
echo "Errore nell'interrogazione: " . $db->lastErrorMsg() . "\n";
}
...
I suggerimenti che do più spesso:
- Le funzioni mysql_* non fanno più parte di PHP. Usa PDO o MySQLi.
- Il supporto a PHP 5.x è cessato l'1 gennaio 2019, e con esso le funzioni mysql_*. Che ti piaccia o no.
- Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
- Indenta correttamente il codice e usa nomi significativi per gli identificatori.
Scusami avevo commesso un banale errore.
Non so proprio come ringraziarti !
Forse ti può interessare sapere a cosa mi serve tutto questo ?
Ultima modifica di aessido : 28-05-2019 alle ore 12.33.24
Se vuoi raccontarlo, perché no?Forse ti può interessare sapere a cosa mi serve tutto questo ?
Immagino potrebbe trattarsi di uno strumento per esportare dei dati che già possiedi in una base di dati SQLite in un formato che sia gestibile da programmi con cui vuoi elaborare quei dati, per esempio excel...
I suggerimenti che do più spesso:
- Le funzioni mysql_* non fanno più parte di PHP. Usa PDO o MySQLi.
- Il supporto a PHP 5.x è cessato l'1 gennaio 2019, e con esso le funzioni mysql_*. Che ti piaccia o no.
- Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
- Indenta correttamente il codice e usa nomi significativi per gli identificatori.
Conosci Telegram, l'app di messaggistica ?
Attraverso questa ho creato diversi BOT, che si appoggiano ad Altervista, tra cui l'ultimo, che tra le sue funzioni ha quella di georiferire su Umap (applicazione di OpenStreetMap), i dati (testo, foto) che inviano gli utenti (registrati) del BOT. Quindi come risultato si avrà una mappa con tanti punti geolocalizzati che riguardano l'argomento indicato nelle premesse del BOT stesso (ad esempio potrebbe servire per segnalare episodi di degrado urbano).
Per Umap occorrono i dati in formato ad esso compatibile, tra cui il csv. Quindi tutti gli invii, vengono registrati nel data.sqlite e poi mi serviva poter estrarli in csv.
Su non server non free l'istruzione di cui all'inizio della nostra chiacchierata avrebbe funzionato perchè indicata da chi l'ha usata. Qui grazie alla tua disponibilità !
Capito, è un bel progetto, complimenti !
I suggerimenti che do più spesso:
- Le funzioni mysql_* non fanno più parte di PHP. Usa PDO o MySQLi.
- Il supporto a PHP 5.x è cessato l'1 gennaio 2019, e con esso le funzioni mysql_*. Che ti piaccia o no.
- Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
- Indenta correttamente il codice e usa nomi significativi per gli identificatori.
Grazie, infatti ci sto lavorando da un bel pò. Attualmente, anche come prova, insieme ad amici(utenti del BOT) abbiamo distribuito per il quartiere e poi geolocalizzato alcuni dispenser gratis di bustine raccolta feci di cane.
Oltre a darne notizia il BOT servirà anche a monitorare(es. necessità rifornimento o scomparsa)
Spero di non approfittare troppo nel chiederti ancora un aiuto per creare di quel codice una
sqlite_create_function() in modo da poterla richiamare ogni volta che mi serve.
Ultima modifica di aessido : 28-05-2019 alle ore 14.36.13
Non ricordo se su AlterVista le SQLite function siano utilizzabili... mi sembra che non lo siano per MySQL, ma per SQLite non lo so.
In ogni caso puoi semplicemente creare una funzione PHP, qualcosa come:
con all'interno il codice visto in precedenza.Codice PHP:
function sqlite_to_csv($sqlite_file, $csv_file) {
...
}
I suggerimenti che do più spesso:
- Le funzioni mysql_* non fanno più parte di PHP. Usa PDO o MySQLi.
- Il supporto a PHP 5.x è cessato l'1 gennaio 2019, e con esso le funzioni mysql_*. Che ti piaccia o no.
- Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
- Indenta correttamente il codice e usa nomi significativi per gli identificatori.
Buonasera,
Proverò domani e poi ti farò sapere. In ogni caso ti ringrazio molto !
Buongiorno mzanella,
sono qui per ringraziarti ancora, e per farti sapere che da qualche giorno sto testando il progetto con esito positivo.
Prego, figurati . Mi fa molto piacere sapere che lo sviluppo sta procedendo bene!
I suggerimenti che do più spesso:
- Le funzioni mysql_* non fanno più parte di PHP. Usa PDO o MySQLi.
- Il supporto a PHP 5.x è cessato l'1 gennaio 2019, e con esso le funzioni mysql_*. Che ti piaccia o no.
- Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
- Indenta correttamente il codice e usa nomi significativi per gli identificatori.
Si sono molto soddisfatto. Grazie !
Un 'ultima cosa, è possibile far scrivere nel file csv anche il nome dei campi ?
Certo, basta che prima di iniziare a scrivere i valori nelle righe tu inserisca una riga contenente i nomi delle colonne. Qualcosa come:
Questo funziona meglio quando le colonne sono fissate a priori. Se vuoi renderlo del tuo generico puoi leggere i nomi delle colonne direttamente dal risultato della query.Codice PHP:
$file_handle = fopen('file.csv', 'w');
fputcsv($file_handle, array("Nome colonna 1", "Nome colonna 2", "Nome colonna 3"));
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
fputcsv($file_handle, $row);
}
I suggerimenti che do più spesso:
- Le funzioni mysql_* non fanno più parte di PHP. Usa PDO o MySQLi.
- Il supporto a PHP 5.x è cessato l'1 gennaio 2019, e con esso le funzioni mysql_*. Che ti piaccia o no.
- Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
- Indenta correttamente il codice e usa nomi significativi per gli identificatori.
Grazie maestro ! ... metterò subito in pratica !
Questo mi permetterà di localizzare i punti su mappa in tempi molto più brevi !
Ti farò sapere. Grazie e buon proseguimento di giornata !
Buongiorno mzanella !
Scusa il ritardo, tutto funziona perfettamente.
Ancora mille grazie !