Używam małej metody w CodeIgniter do wstawienia niektórych linii w bazie danych (ta sama tabela). Chciałbym zobaczyć, które wstawienie nie powiodło się w transakcji (zwracając tablicę tytułów). Mój kod to:Codeigniter, śledzenie błędów w transakcji
$failure = array(); //the array where we store what failed
$this->db->trans_start();
foreach ($data as $ressourceCsv){ //data is an array of arrays to feed the database
$this->ajout_ressource($ressourceCsv); //method to insert (basically, just an insert with active record)
if (($this->db->_error_message())!=null) {
$failure[] = $ressourceCsv['title'];
}
}
$this->db->trans_complete();
return $failure;
Faktem jest, że jeśli nie uda transakcji (bez $ this-> db-> trans _...), to działa doskonale i mam tablicę zawierającą kilka tytuły. Ale w przypadku transakcji tablica zawiera wszystkie tytuły od pierwszego błędu. Czy istnieje sposób na uzyskanie tytułu z insercji, która spowodowała wycofanie transakcji?
Próbowałem również z:
$failure = array(); //the array where we store what failed
$this->db->trans_start();
foreach ($data as $ressourceCsv){ //data is an array of arrays to feed the database
if (!$this->ajout_ressource($ressourceCsv)) { //active record insertion return true
$failure[] = $ressourceCsv['title']; // if successful
}
}
$this->db->trans_complete();
return $failure;
Ok, więc jeśli mogę go rację, bardzo struktura transakcji nie pozwala mi kontynuować, tak jak chciałem. Również nie mogę użyć $ this-> db-> trans_status() === FALSE, ponieważ faktycznie zawijam linie transakcji w instrukcji if (nie zawsze używam transakcji). Aby rozwiązać mój problem, w końcu zapisałem identyfikator pomyślnego wstawienia, aby je usunąć w końcu, jeśli chcę wycofać, a tablica $ failure nie jest pusta – Dargor
Przypuszczam, że jeśli ** musisz ** wykonać wszystkie wstawki na raz, niezależnie od tego, wszelkich niepowodzeń, możesz to zrobić, ale jeśli twoim intencją jest, aby nikt nie zobaczył żadnej z tych wstawek, jeśli niektóre zawiodą, wtedy nie możesz tego dokonać w ten sposób. Możesz mieć kolumnę boolowską o nazwie "accepted" i ustawić ją na TRUE tylko po zakończeniu wszystkich wstawień i nieudanym - i dodaj klauzulę "WHERE accepted = TRUE" do innych zapytań. – user9645
Dodałem aktualizację, aby pokazać, jak wykonać pętlę wewnątrz transakcji, jeśli chcesz. – user9645