Newsgroup: it.comp.www.php
Titolo: mysql_insert_id()

Salve,
esempio: ho 3 tabelle, figli, genitori, iniziative.
Tab_figli
idf nome idg
Tab_gen
idg nome
Tab_iniz
idi dati idg idf
Quindi + iniziative possono puntare ad un genitore e + figli possono
puntare ad un genitore (un genitore può anche non avere figli).
Io adesso faccio inserire i dati del genitore, li faccio poi
registrare nel database e mi prendo l'id con mysql_insert_id() e lo
conservo con una variabile di sessione.
Poi chiedo se devono inserire anche i dati di un figlio, se "si" si
apre il form e faccio inserire i dati, li registro poi nel database
inserendo  l'id del genitore prima ricavato con mysql_insert_id().
Con un altro mysql_insert_id() mi prendo l'id del figlio e lo conservo
sempre con le sessioni.
Poi si passa all'inserimento dei dati dell'iniziativa. Si inseriscono
i dati e poi li registro inserendo l'id del figlio e del genitore (che
sono entrambi variabili di sessione).
Il tutto funziona ma se qualcuno interrompe la registrazione
dell'iniziativa mi rimangono dei dati trinchi, per esempio dati di
genitori e/o figli che non puntano a nessuna iniziativa. Per adesso ho
fatto un semplice procedimento che mi cerca gli inserimenti tronchi e
me li cancella (con join.. NULL ecc...).
Ho pensato allora che sarebbe + comodo fa inserire prima tutti i dati
(dei genitori, figli, dell'iniziativa) e poi solo dopo l'ultimo submit
registrarli effettivamente nel database.
Ovviamente i dati li salverei nelle sessioni.
Il procedimento finirebbe con:
insert into genitori
mysql_insert_id
insert into figli
mysql_insert_id
insert into iniziative
Dite che comunque mi posso affidare tranquillamente a quei 2
mysql_insert_id?
Grazie
-- 
Per rispondermi togli il cappello

 insert into iniziative
"COMMIT" or "ROLLBACK"
se la serie di query va farsi fottere non inserisce una mazza


"START TRANSACTION;";
Ok, però non ho capito bene come impostare la/le query.
Cioè, faccio:
SET autocommit=0;";
"START TRANSACTION;";
" insert into tab..."
ma poi l'ultimo id come lo pesco per andare avanti con le altre?
Posso usare codice php anche in mezzo a Start transaction e COMMIT?
Sto guardando il manuale di mysql ma non riesco a capire molto...
Grazie..


Grazie..
Scusa, ho provato a fare delle prove...
Va bene cosě?
prima
idp nome
seconda
ids cognome idprima
START TRANSACTION;
INSERT into prima SET nome='pippo';
insert into seconda set cognome='pluto', idprima=last_insert_id();
COMMIT;


L'Ignorante wrote:

infatti forse e' meglio se leggi meglio il manuale MySQL riguardo alle
transazioni.. non credo che tu ne abbia appreso appieno l'utilita'..
-- 
www.iuz-lab.info



Lo sto leggendo ma mi blocco in alcuni punti, per esempio:
inserisco i dati di genitore.
inserisco i dati del figlio mettendo come idgen last_insert_id e
funziona.
poi devo inserire i dati di iniziativa dove devo mettere sia l'idgen
che l'idfiglio. Ma idgen come faccio a tirarlo fuori ancora?
Dovrei fare ancora select idgen from figlio where
idfiglio=last_insert_id?
Dove posso trovare della documentazione italiana sulle transazioni?
Grazie


 puoi fare una transazione
Il problema della memorizzazione dei dati non è del db, ma della 
sequenza da seguire per quanto riguarda il riempimento dei form, nel 
senso che se l'utente chiude inavvertitamente il browser, ci sono dei 
dati di gentori ed eventualmente figli nel db che non fanno riferimento 
ad alcuna iniziativa.
Quindi, in questo caso, cosa può farci con una transazione per quanto 
riguarda il db?
Io suggerirei di memorizzare tutti i dati che vengono via via inseriti 
(genitori, figli, iniziative) in vettori (o classi) e salvare il tutto 
dopo sul db, una volta che sei certo di avere tutti i dati necessari.
Per passare i dati (=vettori) da una pagina all'altra puoi utilizzare 
tranquillamente le sessioni
-- 
Ciao,
	Fabrizio
===  
http://www.negusweb.it
  ===



Infatti era la mia idea iniziale. Tenermi tutti i dati, verificare man
mano che arrivino tutti a destinazione e alla fine inserirli nel db.
Ogni volta dovrò pigliarmi un mysql_insert_id e pregare che vada tutto
secondo le intenzioni. Oppure mi chiedevo se si può fare tutto con una
query... o una serie di query inserite in una transaction, del tipo:
insert into tab1
insert into tab2 set campo=last_insert_id()
...però poi dovrei fare una
insert into tab3 set campo=(id del record inserito in tab1),
campo2=last_insert_id() <--- che è del record inserito in tab2.
Ma mi affiderò a php penso.


 
begin;
insert into..
<?php // ?>
insert into..
update table..
<?php // ?>
commit;
da begin a commit niente interferira' con i dati
inseriti/eliminati/modificati nel db permettendoti liberta' e sicurezza di
azione..
spero che dall'esempio capirai altrimenti ti consiglio un buon libro SQL..
-- 
www.iuz-lab.info

spero che dall'esempio capirai altrimenti ti consiglio un buon libro SQL..
Quello che non capivo era se fosse possibile appunto mettere del
codice php tra l'inizio della transazione e la fine. Pensavo che il
tutto dovessere stare, per capirci, in una mysql_query();
Comunque mi documenterò sicuramente... i manuali sql solitamente non
spiegano bene come usare le query inserite in altri linguaggi.
Un buon link in italiano sull'sql che non sia quello di mysql?
Grazie


 Ma mi affiderò a php penso.
D'altronde PHP è il mezzo per lavorare sul Db, nel nostro caso.
A chi altro volevi affidarti ?


A chi altro volevi affidarti ?
Eh, pensavo che una volta avuti tutti i dati utili (a parte gli id)
riuscissi a farlo al volo con istruzioni sql... ma non lo conosco
bene.


 
link non saprei, l'unica cosa che posso consigliarti e' l'acquisto del
libro..
La Guida Completa SQL Seconda edizione
Mc Graw Hill
James R. Groff Paul N. Weinberg
ISBN 88-386-4313-X
dovrebbe costare 59,00 Euro ma ti assicuro che anche se risale al 2003 vale
la pena la spesa..
tratta anche decentemente le transazioni..
-- 
www.iuz-lab.info

 bene.
Ma il SQL lavora sul db e quindi farlo al volo con istruzioni SQL 
significa lavorare sul DB. E la fase del DB dovrebbe essere quella 
finale in un progetto di questo tipo, e non intermedia come vorresti fare.


finale in un progetto di questo tipo, e non intermedia come vorresti fare.
Pensavo di poterlo utilizzare proprio alla fine... un'iniziativa punta
ad un genitore e al + ad un figlio. Quindi io arrivo alla fine che ho
tutti i dati che mi servono, ma dovrei fare 3 inserimenti (gen,
figlio, iniziativa) e in iniziativa devo mettere l'id del genitore e
l'id del figlio. Pensavo si potesse fare con una query e
transaction... ma non sapendo come fare, e non ho ancora capito se lo
posso fare, uso per prendere gli id la mia cara mysql_insert_id e
faccio le 3 query separate (potrei mettere bagin....commit ma penso
che non siano necessarie, o comunque non conoscendo ancora bene il
meccanismo delle transazioni posso farne a meno.... tipo la volpe e
l'uva).


 l'uva).
http://dev.mysql.com/doc/mysql/en/commit.html


http://dev.mysql.com/doc/mysql/en/commit.html
Spero di aver capito:
prima: idp - nome 
seconda: ids - cognome - idprima
terza: idt - idprima - idseconda
SET AUTOCOMMIT=0;
START TRANSACTION;
INSERT INTO prima SET nome='paolo';
SET @IDG=LAST_INSERT_ID();
INSERT INTO seconda SET cognome='rossi', idprima = @IDG;
SET @IDF=LAST_INSERT_ID();
INSERT INTO terza set idprima = @IDG, idseconda = @IDF;
COMMIT;
Penso sia quello che volevo ottenere inizialmente ma non sapevo ancora
come fare.
