Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Transazioni MySql con PHP

    Ciao a tutti, sto realizzando una cosa dove ho bisogno di utilizzare le transazioni.
    Quello che dovrei fare è:

    1) Aprire una transazione
    2) Leggere la tabella t_summary_of_work senza farla leggere ad altri e recuperare un dato
    3) Effettuare una INSERT su questa tabella e leggere un determinato dato aggiornato
    4) Fare una UPDATE di un' altra con il dato letto in precedenza sulla prima tabella
    5) Eseguire la COMMIT o la ROLLBACK

    Non capisco come mai ogni volta che eseguo il file ed eseguo la insert nella prima tabella, è come se mi rimanesse aperta la transazione...il valore reale dell' id nel DB è 42, ma ogni volta che eseguo lo script e stampo a video l' ID durante la transazione mi aumenta di 1...difatti a forza di provare sono ormai a 80 e più...poi ovviamente non mi vanno a buon fine le update dandomi errore:
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '0: UPDATE t_jobs SET id_jobs_status = 9, id_summary_of_work = 87 WHERE id_jobs =' at line 1

    Ho anche allegato un' immagine con il risultato del debug...grazie a tutti
    Codice PHP:

    //Avvio la transazione
    $link->query("START TRANSACTION;");

    //recupero l' ultimo id_document inserito nella tabella dei consuntivi
    $result $link->query("SELECT id_document FROM t_summary_of_work ORDER BY id_document DESC LIMIT 1 FOR UPDATE");
    $row mysqli_fetch_array($resultMYSQLI_ASSOC);

    //incremento l' ultimo id_document per inserirlo per il nuovo consuntivo
    $new_doc_id $row["id_document"] + 1;

    //preparo la stringa sql per la insert
    $in_sow "INSERT INTO t_summary_of_work 
                          (
                              id_summary_of_work,                       
                              id_staff,                       
                              id_summary_of_work_status,                       
                              date_sow,                       
                              id_document,                       
                              id_document_year,                       
                              cost_sow,                       
                              with_iva,                       
                              note,                       
                              id_what_order_external,                       
                              subject,                       
                              file_name,                       
                              file_type                     
                          )                 
                      VALUES 
                         (
                              NULL, 
                              "
    .$_SESSION["id_username"].", 
                              1, 
                              '', 
                              
    $new_doc_id
                              '"
    .$_POST["anno"]."', 
                              '', 
                              '', 
                              '', 
                              NULL, 
                              '', 
                              '', 
                              ''
                           )"
    ;    

    //INSERT T_SUMMARY_OF_WORKS  
    print "Risultato della insert: ";        
    var_dump($link->query($in_sow));  
    print 
    "<br><br>";    

    //recupero l' ultimo id inserito 
    $result $link->query("SELECT id_summary_of_work FROM t_summary_of_work ORDER BY id_document DESC LIMIT 1 FOR UPDATE");
    $row mysqli_fetch_array($resultMYSQLI_ASSOC);
    //questa variabile che è l' id autoincrement mi si incrementa come se   ***
    //la transazione rimanesse aperte anche dopo l' esecuzione dello script***
    $id_sow $row["id_summary_of_work"]; //*************************
    //*********************************************************** 

    //Stampo l' ultimo id inserito all' interno della transazione
    //(è quello che si incrementa come se la transazione non si chiudesse mai)
    print "ultimo id inserito = ".$id_sow."<br><br>";    

    //UPDATE T_JOBS  
    //Creo una variabile di controllo che mi segnala se qualcosa va storto  
    //nell' aggiornamento della tabella t_jobs  
    $ctrl 0;    

    //eseguo tot update in base alla quantità di jobs selezionati dalla select  
    for($i=0$i<count($_POST["id_jobs"]); $i++)  
    {    
        
    //stringa sql per l' update    
        
    $in_jobs "UPDATE t_jobs SET id_jobs_status = 9, id_summary_of_work = ".$id_sow."                       WHERE id_jobs = ".$_POST["id_jobs"][$i];     

        
    //print $in_jobs."<br><br>";          
        
        //eseguo l' update e stampo un po' di dati per il debug     
        
    print "<br><br>Stringa sql UPDATE ".$i.": ";     
        print 
    $in_jobs "<br>";     
        print 
    "Esito: ";     

        
    //se l' update va a buon fine incremento di uno $ctrl     
        
    if(var_dump($link->query($in_jobs)))     
        {        
           
    $ctrl++;        
           print 
    "<br><br>sto incrementando ctrl<br><br>";     
        }                                       
    }       

    //STAMPO UN PO' DI ROBA PER IL DEBUG**********    
    print "<br><br>Risultato delle UPDATE (var ctrl): ";  
    var_dump($ctrl);    
    print 
    "<br><br>";                          
    //*********************************************          
    //se la insert ritorna true e $ctrl incrementando raggiunge il numero         
    //di elementi dell' array $_POST["id_jobs"], eseguo il commit        
    if($link->query($in_sow) == true AND $ctrl == count($_POST["id_jobs"]))         
    {           
         
    $link->query("COMMIT");           
         print 
    "<br>Consuntivo inserito con sulcesso...";          
    }        
    else        
    {           
         
    $link->query("ROLLBACK");           
         print 
    "<br>E' stata eseguita la ROLLBACK dei dati...";        

    Immagini allegate Immagini allegate

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Ottima scelta quella delle scritte giallo chiaro su fondo bianco.

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    539
    verifica che autocommit non sia attivo, non so se attivando una transazione l'autocommit venga disattivato
    poi potresti rendere più semplice la select (e forse anche un po' più veloce) con
    codice:
    SELECT max(id_document) FROM t_summary_of_work FOR UPDATE
    ciao
    Marino

  4. #4
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    C'è una funzione che consente de recuperare l'ultimo id inserito. mysqli_insert_id();
    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

  5. #5
    Quote Originariamente inviata da marino51 Visualizza il messaggio
    verifica che autocommit non sia attivo, non so se attivando una transazione l'autocommit venga disattivato
    Dalla guida di html.it:
    Innanzitutto va segnalato che MySQL gira di default in autocommit mode: questo significa che tutti gli aggiornamenti vengono automaticamente consolidati nel momento in cui sono eseguiti. Se siamo in autocommit, per iniziare una transazione dobbiamo usare l’istruzione START TRANSACTION; da questo punto in poi tutti gli aggiornamenti rimarranno sospesi. La transazione può essere chiusa con l’istruzione COMMIT, che consolida le modifiche, oppure con ROLLBACK, che annulla tutti gli aggiornamenti effettuati nel corso della transazione.

    Quote Originariamente inviata da Alhazred Visualizza il messaggio
    Ottima scelta quella delle scritte giallo chiaro su fondo bianco.
    Hai ragione ma me ne sono reso conto dopo


    [EDIT1] ho notato che se riavvio il pc la sessione rimane aperta....

    [EDIT2] Ho notato che se spengo l' apache mi interpreta ancorai file PHP...com' è possibile???
    Ultima modifica di camionistaxcaso; 30-04-2015 a 10:17

  6. #6
    Risolto...grazie.

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.