Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [mysqli] Problem z mysqli - nie dzialaja transakcje
terabit
post
Post #1





Grupa: Zarejestrowani
Postów: 170
Pomógł: 4
Dołączył: 11.08.2006

Ostrzeżenie: (10%)
X----


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

Ten post edytował terabit 6.02.2010, 15:17:37


--------------------
Go to the top of the page
+Quote Post
Mchl
post
Post #2





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

Ostrzeżenie: (0%)
-----


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();


Ten post edytował Mchl 6.02.2010, 15:28:51
Go to the top of the page
+Quote Post
terabit
post
Post #3





Grupa: Zarejestrowani
Postów: 170
Pomógł: 4
Dołączył: 11.08.2006

Ostrzeżenie: (10%)
X----


@Mchl - cos mi sie nie widzi te twoje rozwiazanie...

moze jakies inne pomysly?


--------------------
Go to the top of the page
+Quote Post
vokiel
post
Post #4





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

Ostrzeżenie: (0%)
-----


@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


--------------------
Go to the top of the page
+Quote Post
terabit
post
Post #5





Grupa: Zarejestrowani
Postów: 170
Pomógł: 4
Dołączył: 11.08.2006

Ostrzeżenie: (10%)
X----


@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

Ten post edytował terabit 6.02.2010, 16:14:00


--------------------
Go to the top of the page
+Quote Post
Mchl
post
Post #6





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Mchl 6.02.2010, 16:16:15
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 19:42