English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
トランザクション(Transaction)は、データベース操作において非常に重要な機能であり、一つのSQLクエリや複数のSQLクエリを一括で実行し、その実行中にどのクエリが失敗しても、変更されたすべての操作を巻き戻すことができます。成功した場合、その一連の操作は恒久的に有効になります。トランザクションは、データベース操作中の同期問題を非常に効果的に解決します。また、トランザクションを使用して大量のデータを処理する場合、実行効率が大幅に向上します。
トランザクション処理には4つの特性があります:原子性、一貫性、独立性、持続性。すべてのデータベースがトランザクション処理をサポートしているわけではありません。PDOはトランザクション処理を実行できるデータベースに対してトランザクションサポートを提供します。
一.PDO例外処理
PDO::ATTR_ERRMODE
1) PDO::ATTR_ERRMODE//エラーを報告しません(無視)(0)
2) PDO::ERRMODE_WARNING
//警告の形式でエラーを報告します(1)
3) PDO::ERRMODE_EXCEPTION //例外の形式でエラーを報告します(2)
<?php //デフォルトではPDO::ATTR_ERRMODEはエラーを報告しません(無視)(0)です。errorCode()、errorInfo()を使用する必要があります。 try{ $pdo=new PDO("mysql:host=localhost;dbname=myapp","root",""); // $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING); $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); }catch (PDOException $e){ die("fail to connect db".$e->getMessage()); } $sql="INSERT INTO user VALUES(null,'dabao','26')"; try{ $res=$pdo->exec($sql); }catch (PDOException $e){ echo $e->getMessage(); } //$res=$pdo->exec($sql); //if($res){ // echo 'OK'; //} // echo $pdo->errorCode(); // echo '<br/>'; // print_r($pdo->errorInfo()); //}
二.PDOプレースホルダメソッド
1) prepare() //SQLクエリを実行し、PDOStatementオブジェクトを返すために使用されます
2) bindValue() //値を対応するパラメータにバインドし、ブール値を返します
3) bindParam() //パラメータを対応するクエリの占位符にバインドし、ブール値を返します
4) bindColumn() //列名と指定された変数名を一致させるために使用されます
5) execute() // 準備ができたプリペアド文を実行し、ブール値を返します
6) rowCount() // 増加、削除、変更、クエリ操作文の後の影響を受けた行数を返します
<?php /** * ?号式のプリペアド文、バインド方法が3種類あります */ //1.データベースに接続する try{ $pdo=new PDO("mysql:host=localhost;dbname=myapp","root",""); }catch (PDOException $e){ die("fail to connect db".$e->getMessage()); } //2.プリペアドのSQL文 $sql="INSERT INTO users(id,name,age) VALUES(?,?,?"; $stmt=$pdo->prepare($sql); //3.問号のパラメータをバインドします $id=null; $name="test103"; $age=103; //第1種のバインド方法 //$stmt->bindValue(1,$id); //$stmt->bindValue(2,$name); //$stmt->bindValue(3,$age); //第2種のバインド方法 //$stmt->bindParam(1,$id); //$stmt->bindParam(2,$name); //$stmt->bindParam(3,$age); //4.実行 //$stmt->execute(); //第3種のバインド方法:配列を直接実行 $stmt->execute(array($id,$name,$age)); echo $stmt->rowCount();
<?php /** * 別名式のプリペアド文、バインド方法が3種類あります */ //1.データベースに接続する try{ $pdo=new PDO("mysql:host=localhost;dbname=myapp","root",""); }catch (PDOException $e){ die("fail to connect db".$e->getMessage()); } //2.プリペアドのSQL文 $sql="INSERT INTO users(id,name,age) VALUES(:id,:name,:age)"; $stmt=$pdo->prepare($sql); //3.パラメータをバインドします $id=null; $name="test203"; $age=23; //第1種のバインド方法 //$stmt->bindValue("id",$id); //$stmt->bindValue("name",$name); //$stmt->bindValue("age",$age); //第2種のバインド方法 //$stmt->bindParam("id",$id); //$stmt->bindParam("name",$name); //$stmt->bindParam("age",$age); //4.実行 //$stmt->execute(); //第3種のバインド方法:配列を直接実行 $stmt->execute(array("id"=>$id,"name"=>$name,"age"=>$age)); echo $stmt->rowCount();
<?php /** * プリペアド方式でデータをクエリします */ //1.データベースに接続する try{ $pdo=new PDO("mysql:host=localhost;dbname=myapp","root",""); }catch (PDOException $e){ die("fail to connect mysql".$e->getMessage()); } //2.プリペアドクエリ $sql="SELECT id,name,age FROM users"; $stmt=$pdo->prepare($sql); //3.実行 $stmt->execute(); foreach($stmt as $val){ echo $val['id']."------".$val['name']."------".$val['age']."<br/>"; }
三. トランザクション処理の操作方法を紹介します
1beginTransaction() //一つの事象(リバウンドポイントを設定)を開始します
2) commit()
//トランザクションコミット
3) rollBack() //トランザクションリロールバック操作
<?php //1.データベースに接続する try{ $pdo=new PDO("mysql:host=localhost;dbname=myapp","root",""); $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); }catch (PDOException $e){ die("fail to connect db".$e->getMessage()); } //2.データ操作を実行する try{ //トランザクションを開始する $pdo->beginTransaction(); $sql="insert into users(id,name,age) VALUES(?,?,?"; $stmt=$pdo->prepare($sql); //パラメータを渡す $stmt->execute(array(null,"test1",21")); $stmt->execute(array(null,"test2",22")); $stmt->execute(array(null,"test3",23")); //トランザクションコミット $pdo->commit(); }catch (PDOException $e){ die("fail to execute".$e->getMessage()); //トランザクションリロールバック $pdo->roolback(); }
これで本文のすべてが終わりました。皆様の学習に役立てば幸いですし、呐喊ガイドを多くのサポートをお願いします。
声明:本文の内容はインターネットから収集され、著作権者に帰属します。インターネットユーザーが自発的に提供し、自己でアップロードしたものであり、本サイトは所有権を有しておらず、人工的な編集は行われていません。著作権侵害を疑う内容が見つかりましたら、メールを送信して:notice#oldtoolbag.com(メール送信時は、#を@に変更してください。報告を行い、関連する証拠を提供してください。一旦確認が取れましたら、本サイトは即座に侵害を疑われるコンテンツを削除します。)