Visualizzazione risultati 1 fino 12 di 12

Discussione: Transazione sql non funziona se eseguita tramite php

  1. #1
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,767

    Predefinito Transazione sql non funziona se eseguita tramite php

    Premettendo che, fino ad ora non ho mai usato le transazioni, sto provando ad eseguire questa semplice transazione:

    Codice:
    START TRANSACTION;
       DELETE FROM tabella1;
       DELETE FROM tabella2;
    COMMIT;
    tramite questo codice php:

    Codice PHP:
    $transaction = "START TRANSACTION;
    DELETE FROM tabella1;
    DELETE FROM tabella2;
    COMMIT;"
    ;

    if (!
    $connection->query($transaction)) {
    echo
    "<font color=\"red\">" . mysqli_error($connection) . "</font><p />";
    }else {
    ...
    }
    Ora, il problema è che: eseguendolo direttamente in phpmyadmin, il codice funziona perfettamente, invece, se lo eseguo tramite php mi restituisce questo errore:

    Codice:
    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 'DELETE FROM tabella1; DELETE FROM tabella2; COMMIT' at line 2
    Dov'è che sbaglio?

    P.S.: $connection è un'instanza dell'oggetto mysqli()
    Ultima modifica di sevenjeak : 26-09-2019 alle ore 11.06.55

    Sevenjeak
    Software developer and much more

  2. #2
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Da quanto ricordo (ma è un ricordo molto lontano, prendilo con le pinze) le transazioni con mysqli non si eseguono inserendo l'intero comando SQL come se fosse un'interrogazione, ma chiamando una funzione che indichi l'inizio di una transazione, poi le query e alla fine una funzione che indichi la fine della transazione. Prova a dare un'occhiata a mysqli_begin_transaction.

    I suggerimenti che do più spesso:


  3. #3
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,767

    Predefinito

    Ho provando modificando cosi il codice:

    Codice PHP:
    $connection->begin_transaction(MYSQLI_TRANS_START_READ_WRITE);
    $connection->query("DELETE FROM tabella1");
    $connection->query("DELETE FROM tabella2");

    if (!
    $connection->commit()) {
    echo
    "<font color=\"red\">" . mysqli_error($connection) . "</font><p />";
    }
    Ma le query mi vengono eseguite come se non facessero parte di una transazione, indipendentemente dal fatto che una delle due fosse errata, ed a quando pare il commit() mi ritorna semple true ( visto che in nessun caso mi esegue il blocco if )
    Ultima modifica di sevenjeak : 26-09-2019 alle ore 16.13.20

    Sevenjeak
    Software developer and much more

  4. #4
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Prova disabilitando l'autocommit, anche se teoricamente non dovrebbe essere necessario.

    La base di dati usa InnoDB o MyISAM? Le transazioni non funzionano su quest'ultimo.

    I suggerimenti che do più spesso:


  5. #5
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,767

    Predefinito

    Il database usa MyISAM ( ovviamente sto parlando di quello qui su altervista ), e come già detto nel mio primo messaggio le transazioni non mi funzionano solo tramite php, se eseguo direttamente da phpMyAdmin mi funzionano benissimo.

    Sto provando ora a disattivare l'autocommit, in'ogni caso, qui su Altervista, è possibile cambiare da innoDB a myISAM?

    EDIT:

    Ho provato disattivando l'autocommit mettendo in cima al mio precedente codice l'istruzione $connection->autocommit(false), ma niente, come prima, in'oltre ora, commentando l'istruzione if, quella che fa il commit, le query me le esegue lo stesso.
    Ultima modifica di sevenjeak : 27-09-2019 alle ore 16.07.00

    Sevenjeak
    Software developer and much more

  6. #6
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Il database usa MyISAM
    Le transazioni non funzionano su con MyISAM, dunque temo non ci sia nulla da fare.

    I suggerimenti che do più spesso:


  7. #7
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,067

    Predefinito

    Citazione Originalmente inviato da sevenjeak Visualizza messaggio
    le transazioni non mi funzionano solo tramite php, se eseguo direttamente da phpMyAdmin mi funzionano benissimo.
    PhpMyAdmin è semplicemente del codice PHP; se funziona da phpMyAdmin dovresti essere in grado di farlo anche dal tuo codice (non so però indicarti maggiori dettagli del tuo problema).

    Citazione Originalmente inviato da sevenjeak Visualizza messaggio
    è possibile cambiare da innoDB a myISAM?
    Non che io sappia, è solo possibile passare da myISAM a innoDB (da qui). Se vuoi fare il passaggio inverso posso informarmi ma non ne vedo l'utilità.

    Ciao!

  8. #8
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,767

    Predefinito

    Scusate per il ritardo nella risposta, in questi giorni non ho internet a casa.

    Citazione Originalmente inviato da alemoppo Visualizza messaggio
    PhpMyAdmin è semplicemente del codice PHP..
    Certo, lo so che phpMyAdmin é fatto in php, non mi spiego solamente perché li va ( anche se la tabella é di tipo myISAM ) e nel mio script no.

  9. #9
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Ho fatto questo semplice test usando PHP 7 con ENGINE innoDB e se una query da errore lo script prosegue ugualmente, mysqli_query accetta solo una query (;).
    https://forums.mysql.com/read.php?21...9229#msg-69229 per info su Myisam
    Codice PHP:
    <?php
    $mysqli
    = new mysqli("localhost", "my_user", "my_password", "my_sevenjeak");

    if (
    $mysqli->connect_errno) {
    printf("Connect failed: %s\n", $mysqli->connect_error);
    exit();
    }

    /*if ($mysqli->begin_transaction(MYSQLI_TRANS_START_READ_ONLY)) {
    //Occorre Da MySQL 5.6 é innoDB predefinito

    if (!$mysqli->query("SELECT nome, cognome FROM residenti")) {
    echo "errore query";
    }

    $mysqli->commit();*/
    $a = 0;
    if(!(
    $c =$mysqli->query("START TRANSACTION;"))) {
    ++
    $a;
    }
    if(!
    $mysqli->query("DELETE FROM `my_sevenjeak`.`tabella1`;")) {
    $a = $a + 2;
    }
    if(!
    $mysqli->query("DELETE FROM `my_sevenjeak`.`tabella2`;")) {
    $a = $a + 4;
    }
    if(!
    $mysqli->query("COMMIT;")) {
    $a = $a + 8;
    }
    if(
    $mysqli->error != ''){
    printf("Error message: %s \n", $mysqli->error);
    }


    $mysqli->close();

    var_dump("inizio la transazione $a ",$c);
    Qui istruzioni da mysql 5.5 per engine transizionali (Myisam non rientra tra questa categoria)
    https://www.php.net/manual/en/mysqli...ansactions.php
    Ultima modifica di darbula : 05-10-2019 alle ore 14.57.17

  10. #10
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,767

    Predefinito

    Provato il tuo codice con Php7 e myISAM, è mi restituisce come output string(24) "inizio la transazione 2 " bool(true), anche se cambio la prima query in questo modo: DELETE FROM `my_sevenjea`.`tabella1`;, per non fare eseguire la transazione, la seconda quary mi si esegue lo stesso, restituendomi lo stesso output, e come già detto, eseguendola direttamente da phpMyAdmin la transazione me la esegue, anche se il database è di tipo myISAM

    Sevenjeak
    Software developer and much more

  11. #11
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Quello che intendevo é https://www.php.net/manual/en/mysqli.multi-query.php magari phpmyadmin si limita a fare un query tutta insieme (ma non fa nulla con la transazione).. Prova fammi sapere.

  12. #12
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,767

    Predefinito

    Provato ma, come è scritto anche nel manuale, le query non mi vengono eseguite solo se la prima è sbagliata, mentre se risulta sbagliata la seconda la prima mi viene eseguita, comportamento che non avviene eseguendo la transazione del mio primo post tramite PhpMyAdmin.

    Proverò ad attivare innoDB come ha detto alemoppo, grazie lo stesso per le risposte.

    Sevenjeak
    Software developer and much more

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •