English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

PDOのセキュリティ処理とトランザクション処理方法

トランザクション(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(メール送信時は、#を@に変更してください。報告を行い、関連する証拠を提供してください。一旦確認が取れましたら、本サイトは即座に侵害を疑われるコンテンツを削除します。)

おすすめ