sql >> Databáze >  >> RDS >> Mysql

PHP PDO - Neexistuje žádná aktivní transakce

Odpovědi Petera a Richardse jsou již správné, ale v kódu z transakční struktury je jedna malá chyba (a nemohu přidat komentář).

$connection->beginTransaction() musí být mimo try -catch blok. Když spustíte beginTransaction() v try -block a vaše databázové operace vyvolá výjimku, catch -block nic nepozná z aktivní transakce. Takže dostanete stejnou chybu:

Takže struktura by měla být také:

  1. Získejte připojení.
  2. Zahajte transakci pomocí $connection->beginTransaction()
  3. Otevřete try -catch blokovat.

try -block obsahuje $connection->commit() po operacích DB.

catch -block obsahuje $connection->rollback() před hodem Výjimka.

Váš kód by tedy měl vypadat takto:

$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. Chyba aktualizace záznamu Vb6

  2. SQL dotaz pro nalezení záznamu s ID, který není v jiné tabulce

  3. Laravel - vícenásobné vkládání řádků a načítání ID

  4. Rekurzivní dotaz na závislosti tabulek se neopakuje tolik, jak bych chtěl