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,712

    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 12.06.55

    Sevenjeak
    Software developer and much more

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

    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:
    • Le funzioni mysql_* sono deprecate. Usa PDO o MySQLi.
    • Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
    • Indenta correttamente il codice e usa nomi significativi per gli identificatori.


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

    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 17.13.20

    Sevenjeak
    Software developer and much more

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

    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:
    • Le funzioni mysql_* sono deprecate. Usa PDO o MySQLi.
    • Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
    • Indenta correttamente il codice e usa nomi significativi per gli identificatori.


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

    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 17.07.00

    Sevenjeak
    Software developer and much more

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

    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:
    • Le funzioni mysql_* sono deprecate. Usa PDO o MySQLi.
    • Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
    • Indenta correttamente il codice e usa nomi significativi per gli identificatori.


  7. #7
    L'avatar di alemoppo
    alemoppo  connesso ora Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    15,378

    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,712

    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
    Data registrazione
    24-04-2011
    Messaggi
    1,791

    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 15.57.17

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

    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
    Data registrazione
    24-04-2011
    Messaggi
    1,791

    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,712

    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
  •