[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [postgresql-it] query insert ricorsiva



Rieccomi,
ho trovato una soluzione mooolto poco ortodossa e che non mi convince tanto, vi spiego con un esempio pratico:
ho una tabella "sito", ogni sito può avere più estremi cronologici e più riferimenti bibliografici gestiti entrambi da tabelle separate e collegate all'id del sito.
Nell'interfaccia grafica (php+jquery), ho aggiunto un pulsante che permette all'utente di inserire più "cronologie" e più "bibliografie".
Ho impostato 2 "contatori", 1 per la cronologia e 1 per la bibliografia. Per ogni riga aggiunta o eliminata i contatori s'incrementano o si decrementano (si dice così?). Aggiungo il numero di riga anche ai campi, in modo tale da avere qualcosa tipo : <input class="nomecampo'+contatore+'"/>
Grazie a questo sistema posso impacchettare i dati da mandare  al file php che gestisce l'inserimento; il codice di jquery che utilizzo è:
#var fasi = '';
#var queryFasi = '';
#var id_cronologia ='';
#var id_definizione ='';
#var id_tipologia = '';
#$(".riga").each(function(){
#  $(this).each(function(){
#     var posizione = $(this).attr('rel');
#     id_cronologia= $('.id_cronologia'+posizione).val();
#     id_definizione= $('.id_definizione'+posizione).val();
#     id_tipologia= $('.id_tipologia'+posizione).val();        
#     queryFasi+= id_tipologia + ','+id_definizione+','+id_cronologia+'|';
#     fasi= queryFasi;
#  });
#});
e infine

#$.ajax({
#    url: 'inc/sito_insert_script.php',
#   type: 'POST', 
#    data: {..., fasi:fasi, biblio:biblio}
#   ...
ovviamente vi ho scritto una parte per non dilungarmi inutilmente!!! Lo stesso codice per l'altra tabella.
Il codice del file php (le parti salienti!):

#$fasi = $_POST['fasi'];
#$fasiTrim = substr($fasi, 0, -1); //tolgo l'ultimo carattere |
#$arrayFasi = explode("|", $fasiTrim); //creo l'array
#$r = count($arrayFasi); //conto gli elementi dell'array
#//inserisco il record principale
#$insert = ("BEGIN; INSERT INTO sito(id_comune, id_localita, .....);  COMMIT;");
#$result = pg_query($connection, $insert);
#$maxId=("select max(id_sito) as id_sito from sito;"); //recupero l'id dell'ultimo record inserito
#$result = pg_query($connection, $maxId);
#...
#$sito = pg_result($result, 0,"id_sito");
#//"ciclo" le query
# for($x = 0; $x < $r; $x++){
#  list($tipo, $definizione, $crono) = explode(",", $arrayFasi[$x]);
#  $queryFasi = ("begin;insert into cronologia (id_sito,id_cronologia, id_tipologia, id_definizione) values ($sito, $crono, $tipo, #  $definizione);commit;");
#  $resultFasi = pg_query($connection, $queryFasi);
#}

Il tutto replicato anche per l'altra tabella...
Ora, facendo dei controlli rigidissimi sull'inserimento da parte dell'utente fila tutto liscio ma, come potete ben capire se qualcosa va male ho un database incoerente, ad esempio può andare male solo 1 delle 3 transazioni con relativa perdita di dati; o ancora, appare il messaggio di errore relativo all'inserimento della cronologia, l'utente prova a reinserire l'intero record ma non ci riesce perché quel sito già esiste (infatti la transazione del record principale si è conclusa correttamente!).
Mi rendo conto che la procedura corretta prevede una sola transazione...ma come?

Per ora funziona tutto, ma so che il baco malefico è in agguato!
Cosa mi consigliate? 


Il giorno 30 marzo 2012 07:24, Giuseppe Naponiello <beppenapo@xxxxxxxxx> ha scritto:
Salve a tutti,
da qualche giorno mi sono bloccato su un'operazione.
Ho un form php, i dati vengono salvati in più tabelle collegate, lo schema è +/- questo:
campi 1-2 -> tab1
campi 3-4-5 -> tab2
campi 6-7-8 -> tab3

Nel form do la possibilita all'utente di replicare i campi delle tabelle 2 e 3. Il risultato è che per ogni record della tab1 posso inserire n sequenze di campi delle tab 2 e 3:
campi 1-2
  campi 3-4-5
  campi 3-4-5
  ....
  campi 6-7-8
  campi 6-7-8
  campi 6-7-8
  ...

I campi delle tabelle 2 e 3 sono sia integer che testo.
Con jquery creo una stringa per ogni campo:

# var campo3 ='';
# $(":input.campo3").each(function(){campo3+= $(this).val() + ',';}); 
#...

lo script d'inserimento "esplode" questa stringa:
#$arrayCampo3 = explode(",", $campo3);

...e poi?
Pensavo di fare una classica query tipo:
#begin;
#insert into tab1(....)values(...);
#insert into tab2(...)values(currval(id_seq_tab1)....);
#insert into tab3(...)values(currval(id_seq_tab1)....);
#commit;

...ma ovviamente devo creare un ciclo per le tabelle 2 e 3, quindi devo prima recuperare l'ultimo id inserito nella tab1

E qui mi fermo! Non so come impostare il ciclo! Forse c'è una soluzione più agevole?
Ogni consiglio è ben accetto

Grazie e buona giornata a tutti

-beppe-



--
-beppe-