aggiornare campo tra tabelle con cronjob | PHP

Topic: Pubblico - Composto da 6 Posts di 2 Utenti.

06 Ottobre, 2011 16:23 #1
simone191
Utente

simone191
Registrato: Oct, 2011
Posts: 4
Offline

Salve a tutti,
Utilizzo Joomla + Virtuemart e ho un gestionale locale.

Devo aggiornare le quantità degli articoli presenti sul sito con le quantità che risultano sul mio gestionale locale.
Dal DB locale posso esportare il file txt (con separatori) con i campi Codice e Quantità.
Poi dovrei aggiornare solo le quantità sulla tabella del sito.
Ovviamente sul gestionale ci sono tutti gli articoli, mentre sul sito ci sono solo quelli che ho voluto inserire online.

Il mio livello di PHP è zero (praticamente non ci capisco di programmazione).

Come posso fare?

Il mio hosting mi mette a disposizione il Cron-job tramite il cPanel.

E' possibile utilizzare i txt (o csv prodotti dal mio gestionale) per aggiornare solo le quantità nella tabella sul sito?
Si pùò fare in modo automatico utilizzando i cron-job del server? (Magari caricando periodicamente il file, in formato txt o anche in un altro formato, in una cartella dell'hosting, oppure ri-creareando proprio la tabella aggiornata anche sul web).
Che script si potrebbe usare?

Direttamente da locale a remoto è possibile?

Ci sono altre soluzioni?

Spiego più dettagliatamente le funzioni di aggiornamento.

Devo sincronizzare/aggiornare il campo "Quantità" tra due tabelle, che hanno in comune solo questi due campi: il "Codice" e la "Quantità", ma solo se il "Codice" coincide in entrambe le tabelle.

La Tabella.1 (con le quantità aggiornate). La estraggo dal DB locale del gestionale in formato txt, con i soli due campi che mi interessano: "Codice" e "Quantità".

La Tabella 2 è una tabella di Joomla (ovvero Virtuemart) che si trova sul server web dell'hosting e ha molti altri campi tra cui "Codice" e "Quantità".

Le Quantità nella Tab.2 devono essere aggiornate con i dati dalla TAB.1

Provo a spiegarmi con un esempio.

- TAB.1 - estratta in locale
Codice ; QUANTITA'
A1 ; 10
A2 ; 20
A3 ; 30

- TAB.2 - Web
...;...;...; CODICE; QUANTITA'; ...
...;...;...; A1 ; 9 ;...
...;...;...; A2 ; 15 ;...
...;...;...; B1 ; 7 ;...

Dall'esempio, le quntità di A1 e A2 presenti nella TAB.2 devono essere aggiornate, prendendo le quantità corrispondenti dalla TAB.1. Tutti gli altri campi della TAB.2 devono restare invariati.
Per i codice B1 e A3, che invece non sono presenti in entrambe le tabelle, non deve fare nulla.

Quindi alla fine vorrei avere la Tab.2 sincronizzata (aggiornata) cosi:

- TAB.2
...;...;...; CODICE; QUANTITA'; ...
...;...;...; A1 ; 10 ;...
...;...;...; A2 ; 20 ;...
...;...;...; B1 ; 7 ;...

Quindi nella TAB.2 vengono aggiornate le quantità solo per i codici corrispondenti nella Tab.1.
Tutti gli altri campi della Tab.2 restano invariati e non vengono aggiunti/modificati altri record.


In altre parole...la logica credo che dovrebbe essere (riferito all'esempio di prima):
- La Tab.1 (locale) ha solo due campi: codice e quantità (aggiornata)
- La Tab.2 (sul web) oltre al Codice, ha molti altri campi tra cui il campo quantità (da aggiornare con i dati della Tab.1)
Partendo dal campo "Codice" della Tab.2, se trova lo stesso codice nel corrispondente campo della Tab 1, allora aggiorna la quantità nella Tab.2.
Se non trova il codice nella Tab.1 non modifica niente.
Tutti gli altri campi della Tab.2 restano invariati.
...oppure (che è la stessa cosa)
Partendo dal campo "Codice" della Tab.1, se trova lo stesso codice nel corrispondente campo della Tab 2, allora aggiorna la quantità nella Tab. 2.
Se non trova il codice nella Tab.2 non modifica niente.
Tutti gli altri campi della Tab.2 restano invariati.


Server Linux
Web server Apache 1.3.42
Versione PHP 5.2.17
Versione Mysql 5.0.91

Grazie 1000

Ultima modifica 07 Ottobre, 2011 10:53 di simone191

06 Ottobre, 2011 16:36 #2
simone191
Utente

simone191
Registrato: Oct, 2011
Posts: 4
Offline

(spostato nel primo post)

Ultima modifica 07 Ottobre, 2011 06:50 di simone191

08 Ottobre, 2011 23:50 #3
fuser
Utente

fuser
Registrato: Aug, 2011
Posts: 86
Offline

Hai bisogno di un semplice script PHP che lanci una query simile alla seguente:

1UPDATE tabella1 t1 SET quantita = 
2(SELECT quantita FROM tabella2 t2 WHERE t2.codice = t1.codice);

Sì, questo script può essere eseguito con un cron job. Le modalità dipendono dal tuo server. Se puoi farlo, conviene chiamare lo script da riga di comando. Altrimenti, se hanno il browser lynx installato, puoi chiamare lynx da riga di comando passandogli l'url dello script.

------

Ma io ora sto solo rispondendo al tuo quesito. In realtà può darsi che tu abbia più bisogno di un trigger, che aggiornino le quantità in tempo reale quando la tabella del tuo gestionale viene modificata.

09 Ottobre, 2011 06:22 #4
simone191
Utente

simone191
Registrato: Oct, 2011
Posts: 4
Offline

Grazie fuser per la risposta.
Credo che il mio cron job sia da linea di comando, perché accedo al cron job direttamente dal cPanel che offre l'hosting.
Ma allora devo creare la tabella aggiornata (tabella2) sul DB dell'hosting?
Cioè secondo il tuo script:
la tabella1 è jos_vm_product (che sarebbe la tabella sul sito joomla)
la tabella2 è la tabella aggiornata (che devo creare io e deve stare sull'hosting?)

Quindi per poter eseguire quello script dovrei prima trasformare il file txt che ho in locale in SQL (adattandolo per dargli una struttura come quella della tabella da aggiornare) e poi da questo SQL creare una tabella nel database che ho sull'hosting (che sarà quindi la tabella2 aggiornata che userà lo script ogni volta che viene eseguito in modo automatico - ogni giorno all'orario impostato nel cron job).
Giusto?

Non devo aggiornare in tempo reale, è sufficiente una sincronizzazione al giorno, per questo avevo pensato al cron job.

Non so come si usa (o se c'è la possibilità di usarlo sul mio hosting) il browser lynx.

Ultima modifica 09 Ottobre, 2011 06:24 di simone191

09 Ottobre, 2011 09:07 #5
fuser
Utente

fuser
Registrato: Aug, 2011
Posts: 86
Offline

Se non è necessario non usarlo, avranno per forza un minimo di documentazione che dice come lanciare uno script PHP con un cron job.

Il problema è che le tabelle sono su due db diversi? Ma se sono tutti e due sul tuo hosting la query funziona lo stesso, basta che specifichi i nomi dei db:
nome_database.nometabella

Se invece il db del gestionale non è in hosting, valuta tu se fare uno script che legge il file riga per riga, o se caricare tutto in una tabella temporanea con un LOAD DATA INFILE e poi eseguire la query che ti ho detto. Considera che col secondo metodo lanci solo due query, mentre col primo per ogni record lanci una query separata, con conseguente comunicazione client/server.

09 Ottobre, 2011 14:27 #6
simone191
Utente

simone191
Registrato: Oct, 2011
Posts: 4
Offline

Ho risolto,

Grazie fuser, non potevo capire quello che mi avevi suggerito perché era veramente troppa la mia ignoranza.
Grazie al tuo suggerimento ho iniziato a cercare e qualcosa l'ho capita. Resto sempre ignorante in materia, ma un po' meno di prima.

Riepilogo il tutto magari può tornare utile a qualcuno.

Ho un vecchio gestionale locale.
Poi ho fatto un sito web e-commerce, ma voglio continuare a utilizzare il vecchio gestionale.
Tutti gli ordini passano da qui, anche quelli che prendo dal sito web (con il gestionale emetto le fatture e scarico le giacenze di magazzino - gli ordini non arrivano solo dal sito, anzi).

Ho quindi necessità di sincronizzare almeno le giacenze degli articoli tra gestionale e sito.

Sul sito ci inserisco parte degli articoli che ho sul gestionale.
Ovviamente gli articoli, che si corrispondono sul gestionale e sul sito, li chiamo con lo stesso codice.

Dal gestionale locale posso esportare solo un file in formato txt.
Ho due campi, Codice e Quantità (separati dal punto e virgola).
Apro il txt con il foglio elettronico e aggiungo una colonna che utilizzerò per il campo product_id.
Prima di salvare, formatto tutte le caselle come TESTO e quindi salvo in formato CSV.

Poi con PhpMyAdmin, ho creato la tabella sul data base:
jos_vm_product_agg

La struttura è con 3 campi

-- Struttura della tabella `jos_vm_product_agg`
--

CREATE TABLE IF NOT EXISTS `jos_vm_product_agg` (
`product_id` int(11) NOT NULL auto_increment,
`product_sku` varchar(64) NOT NULL default '',
`product_in_stock` int(11) NOT NULL default '0',
PRIMARY KEY (`product_id`),
KEY `idx_product_sku` (`product_sku`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Quindi i 3 campi hanno la stessa struttura della tabella da aggiornare.

Poi ho utilizzato il file CSV per caricare i dati aggiornati del gestionale nella tabella jos_vm_product_agg (ogni volta che devo aggiornare svuoto e reimporto i dati con il nuovo CSV).

Poi basta eseguire lo Script direttamente dal PhpMyAdmin → seleziona il DB → seleziona la tabella jos_vm_product → SQL (voce di menu, per eseguire gli script).
Ci scrivo:

UPDATE `jos_vm_product` t1 SET product_in_stock =
(SELECT product_in_stock FROM `jos_vm_product_agg` t2 WHERE t2.product_sku = t1.product_sku)

(grazie ancora fuser)

e le quantità sono aggiornate in 0.0004 sec.
Esattamente quello che volevo.

Dovendo entrare in PhpMyAdmin (per aggiornare la tabella jos_vm_product_agg), a questo punto non ha senso impostare il cronjob. Subito dopo lancio lo script ed è fatto l'aggiornamento.

Ultima modifica 13 Ottobre, 2011 11:03 di simone191

Condividi su:

Loggati o Registrati per replicare