Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2001
    Messaggi
    62

    PDO: transazione e exception ?

    Salve, ho un dubbio su come funziona la classe PDO e in particolare la gestione delle eccezioni e delle transazioni.

    In giro ho trovato il seguente script:

    Codice PHP:
    <?php
    /*** mysql hostname ***/
    $hostname 'localhost';

    /*** mysql username ***/
    $username 'username';

    /*** mysql password ***/
    $password 'password';

    /*** database name ***/
    $dbname 'dbname';

    try {
        
    $options = array(PDO::ATTR_AUTOCOMMIT=>FALSE);
        
    $dbh = new PDO("mysql:host=$hostname;dbname=$dbname"$username$password$options);
        
    /*** echo a message saying we have connected ***/
        
    echo 'Connected to database
    '
    ;

        
    /*** set the PDO error mode to exception ***/
        //$dbh->setAttribute(PDO_ATTR_AUTOCOMMIT, 0); 
        
    $dbh->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);

        
    /*** CREATE table statements ***/
        
    $table "CREATE TABLE animals ( animal_id MEDIUMINT(8) NOT NULL PRIMARY KEY,
        animal_type VARCHAR(25) NOT NULL,
        animal_name VARCHAR(25) NOT NULL 
        )"
    ;
        
    $dbh->exec($table);

        
    /*** begin the transaction ***/
        
    $dbh->beginTransaction();

        
    /***  INSERT statements ***/
        
    $dbh->exec("INSERT INTO animals (animal_id, animal_type, animal_name) VALUES (1, 'emu', 'bruce')");
        
    $dbh->exec("INSERT INTO animals (animal_id, animal_type, animal_name) VALUES (2, 'funnel web', 'bruce')");
        
    $dbh->exec("INSERT INTO animals (animal_id, animal_type, animal_name) VALUES (3, 'lizard', 'bruce')");
        
    $dbh->exec("INSERT INTO animals (animal_id, animal_type, animal_name) VALUES (4, 'dingo', 'bruce')");
        
    $dbh->exec("INSERT INTO animals (animal_id, animal_type, animal_name) VALUES (5, 'kangaroo', 'bruce')");
        
    $dbh->exec("INSERT INTO animals (animal_id, animal_type, animal_name) VALUES (6, 'wallaby', 'bruce')");
        
    $dbh->exec("INSERT INTO animals (animal_id, animal_type, animal_name) VALUES (6, 'wombat', 'bruce')");
        
    $dbh->exec("INSERT INTO animals (animal_id, animal_type, animal_name) VALUES (8, 'koala', 'bruce')");
        
    $dbh->exec("INSERT INTO animals (animal_id, animal_type, animal_name) VALUES (9, 'kiwi', 'bruce')");

        
    /*** commit the transaction ***/
        
    $dbh->commit();

        
    /*** echo a message to say the database was created ***/
        
    echo 'Data entered successfully
    '
    ;
    }
    catch(
    PDOException $e)
        {
        
    /*** roll back the transaction if we fail ***/
        
    $dbh->rollback();

        
    /*** echo the sql statement and error message ***/
        
    echo $sql '
    $e->getMessage();
        }
    ?>
    mi aspettavo che nella tabella in oggetto 'animals' non fossero presenti nessun record inserito perchè avendo violato la chiave primaria 'animal_id = 6' e non avendo fatto la commit.

    Cosa sbaglio ?

  2. #2
    Ciao,
    verifica che non stai utilizzando il codice su tabelle MyISAM ma su INNODB, le prime non sono transazionali quindi ogni exec è anche una COMMIT.

    Controlla il manuale di php http://php.net/manual/en/pdo.rollback.php

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2001
    Messaggi
    62
    La tabella la creo al lancio dello script:

    Codice PHP:
        /*** CREATE table statements ***/
        
    $table "CREATE TABLE animals ( animal_id MEDIUMINT(8) NOT NULL PRIMARY KEY,
        animal_type VARCHAR(25) NOT NULL,
        animal_name VARCHAR(25) NOT NULL
        )"
    ;
        
    $dbh->exec($table); 
    ma anche se gli dico che deve essere InnoDB:
    Codice PHP:
        /*** CREATE table statements ***/
        
    $table "CREATE TABLE animals ( animal_id MEDIUMINT(8) NOT NULL PRIMARY KEY,
        animal_type VARCHAR(25) NOT NULL,
        animal_name VARCHAR(25) NOT NULL
        ) ENGINE = InnoDB "
    ;
        
    $dbh->exec($table); 
    la cosa non cambia.

    Se hai la possibilità di provare lo script lo puoi fare tranquillamente basta inserire user e pwd del DB mysql e un database dove creare la tabella.

    Grazie Dino.

  4. #4
    Ciao,
    una domanda velocissima, visto che nello script non c'è nessun DROP della tabella tu la elimini prima di ricrearla con l'engine InnoDB?

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2001
    Messaggi
    62
    Faccio la drop e poi rilancio lo script che la ricrea(ho provato sia con che senza InnoDB).

    Grazie.

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2001
    Messaggi
    62
    Scusami datinho hai capito il motivo del problema?

    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.