PDA

Visualizza la versione completa : [DELPHI]: Un database interoperabile con server PHP


firefox88
21-08-2006, 17:45
Ho un problema piuttosto complesso, e spero di riuscire a farvi capire di cosa si tratta.

Devo realizzare un programmino in Delphi che gestisce dei dati, i quali all'occorrenza devono essere esportati su un server remoto per essere visualizzati in un sito web (scritto in PHP).
In Delphi, la cosa in assoluto più comoda è utilizzare un database MSAccess. PHP può maneggiare gli .mdb senza problemi, purché sia installato su un server Windows. E questo non è il mio caso.

Come posso fare?

Io ho bisogno di un database che sia manovrabile sotto forma di file unico (tipo gli .mdb) sia in locale che in remoto, e che sia compatibile sia con PHP su Linux, sia con Delphi.
Esiste una cosa del genere, oppure sono costretto a creare un mio formato, e scrivermi un parser sia in Delphi che in PHP? :oVVoVe:

Grazie

alka
21-08-2006, 18:08
Originariamente inviato da firefox88
In Delphi, la cosa in assoluto più comoda è utilizzare un database MSAccess. PHP può maneggiare gli .mdb senza problemi, purché sia installato su un server Windows. E questo non è il mio caso.
C'è qualcosa che non quadra. Non invierai mica l'intero archivio Access al server, spero. :stordita:


Originariamente inviato da firefox88
Io ho bisogno di un database che sia manovrabile sotto forma di file unico (tipo gli .mdb) sia in locale che in remoto, e che sia compatibile sia con PHP su Linux, sia con Delphi.
Esiste una cosa del genere, oppure sono costretto a creare un mio formato, e scrivermi un parser sia in Delphi che in PHP?

Basta prendere un database che sia disponibile sia su Windows che su Linux.
Ad esempio, potresti utilizzare FireBird.

Io però nutro seri dubbi sulla "dinamica" di condivisione del database... :master:

firefox88
21-08-2006, 19:02
Originariamente inviato da alka
C'è qualcosa che non quadra. Non invierai mica l'intero archivio Access al server, spero. :stordita:

Perché no? Non è una grande quantità di dati, si tratta di pochi MB e comunque non ho limiti di spazio. Basta fare upload via FTP, lo può fare anche Delphi coi componenti Indy. Dov'è il problema?

Non posso far sì che il programma Delphi si connetta ad un DB remoto perché per una serie di ragioni il DB deve essere sempre disponibile anche in locale e in assenza di una connessione a Internet.



Originariamente inviato da alka
Basta prendere un database che sia disponibile sia su Windows che su Linux.
Ad esempio, potresti utilizzare FireBird.

I componenti Delphi per maneggiare i DB Firebird esistono? Da dove si scaricano?
Esistono delle librerie PHP?


Grazie di tutto, alka.

alka
21-08-2006, 19:11
Originariamente inviato da firefox88
Perché no? Non è una grande quantità di dati, si tratta di pochi MB e comunque non ho limiti di spazio. Basta fare upload via FTP, lo può fare anche Delphi coi componenti Indy. Dov'è il problema?

Mi sembra uno spreco, oltre al fatto che è parecchio limitante... se devi cambiare DB, diventa un dramma. Ops... è proprio il problema corrente. :zizi:


Originariamente inviato da firefox88
Non posso far sì che il programma Delphi si connetta ad un DB remoto perché per una serie di ragioni il DB deve essere sempre disponibile anche in locale e in assenza di una connessione a Internet.

Questo lo ritengo normale, più per questioni di performance e sicurezza piuttosto che per la disponibilità di una connessione ad Internet.


Originariamente inviato da firefox88
I componenti Delphi per maneggiare i DB Firebird esistono? Da dove si scaricano?
Esistono delle librerie PHP?
E' possibile utilizzare FireBird sia con i componenti IBX (InterBase Express) che con la libreria dbExpress. Sono inclusi in Delphi.

Per le librerie PHP, vi sono delle estensioni apposite, ma questo argomento esula dalla trattazione di questo forum.

In ogni caso, io adotterei un approccio differente rispetto all'upload di un database: cosa avviene se qualcuno usa il database sul sito quando stai facendo l'upload? Si rischia una facile corruzione dei dati, oltre al fatto che la soluzione è poco adattabile ad una differente base dati che potrebbe esserti richiesta (come effettivamente è successo) e non in tutti i casi è possibile, senza contare che con l'aumentare dei dati i tempi di upload si allungano notevolmente a dismisura.

Il sito dovrebbe contenere apposite pagine adatte alla raccolta dei nuovi dati per effettuare una specie di sincronizzazione, passando ad esse, magari in formato XML (ma è solo un'ipotesi), i dati da aggiungere alla base dati (quelli inseriti di recente o modificati); in alternativa, si potrebbe fare uso di Web Service, pienamente supportati da Delphi.

firefox88
21-08-2006, 20:05
Originariamente inviato da alka
Mi sembra uno spreco, oltre al fatto che è parecchio limitante... se devi cambiare DB, diventa un dramma. Ops... è proprio il problema corrente. :zizi:
Perché?



Originariamente inviato da alka
E' possibile utilizzare FireBird sia con i componenti IBX (InterBase Express) che con la libreria dbExpress. Sono inclusi in Delphi.
Perfetto.



Originariamente inviato da alka
Per le librerie PHP, vi sono delle estensioni apposite, ma questo argomento esula dalla trattazione di questo forum.
Tutto sta a convincere i fornitori di servizi a installarle, queste estensioni... Mi informerò.



Originariamente inviato da alka
In ogni caso, io adotterei un approccio differente rispetto all'upload di un database: cosa avviene se qualcuno usa il database sul sito quando stai facendo l'upload?
Beh, basta fare così: il database si chiama data.ext, il file caricato si chiama data_new.ext, poi si elimina data.ext e si rinomina data_new.ext in data.ext. Il database smette di funzionare per qualche millisecondo, e non mi sembra una tragedia, visto che gli utenti del sito possono solo visualizzare i dati, e non modificarli.



Originariamente inviato da alka
Il sito dovrebbe contenere apposite pagine adatte alla raccolta dei nuovi dati per effettuare una specie di sincronizzazione, passando ad esse, magari in formato XML (ma è solo un'ipotesi), i dati da aggiungere alla base dati (quelli inseriti di recente o modificati); in alternativa, si potrebbe fare uso di Web Service, pienamente supportati da Delphi.
Quindi per ogni operazione sul database, il programma in Delphi dovrebbe inviare due query, una in locale e una in remoto, o generare dei file .sql (tipo quelli prodotti da phpMyAdmin) per l'aggiornamento parziale del database. E' un'idea, ma sarebbe più semplice una rozza sostutizione del file :stordita:

alka
21-08-2006, 20:21
Originariamente inviato da firefox88
Perché?

Come fai a chiedermi "perché?" dell'esistenza di un problema che è proprio il problema che stai affrontando?


Originariamente inviato da firefox88
Beh, basta fare così: il database si chiama data.ext, il file caricato si chiama data_new.ext, poi si elimina data.ext e si rinomina data_new.ext in data.ext. Il database smette di funzionare per qualche millisecondo, e non mi sembra una tragedia, visto che gli utenti del sito possono solo visualizzare i dati, e non modificarli.

Il problema non è nello "stop" della visualizzazione dei dati, ma il rischio di perderli durante l'operazione, la possibilità di trovare il file bloccato durante il tentativo di cancellazione (poiché vi è una connessione aperta), l'impossibilità di riprodurre lo stesso meccanismo con altri database, l'eventualità che l'aumento di dati che potrebbe allungare a dismisura i tempi di trasferimento, richiedendo anche più connessioni, la scarsa sicurezza, la possibilità di individuare le credenziali di autenticazione durante il trasferimento...


Originariamente inviato da firefox88
Quindi per ogni operazione sul database, il programma in Delphi dovrebbe inviare due query, una in locale e una in remoto, o generare dei file .sql (tipo quelli prodotti da phpMyAdmin) per l'aggiornamento parziale del database.
No, per ogni operazione sul database ovviamente no. La sincronizzazione avviene nel momento in cui la si vuole fare, non per ogni scrittura sul database, ma vengono spedite in modo personalizzato, controllato ed eventualmente protetto solo le modifiche apportate ai dati, inviando la differenza e risparmiando banda.


Originariamente inviato da firefox88
E' un'idea, ma sarebbe più semplice una rozza sostutizione del file :stordita:

Certo, è più semplice, ma io in genere preferisco dare un peso maggiore ad altri aggettivi, quali affidabile, sicuro, controllato, ottimale. :)

firefox88
21-08-2006, 20:31
Originariamente inviato da alka
Come fai a chiedermi "perché?" dell'esistenza di un problema che è proprio il problema che stai affrontando?
Non avevo capito quello che stavi dicendo...



Originariamente inviato da alka
No, per ogni operazione sul database ovviamente no. La sincronizzazione avviene nel momento in cui la si vuole fare, non per ogni scrittura sul database, ma vengono spedite in modo personalizzato, controllato ed eventualmente protetto solo le modifiche apportate ai dati, inviando la differenza e risparmiando banda.
OK. Quindi, mentre l'utente lavora col programma, viene scritto automaticamente un file "changes.sql" con semplici istruzioni SQL che poi vengono date in pasto a phpMyAdmin per l'aggiornamento di un database MySQL.
Quindi utilizzo Access/Firebird in locale -> conversione in semplici istruzioni SQL (UPDATE, INSERT...) -> MySQL in remoto. Semplice ed affidabile.... Oppure no? :(

Visto che gli utenti di questo programma sarebbero persone "qualsiasi" (quindi non in grado di utilizzare phpMyAdmin) potrei creare una procedura, in Delphi, per connettersi direttamente al server MySQL remoto ed effettuare la sincronizzazione?

alka
21-08-2006, 21:35
Originariamente inviato da firefox88
OK. Quindi, mentre l'utente lavora col programma, viene scritto automaticamente un file "changes.sql" con semplici istruzioni SQL che poi vengono date in pasto a phpMyAdmin per l'aggiornamento di un database MySQL.
Può essere un'idea, ma si può fare come si vuole, c'è totale libertà: puoi anche scrivere un file in un formato personalizzato memorizzando i record modificati ed eseguire gli statement successivamente.


Originariamente inviato da firefox88
Quindi utilizzo Access/Firebird in locale -> conversione in semplici istruzioni SQL (UPDATE, INSERT...) -> MySQL in remoto. Semplice ed affidabile.... Oppure no? :(

Puoi utilizzare il database che preferisci, sia in locale, che in remoto.
Con un protocollo personalizzato o usando un Web Service, puoi stabilire una comunicazione tra l'applicazione Delphi e la pagina PHP che riceve i dati e trasferire in un senso o nell'altro, beneficiando dei metodi dell'eventuale Web Service, per sincronizzare le basi di dati.


Originariamente inviato da firefox88
Visto che gli utenti di questo programma sarebbero persone "qualsiasi" (quindi non in grado di utilizzare phpMyAdmin) potrei creare una procedura, in Delphi, per connettersi direttamente al server MySQL remoto ed effettuare la sincronizzazione?
La pagina PHP a cui invii i dati la fai tu, scrivendo il codice necessario a gestire i dati in arrivo e restituire un responso, in sostanza a compiere le operazioni che servono.

Gli utenti della tua applicazione non devono usare le interfacce di amministrazione.

Ciao! :ciauz:

firefox88
21-08-2006, 21:42
Questa mi sembra la soluzione in assoluto migliore. Con Indy invio i dati di aggiornamento (sotto forma di semplici istruzioni SQL), col metodo POST ad una pagina PHP che poi eseque query MySQL.
Ovviamente, assieme alla query mysql, il programma invia in POST anche una parola chiave! Quindi è meglio se tutto avviene in HTTPS :)

Loading