Newsgroup: it.comp.www.php
Titolo: ottenere l'ultimo id della tabella con PDO

ho letto in rete di tutto e di più ma non son riuscito a farmi una 
indea 
valida per sostituire questo script in PDO. 
 
 $next_id_query= "SHOW TABLE STATUS LIKE 'notizie'";
 
$next_id_query_result = mysql_query($next_id_query);
 
$row = mysql_fetch_object($next_id_query_result);
 
 $id = $row->Auto_increment;
 
 
Qualcuno ha per le mani qualcosa di semplice ?
altrimenti faccio la query e connessione al database in mysqli e ciao 
... 
 
ciao 
Enrico 		 


ma.. "SELECT MAX(id)+1 FROM notizie" no? :/
 
se non vuoi perchè pensi che ci possano essere righe cancellate e ancora
riferite da altre tabelle allora il tuo problema è un altro ;)
 
Ciao!

 Ciao!
 
Appunto, ci possono essere righe cancellate .. quindi non va bene .
 
Grazie comunque 
 
Enrico 

 
 
sì, non hai capito il senso del mio post: la query che ti ho scritto va sempre
bene, a meno che la tua base di dati non abbia seri problemi di consistenza.
 
Ciao!


 
Mi hai risposto in privato invece che sul NG :)
 
Comunque, allora perché non fai la stessa cosa in PDO?
 
$stmt = $pdo->query("SHOW TABLE STATUS LIKE 'notizie'");
$arr = $stmt->fetch();
echo $arr['Auto_increment'];
 
Sarei anche curioso di sapere a che ti serve, a questo punto :)
 
Ciao!

 Qualcuno ha per le mani qualcosa di semplice ?
 
C'è un problema di fondo: stai facendo una cosa sbagliata.
Non dovrebbe minimamente interessarti il prossimo id di un campo 
auto_increment.
Inserisci una riga e fatti dire cosa ha ricevuto.
 
I motivi sono tanti:
 
1- PHP non gira un processo alla volta. Con un minimo di concorrenza di 
connessioni, quell'id che prendi non è valido.
 
2- Se usi InnoDB con le transazioni, quell'id potrebbe venire preso e 
subito cancellato da un'altra transazione in atto.
 
3- Da quando lo prendi a quando lo usi passa del tempo, ed è già 
un'informazione sbagliata.
 
4- Alcune tabelle possono essere configurate per skippare gli id (per 
esempio per avere id spalmati in un cluster)
 
5- Il tuo sistema funziona solo con MySQL. Appena cambi DB non funziona 
più.
 
Rivedi la tua architettura. È semplicemente sbagliata.
 
Bye.

 Ciao!
 
a parte che è un relazionare e quell'id deve andare anche su altre 
tabelle, poi nella riga  id "xxx", ci va il nome di  immagini xxxA xxxB 
xxxC , viene memorizzato il nome di un file che si crea dove si va a 
scrivere dei dati xxxFILE.inc  etc.. 
 
Ciao 
Enrico
 


C'è la PDO::lastInsertId, ma avventurarsi sui campi autoincrementanti è un quasi sicuro abbandonare la portabilità fra DB visto che ognuno gestisce la faccenda a modo suo. D'altra parte la query che presenti è in stretto dialetto MySQL, non c'è da stupirsi che non riesci a tradurla in un abstraction layer. Raccomanderei di cercare di svincolarsi dal "mysql way" e usare una logica diversa... 
 
bye!!
 

 
 
Allora hanno ragione gli altri, stai sbagliando approccio, in maniera grave
anche.
 
devi, in ordine:
- inserire la riga
- prendere l'id appena inserito
- usare questo id per quello che ti serve
 
Per un attimo pensavo ti servisse il dato per fare qualche tipo di
pannello/statistica (tipo phpMyAdmin) per qualche strano motivo (che so,
sapere quante righe "butti" per una certa operazione), ma se ti serve per
quello che hai scritto allora fai come ti hanno già scritto.
 
Ciao!

 
 
 
vorrei ridurrei i passaggi che l'utente fa per arrivare all'output 
definitivo .
 
comunque tutto chiaro .
 
grazie
 


mi sa che ti ho risposto in posta e non sul gruppo , poi mentre inviavo  
mi son reso conto di aver detto una stronzata; se apro una transazione 
ho già l'id giusto , non mi serve incrementarlo .
 
grazie
enrico

 definitivo .
 
Non capisco bene i passaggi che dovrebbe fare l'utente, ma alla peggio, 
aggiungi una colonna "status" alla tabella:
 
1- inserisci una riga con status 0 (o "new" o false o quello che 
preferisci. Io preferisco i numeri così posso aggiungere stati in seguito 
e uso costanti in PHP per identificarli). Questo puoi farlo di nascosto 
quando l'utente inizia la procedura.
 
2- ti fai dare il lastInsertId() da PDO
 
3- Usi quell'id per tutto quello che è relazionato a quella riga (altre 
tabelle, file, ecc.)
 
4- Quando l'utente ha finito, ti basta dare un update e portare lo stato 
a 1 (o "confirmed" o true, ecc.)
 
Questo ti permette di manterere le relazioni coerenti, e anche di usare 
l'integrità referenziale di InnoDB (che stai usando, se usi le 
transazioni), e quindi di non trovarti dati o file orfani in altri posti.
 
Se hai anche una colonna "created_on" o simile con la data di creazione 
di quella riga, in futuro puoi anche prevedere un "delete * from laTabella 
where status = 0 and created_on < date_sub(now(), 30 days)" o qualcosa 
del genere per ripulire il DB.
 
Bye.

 Bye.
 
Se uso la transazione e  l'utente non passa da comit()
non c'è un tempo di scadenza delle  transazioni ? 
 
non fa un rolback in automatico dopo un determinato periodo di tempo ?
 
(PS. Alessandro , scusa , ti ho risposto nuovamente in privato , non 
volendo.) 

 non c'è un tempo di scadenza delle  transazioni ?
 
Non c'è un timeout. Semplicemente quando chiudi la connessione al 
database viene fatto il rollback, se non hai specificato il commit 
esplicitamente.
 
Questo, in PHP, significa prima che i dati arrivino al client.
 
Bye.