Mysql
 sql >> Baza danych >  >> RDS >> Mysql

PHP PDO - Brak aktywnej transakcji

Odpowiedzi Petera i Richardsa są już poprawne, ale w kodzie struktury transakcji jest jeden mały błąd (i nie mogę dodać komentarza).

$connection->beginTransaction() musi znajdować się poza try -catch blok. Po uruchomieniu beginTransaction() w try -block i twoje operacje na bazie danych zgłoszą wyjątek, catch -block nie wie nic o aktywnej transakcji. Otrzymujesz ten sam błąd:

Tak więc struktura powinna być również:

  1. Uzyskaj połączenie.
  2. Rozpocznij transakcję za pomocą $connection->beginTransaction()
  3. Otwórz try -catch blokować.

try -block zawiera $connection->commit() po operacjach bazy danych.

catch -block zawiera $connection->rollback() przed rzutem Wyjątek.

Twój kod powinien wyglądać tak:

$tags_input = array(6,4,5);
$conn = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=utf8',  
DB_USER, DB_PASSW, array(  
    PDO::ATTR_EMULATE_PREPARES => false,  
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
} catch (Exception $e) {
  die("Unable to connect: " . $e->getMessage());
}    
//Begin Transaction
$conn->beginTransaction();   
try {  
    $sql = "INSERT INTO projects (id, pr_id, enabled) VALUES ( :val0, :val1, :val2)";
    $stmt = $conn->prepare($sql);  
    if(count($tags_input)>0){
            for($i = 0;$i<count($tags_input);$i++){
                    $stmt->bindValue(':val0', 57); 
                    $stmt->bindValue(':val1', $tags_input[$i]); 
                    $stmt->bindValue(':val2', 'Y'); 
                    $result = $stmt->execute();
            }
    }
$res1 = $conn->commit();    
} catch (Exception $e) {
  $conn->rollBack();
  echo "Failed: " . $e->getMessage();
}



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Obiekt Django AttributeError „float” nie ma atrybutu „split”

  2. MySQL na zduplikowanym kluczu... uzyskać istniejący identyfikator?

  3. MySQL Group By z najwyższym numerem N każdego rodzaju

  4. Co to jest iniekcja SQL drugiego poziomu

  5. Problem z wyborem grupy warunków Mysql według zamówienia