sql >> データベース >  >> RDS >> Mysql

PHPPDO-アクティブなトランザクションはありません

    PeterとRichardsの回答はすでに正しいですが、トランザクション構造のコードに小さな間違いが1つあります(コメントを追加できません)。

    $connection->beginTransaction() tryの外にある必要があります -catch ブロック。 beginTransaction()を開始するとき tryで -ブロックすると、データベース操作が例外catchをスローします -ブロックはアクティブなトランザクションから何かを知りません。したがって、同じエラーが発生します:

    したがって、構造も次のようになります。

    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. ActiveRecord_Associations_CollectionProxyのRails未定義メソッド

    2. 多対多の関係の例

    3. ZendFrameworkに参加

    4. シェルスクリプトからsqlplusに変数を渡す方法