Czy można przygotować wiele zapisów przed ich wykonaniem?Przygotuj wiele pozycji przed wykonaniem ich w transakcji?
$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
Przydałoby się to w przypadku pętli, w których dwie instrukcje z różnymi zmiennymi muszą być wykonywane jedna po drugiej. tak:
$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();
}
Pytam bo miałem sytuacje, w których PDO będzie działać buggy i rzucać błędy na sqlite kierowcy, więc zastanawiam się, czy powyższy przykład jest nawet podobno działa.
p.s. przykłady są robione na miejscu.
Dlaczego nie spróbować? –
Całkiem dobrze jest używać PDO w sposób, jaki opisujesz. Jedyny problem polega na tym, że używasz 'beginTransaction()' w swoim oświadczeniu foreach, które pokonuje cel transakcji, ale nie wiem, czy to błąd popełniony podczas pisania tego przykładu, czy też jest to coś, czego faktycznie używasz. –
błędy porzucone przez sterownik pdo sqlite –