Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    gestione delle transaction

    salve,
    per evitare problemi di collegamento con il database ho letto un po' in giro e ho deciso di usare, ammesso che ci riesca, le transaction.

    ho fatto questo codice:
    codice:
    $connessione = mysql_connect($server, $user, $pass);
    if (!$connessione) {
     die ('Non riesco a connettermi: ' . mysql_error());
    }
    
    
    $db_selected = mysql_select_db($db, $connessione);
    if (!$db_selected) {
     die ("Errore nella selezione del database: " . mysql_error());
    }
    mysql_query("SET AUTOCOMMIT=0", $connessione);
    
    
    
    mysql_query("BEGIN", $connessione);
    $query = "update jos_virtuemart_categories_it_it set slug = 'Cavi-Autoq' where virtuemart_category_id = '140'";
    $result = mysql_query($query, $connessione);
    
    
    if ($result) {
        mysql_query("COMMIT", $connessione);
    } else {        
        mysql_query("ROLLBACK", $connessione);
    }
    ma non funziona.
    Cosa sbaglio?

    Grazie.

  2. #2
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Cos'è che non funziona ?

    PS : le istruzioni MySQL* sono deprecate usa mysqli* o pdo.
    Ultima modifica di badaze; 20-11-2015 a 01:16
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  3. #3
    Utente di HTML.it L'avatar di .Kurt
    Registrato dal
    Jul 2007
    Messaggi
    654
    per evitare problemi di collegamento con il database ho letto un po' in giro e ho deciso di usare, ammesso che ci riesca, le transaction.
    Dovresti continuare a leggere. Nel tuo esempio non hai bisogno di usare transazioni. Se $query fallisce, nessun dato viene modificato. Se ha successo, i dati vengono scritti sul disco. È esattamente il comportamento che ottieni lasciando abilitato autocommit, dove ogni query è automaticamente avvolta in una transazione.
    Se hai bisogno di avviare tu stesso una transazione, fallo solo se c'è un reale motivo.

  4. #4
    Salve,
    allora su suggerimento di badaze ho cambiato tutto in mysqli e ho provato questo codice trovato tra degli esempi online:
    codice:
    $connessione = new mysqli($server, $user, $pass, $db);
    if ($connessione->connect_errno) {
     echo 'Non riesco a connettermi: ' . $connessione->connect_error ;
    }
    $connessione->autocommit(FALSE);
    $query = "update jos_virtuemart_categories set product_per_row = '3' where virtuemart_category_id = '140'";
    $query1 = "update jos_virtuemart_categories_it_it set slug = 'Cavi-Auto4' where virtuemart_category_id = '140'";
    try {
      $connessione->begin_transaction();
      $result = $connessione->query($query);
      $result1 = $connessione->query($query1);
      $connessione->commit();
    } catch (Exception $e) {   
         $connessione->rollback();
    }
    echo 'ciao';
    $mysqli->close();
    sicuramente c'è qualcosa che non va.
    In questo esempio ho messo 2 query.
    A me interessa che se una di queste due query fallisce, l'altra non deve essere eseguita lasciando entrambe le tabelle invariate.
    Nell'esempio che ho inserito, nella prima query, assegno valore 3 al campo product_per_row che non esiste (in realtà il campo si chiama products_per_row) quindi la prima query fallisce.
    Mentre la seconda la esegue come se niente fosse, in sostanza non entra proprio nel rollback.

    Cosa stò sbagliando ancora?
    grazie.

  5. #5
    Non basta mettere l'autocommit a false per iniziare una transazione.
    Guarda qui:

    http://php.net/manual/en/mysqli.begin-transaction.php
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  6. #6
    Utente di HTML.it L'avatar di .Kurt
    Registrato dal
    Jul 2007
    Messaggi
    654
    mysqli::query, al contrario di PDO, in caso di errore non lancia nessuna eccezione. http://php.net/manual/en/mysqli.query.php
    Controlla tu i risultati di $result e $result1: se uno dei due ritorna false, allora lancia la tua eccezione, e fai il rollback.

  7. #7
    Quindi mi stai dicendo che nel mio caso è meglio usare il PDO?

  8. #8
    Utente di HTML.it L'avatar di .Kurt
    Registrato dal
    Jul 2007
    Messaggi
    654
    Puoi ottenere le stesse cose sia con mysqli che con PDO. Scegli l'api che ti piace di più, o con cui ti trovi più a tuo agio.

  9. #9
    PDO non l'ho mai usato quindi preferirei usare mysqli.
    Il problema è che nell'ultimo esempio che ho fatto dovrebbe entrare in catch perché una delle 2 query fallisce, invece non entra.
    Non riesco a capire perché, eppure questo esempio, ho visto che lo danno per buono in diversi siti.

    Cosa sto sbagliando nel mio esempio? abbiate pazienza
    grazie mille.

  10. #10
    Utente di HTML.it L'avatar di .Kurt
    Registrato dal
    Jul 2007
    Messaggi
    654
    Il problema è che nell'ultimo esempio che ho fatto dovrebbe entrare in catch perché una delle 2 query fallisce, invece non entra.
    Te l'ho già spiegato. Quando mysqli::query fallisce, ritorna "false", non lancia una eccezione. Quello che dovresti fare è controllare il valore di ritorno e lanciare l'eccezione in questione.
    Codice PHP:
    if (false === $result $connessione->query($query)) {    throw new Exception('fallita la prima query');} 

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.