複数のステートメントを実行する前に準備してもよろしいですか?複数のステートメントをトランザクションで実行する前に準備しますか?
$db = PDO('..connection info...');
$cats_stmt = $db->prepare('SELECT * FROM cats');
$dogs_stmt = $db->prepare('SELECT * FROM dogs');
$cats_stmt->execute();
$cats = $cats_stmt->fetchAll(PDO::FETCH_CLASS);//list of cats
$dogs_stmt->execute();
$dogs = $dogs_stmt->fetchAll(PDO::FETCH_CLASS);//list of dogs
これは、異なる変数を持つ2つのステートメントがお互いに実行される必要があるループに便利です。このような :
$stmt_addcat = $db->prepare('INSERT INTO cats (name,age) VALUES(?,?)');
$stmt_adddog = $db->prepare('INSERT INTO dogs (name,age) VALUES(?,?)');
foreach($cat_n_dog as $bunch){
$db->beginTransaction();
$dog_name = $bunch['dog']['name'];
$dog_age = $bunch['dog']['age'];
$stmt_adddog->bindParam(1,$dog_name,PDO::PARAM_STR);
$stmt_adddog->bindParam(2,$dog_age,PDO::PARAM_STR);
$result = $stmt_adddog->execute();
if($result===false){
$db->rollBack();
continue;
}
$cat_name = $bunch['cat']['name'];
$cat_age = $bunch['cat']['age'];
$stmt_addcat->bindParam(1,$cat_name,PDO::PARAM_STR);
$stmt_addcat->bindParam(2,$cat_age,PDO::PARAM_STR);
$result = $stmt_addcat->execute();
if($result===false){
$db->rollBack();
continue;
}
$db->commit();
}
私はPDOはバギーを行動し、sqliteのドライバにエラーを投げるだろうな状況があったので、私は求めていますので、上記の例では、でも動作するようになっている場合、私は思ったんだけど。
P.S.例は現場で作られています。
にsimmilarはず? –
PDOの使い方は全く同じです。唯一の問題は 'foreach'文で' beginTransaction() 'を使うことです。これはトランザクションの目的を破るものですが、この例の入力時に間違っているのか、それとも実際に使用しているのかは分かりません。 –
pdo sqliteドライバによってポストされたエラーをポストします –