Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    26

    MySQL e last_inserted_id()

    Ciao a tutti, ho un problema riguardo ad una query sql che viene eseguita nel momento in cui viene creata una nuova discussione in un forum (due tabelle: forum_topic e forum_thread).
    Al momento della creazione di una nuova discussione vengono popolate entrambe le tabelle.

    Se eseguo la seguente query via phpmyadmin funziona correttamente, in forum_thread viene ricavato automaticamente l'ID del topic appena inserito:

    codice:
    INSERT INTO forum_topic (forum_id,utente,titolo) VALUES (3,2,"titolo");INSERT INTO forum_thread (topic_id,utente,testo) VALUES (LAST_INSERT_ID(),2,"testo")
    mentre se la stessa query la eseguo dalla pagina php riscontro un errore:

    Codice PHP:
    <?
    mysql_query
    ('INSERT INTO forum_topic (forum_id,utente,titolo) VALUES (3,2,"titolo");INSERT INTO forum_thread (topic_id,utente,testo) VALUES (LAST_INSERT_ID(),2,"testo")');
    // ERRORE
    ?>
    Vorrei evitare di eseguire 2 query separate utilizzando mysql_insert_id() in quanto se viene rilevato un errore nella seconda query (forum_thread) mi rimane la prima (forum_topic) inserita (che dovrei poi cancellare)

    Suggerimenti?
    Grazie.

    EDIT: sembra che PHP non preveda le multiple queries mysql. Ci sono alternative più eleganti rispetto alle 2 query separate (che poi diventano 3 nel caso in cui qualcosa vada storto in quanto ci sarebbe anche una DELETE)?

  2. #2

    Re: MySQL e last_inserted_id()

    Originariamente inviato da nenigi

    EDIT: sembra che PHP non preveda le multiple queries mysql. Ci sono alternative più eleganti rispetto alle 2 query separate (che poi diventano 3 nel caso in cui qualcosa vada storto in quanto ci sarebbe anche una DELETE)?
    non so cosa intendi per elegante
    comunque la prassi in casi come il tuo è fare due query separate inserite all'interno di una transazione...

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    26
    Al momento ho risolto in questo modo:

    Codice PHP:
    <?
    if(mysql_query('INSERT INTO forum_topic (forum_id,utente,titolo) VALUES (3,2,"titolo")')){
       
    $topic_id=mysql_insert_id();
       if(
    mysql_query('INSERT INTO forum_thread (topic_id,utente,testo) VALUES ('.$topic_id.',2,"testo")')){
          echo 
    "OK";
       }else{
          echo 
    "Errore seconda query";
          
    // Cancello la riga creata precedentemente per forum_topic in quanto inutile in seguito all'errore
          
    mysql_query('DELETE FROM forum_topic WHERE id='.$topic_id);
       }
    }else{
       echo 
    "Errore prima query";
    }
    ?>
    Quello che intendevo per "elegante" era appunto risolvere il tutto con una query come accade in phpmyadmin, dove se viene riscontrato un errore anche solo in uno dei due INSERT l'intera query non viene eseguita (evitando quindi la terza, quella DELETE).

  4. #4
    Utente di HTML.it L'avatar di neroux
    Registrato dal
    Aug 2009
    Messaggi
    1,973
    Anche col primo esempio (con le due query) in caso di errore con il secondo insert i dati del primo rimangono nel db comunque. Sarebbe il classico caso di una transazione. Però dovresti usare InnoDB come tipo di tabella invece di MyISAM (se non lo fai già )

    www.sitemeer.com » Quando un sito pare irraggiungibile

    Se ti piace ci puoi trovare anche su Facebook

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.