Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysqli] Problem z mysqli - nie dzialaja transakcje
Forum PHP.pl > Forum > Bazy danych > MySQL
terabit
Witam,
mam taki kod:
  1. <?php
  2.  
  3. $mysqli = new mysqli('localhost', 'xxx', 'xxx', 'xxx');
  4.  
  5. if (mysqli_connect_errno()) {
  6. echo 'Cannect failed: ' . mysqli_connect_error();
  7. }
  8.  
  9.  
  10. $mysqli->autocommit(FALSE);
  11.  
  12. $mysqli->query("INSERT INTO uczniowie (id, imie, nazwisko , wiek, id_szkoly, srednia)
  13. VALUES (NULL , 'alexia', 'jakas', '14', '6', '3.32')");
  14. $mysqli->query("INSERT INTO uczniowie (imie) VALUES ('Adamek', 4, 2)");
  15.  
  16.  
  17. if (!$mysqli->commit()) {
  18. $mysqli->rollback();
  19. }
  20.  
  21. $mysqli->close();


po uruchomieniu zawsze zostaje dodany jeden rekord do bazy a nie powinno dodac zadnego z powodu blednej drugiej instrukcji.
Jeśli to samo napisze z użyciem PDO lub w bazie w golym SQL to dziala bez problemów a z mysqli nie chce...

Pomóżcie winksmiley.jpg
Mchl
Kod
$success = true;
$mysqli->autocommit(false);

if(!$mysqli->query($query1)) {
   $mysqli->rollback();
   $success = false;
}

if($success && !$mysqli->query($query2)) {
   $mysqli->rollback();
    $success = false;
}

...

if($success) $mysqli->commit();
terabit
@Mchl - cos mi sie nie widzi te twoje rozwiazanie...

moze jakies inne pomysly?
vokiel
@terabit chyba nie do końca rozumiesz ideę commit i rollback.

Commit - to potwierdzenie, zezwolenie, aby wszystkie zapytania zostały zatwierdzone w bazie.
Rollback - to anulowanie zapytań, cofnięcie.

Wykonujesz jedno z nich w zależności od powodzenia zapytań składowych.
Czyli:
1. Wykonujesz zapytanie 1
2. Jeśli zapytanie zakończyło się błędem wykonujesz Rollback (nie ma sensu robić kolejnego skoro pierwsze jest niepoprawne)
3. Jeśli zapytanie 1 było ok, wykonujesz zapytanie 2
4. Jeśli zapytanie 2 było ok - Commit, jeśli nie Rollback
terabit
@vokiel - rozumiem o co chodzi winksmiley.jpg

teraz widzę że na php.net jest podobny przydład jak ten od Mchl:
  1. <?php
  2. $all_query_ok=true; // our control variable
  3.  
  4. //we make 4 inserts, the last one generates an error
  5. //if at least one query returns an error we change our control variable
  6. $mysqli->query("INSERT INTO myCity (id) VALUES (100)") ? null : $all_query_ok=false;
  7. $mysqli->query("INSERT INTO myCity (id) VALUES (200)") ? null : $all_query_ok=false;
  8. $mysqli->query("INSERT INTO myCity (id) VALUES (300)") ? null : $all_query_ok=false;
  9. $mysqli->query("INSERT INTO myCity (id) VALUES (100)") ? null : $all_query_ok=false; //duplicated PRIMARY KEY VALUE
  10.  
  11. //now let's test our control variable
  12. $all_query_ok ? $mysqli->commit() : $mysqli->rollback();
  13.  
  14. $mysqli->close();
  15. ?>


Zmyliła mnie po prostu książka wydana przez Zend... nie spodziewałem się takich błędów winksmiley.jpg
Mchl
Cytat(terabit @ 6.02.2010, 15:58:35 ) *
@Mchl - cos mi sie nie widzi te twoje rozwiazanie...

moze jakies inne pomysly?


Nie widzi Ci się... co ja na to poradzę... ważne że działa. Co do szczegółów ja akurat zamiast ustawiać zmieną $success rzucam wyjątkami, ale logika transakcji powinna być właście taka.

http://dev.mysql.com/doc/refman/5.1/en/commit.html

COMMIT nie sprawdza czy wszystkie zapytania w ramach transakcji zakończyły się powodzeniem. Po prostu potwierdza te, które się udały, a resztę olewa. Popróbuj sobie z konsoli to zobaczysz o co chodzi.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.