Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13

Discussione: PDO ODBC transaction

  1. #1

    PDO ODBC transaction

    Buongiorno,
    Ho connesso il php ad un database mdb attraverso i driver ODBC.
    Adesso mi piacerebbe poter utilizzare il rollback nel caso una delle query fallisca.

    Sto provando in questo modo
    codice:
    try
    {
      $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      $dbh->beginTransaction();
      $sql1 = "query di insert ...."; 
      $sql2 = "query di update ...";
      $dbh->execute($sql1); //ho provato anche con $dbh->exec($sql1);
      $dbh->execute($sql2); //ho provato anche con $dbh->exec($sql2);
      $dbh->commit();
    }
    catch (PDOException $exception)
    {
      $dbh->rollBack();
      echo $exception->getMessage();
    }
    All'esecuzione nel browser ricevo questo messaggio:
    codice:
    Fatal error: Uncaught PDOException: There is no active transaction in ......
    Dove sbaglio?
    Grazie.

  2. #2
    Prova a spostare $dbh->beginTransaction(); prima del try

  3. #3
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,445
    Il metodo execute() non si aspetta una query SQL, si aspetta nulla se si usa prepare() , mentre un array contenente solo i parametri da passare allo statement se non si usa prepare().
    Quindi execute() usato in quel modo non va bene, devi usare exec() se vuoi scrivere la query per intero senza usare parametri.

    Assicurati che la connessione al db sia avvenuta correttamente e che non venga chiusa da qualche parte prima del codice che hai postato.
    Se già beginTransaction() fallisce vai a finire nel catch e ovviamente, avendo fallito l'inizializzazione della transazione, non c'è alcuna transazione attiva su cui eseguire un rollback.
    Devi distinguere quale eccezione è stata sollevata, non puoi dare per scontato che sia una query ad andare male, può anche essere altro.

  4. #4
    Ciao,
    ho provato a spostare $dbh->beginTransaction(); prima del try anche se in tutti gli esempi che ho visto online, si trova sempre all'interno.
    Ho verificato se la connessione al database avviene regolarmente. Ne sono sicuro, perché sono riuscito a fare una select,
    una insert e una update al di fuori della "try".

    Ho pensato.....
    Fino ad oggi ho usato le transaction PDO con i database mysql; ricordo che le transaction funzionano solo con i database di tipo InnoDB ... con i MyISAM non funzionavano ... sbaglio?

    Adesso mi trovo a dover interagire con un database access con estensione .mdb; è possibile che non accetti le transaction?
    grazie.

  5. #5
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,445
    Rimetti la beginTransaction() nel try, dal catch togli il rollback e lascia la stampa dell'eventuale eccezzione, vedi cosa stampa, se stampa qualcosa.
    Ultima modifica di Alhazred; 07-05-2021 a 16:53

  6. #6
    Ho seguito il suggerimento e questo è ciò che ottengo:
    codice:
    SQLSTATE[HY011]: Attribute cannot be set now: 72 [Microsoft][Driver ODBC Microsoft Access]Impossibile impostare l'attributo. (SQLSetConnectAttr AUTOCOMMIT = OFF[72] at ext\pdo_odbc\odbc_driver.c:279)
    Ho pensato di aggiungere l'autocommit = 0 ma ottengo lo stesso risultato:
    codice:
    try
    {
      $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      $dbh->setAttribute(PDO::ATTR_AUTOCOMMIT,0);
      $dbh->beginTransaction();
      echo 'ciao';
      $sql1 = "query di insert...";
      $sql2 = "query di update...";
      $dbh->exec($sql1);
      $dbh->exec($sql2);
      $dbh->commit();
    }
    catch (PDOException $exception)
    {
      //$dbh->rollBack();
      echo $exception->getMessage();
    }
    grazie.

  7. #7
    Utente di HTML.it L'avatar di cassano
    Registrato dal
    Aug 2004
    Messaggi
    3,000
    Non mi ricordo bene, ma mi sa che Access non supporta le transazioni.

  8. #8
    Ciao, ho appena provato con un database con estensione .accdb .... stesso risultato, quindi non è un problema del database mdb.

    Quote Originariamente inviata da cassano Visualizza il messaggio
    Non mi ricordo bene, ma mi sa che Access non supporta le transazioni.
    Faccio una ricerca, grazie.

  9. #9
    leggendo il seguente link, sembra che le transaction siano ammesso:
    https://docs.microsoft.com/en-us/off...oft-access-sql

    Devo solo capire dove sbaglio ... solo

  10. #10
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,445
    Hai un errore sull'autocommit, comincia col sistemare quello, che potrebbe anche essere l'unico problema che hai.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.