Mysql
 sql >> база данни >  >> RDS >> Mysql

PHP PDO - Няма активна транзакция

Отговорите на Peter и Richards вече са правилни, но има една малка грешка в кода от структурата на транзакцията (и не мога да добавя коментар).

$connection->beginTransaction() трябва да е извън try -catch блок. Когато стартирате beginTransaction() в try -block и вашите операции с база данни хвърлят изключение, catch -block не знае нещо от активна транзакция. И така, получавате същата грешка:

Така че структурата също трябва да бъде:

  1. Вземете връзката.
  2. Стартиране на транзакцията с $connection->beginTransaction()
  3. Отворете try -catch блокирай.

try -блок съдържа $connection->commit() след DB операции.

catch -блок съдържа $connection->rollback() преди хвърляне на изключение.

Така че вашият код трябва да изглежда така:

$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. Не можете да създадете връзка с базата данни GlassFish с Netbeans?

  2. Използване на DATE_ADD с име на колона като стойност на интервала

  3. еквивалент на паралелна заявка на ORACLE в mysql

  4. PHP и MySql проверяват дали таблицата е празна

  5. Поддръжка на mysql в php 7