Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]mysqli_commit
Forum PHP.pl > Forum > Przedszkole
kamilo818
Cześć, moj kod:
  1. $conn = self::getConnection();
  2. mysqli_autocommit($conn,FALSE);
  3. $SQL = "UPDATE fr_product SET name='".$name."', image='".$image."',description='".$description."',price='".$price."',code='".$code."',seo_title='".$seo_title."',seo_keywords='".$seo_keywords."',seo_description='".$seo_description."',newest='".$newest."',recommended='".$recommended."',promotion='".$promotion."',image_promotion='".$image_promotion."',promotion_for_home='".$promotion_main."',products_category='".$category."' WHERE id='".$id."'";
  4. $conn->query($SQL);
  5.  
  6.  
  7. foreach($filters as $k=>$f){
  8.  
  9. $conn->query("UPDATE fr_product_filter SET filter_valuee='".$f."' WHERE product_code='".$code."' AND filter_id='".$k."'");
  10.  
  11. }
  12.  
  13.  
  14. if(mysqli_commit($conn)){
  15. echo '<div class="alert alert-success" role="alert"><a href="#" class="close" data-dismiss="alert" aria-label="close">&times;</a>Operacja wykonana poprawnie!</div>';
  16. }else{
  17. mysqli_rollback($conn);
  18. echo '<div class="alert alert-danger" role="alert"><a href="#" class="close" data-dismiss="alert" aria-label="close">&times;</a><strong>Nieoczekiwany błąd. </div>';
  19.  
  20. }
  21.  
  22. mysqli_close($conn);
  23. break;


  1. if(mysqli_commit($conn)
- zawsze jest true mimo że
  1. $conn->query("UPDATE fr_product_filter SET filter_valuee='".$f."' WHERE product_code='".$code."' AND filter_id='".$k."'");
nie wykonuje się (filter_valuee zamiast filter_value)

Czy ja to zle stosuję?

Chce uzyskać efekt ze jeśli któreś zapytanie nie wykona sie poprawnie to wszystko wraca do punktu poczatkowego.

Będę wdzieczny za pomoc.
nospor
Bo mysqli_commit nie sprawdza czy sie zapytania nie powiodly... To nie jego rola
Pyton_000
@nospor wg dokumentacji tak to właśnie działa. Przykłady nawet ilustrują podobny przypadek.

Użyj $conn->mysqli_commit()

Raczej nie powinno mieć znaczenia mieszanie ale kto wie...
b4rt3kk
Na jakim silniku masz tego MySQL-a? Jeśli MyISAM to transakcje nie są wspierane, musiałbyś się przestawić na InnoDB.
nospor
Cytat
@nospor wg dokumentacji tak to właśnie działa. Przykłady nawet ilustrują podobny przypadek.
Chyba masz innego manuala niz ja. Owszem, w moim manualu jest podobny przyklad co tutaj, ale tylko podobny. Przyklad z manuala w zaden sposob nie pokazuje, ze mysqli_commit zarzadza zepsutymu zapytaniami. Przyklad w manualu i IF mowi jedynie, ze commit sie nie powiodl. Nie mowi nic o pozostalych zapytaniach.


Tak wiec jeszcze raz: COMMIT nie sluzy do mowienia,czy zapytania sie powiodly czy nie. Commit sluzy do zatwierdzenia zapytan, ktore sie powiodly. To user ma wiedziec czy sie zapytania powiodly czy nie i w zaleznosci od tego ma wywolac albo COMMIT albo ROLLBACK - proste.
kamilo818
Mam InnoDB.

Czyli teraz mam tak
  1.  
  2. $conn = self::getConnection();
  3.  
  4. $conn->autocommit(false);
  5.  
  6.  
  7. $SQL = "UPDATE fr_product SET name='".$name."', image='".$image."',description='".$description."',price='".$price."',code='".$code."',seo_title='".$seo_title."',seo_keywords='".$seo_keywords."',seo_description='".$seo_description."',newest='".$newest."',recommended='".$recommended."',promotion='".$promotion."',image_promotion='".$image_promotion."',promotion_for_home='".$promotion_main."',products_category='".$category."' WHERE id='".$id."'";
  8. $result = $conn->query($SQL);
  9.  
  10.  
  11. $err_f = false;
  12. foreach($filters as $k=>$f){
  13.  
  14. if(!$result_filter = $conn->query("UPDATE fr_product_filter SET filter_valuee='".$f."' WHERE product_code='".$code."' AND filter_id='".$k."'")){
  15. $err_f=true;
  16. }
  17. }
  18.  
  19.  
  20. $conn->commit();
  21.  
  22. if($result && $err_f==false){
  23. echo '<div class="alert alert-success" role="alert"><a href="#" class="close" data-dismiss="alert" aria-label="close">&times;</a>Operacja wykonana poprawnie!</div>';
  24. }else{
  25. $conn->rollback();
  26. echo '<div class="alert alert-danger" role="alert"><a href="#" class="close" data-dismiss="alert" aria-label="close">&times;</a><strong>Nieoczekiwany błąd. </div>';
  27.  
  28. }
  29.  
  30. $conn->close();
  31. break;
  32.  


Ok i teraz wydaje mi się że nie działa
  1. $conn->rollback();
ponieważ
  1. $result = $conn->query($SQL);
wykonuje się poprawnie (zmiana w bazie) a
  1. if(!$result_filter = $conn->query("UPDATE fr_product_filter SET filter_valuee='".$f."' WHERE product_code='".$code."' AND filter_id='".$k."'")){
  2. $err_f=true;
  3. }
rzuca błąd w wchodzi w else
  1. $conn->rollback();
  2. echo '<div class="alert alert-danger" role="alert"><a href="#" class="close" data-dismiss="alert" aria-label="close">&times;</a><strong>Nieoczekiwany błąd. </div>';

ale to pierwsze zapytanie nie jest cofnięte.

Jakieś pomysły?

------------------------------
edit

OK działa

  1. $conn = self::getConnection();
  2.  
  3. $conn->autocommit(false);
  4.  
  5.  
  6. $SQL = "UPDATE fr_product SET name='".$name."', image='".$image."',description='".$description."',price='".$price."',code='".$code."',seo_title='".$seo_title."',seo_keywords='".$seo_keywords."',seo_description='".$seo_description."',newest='".$newest."',recommended='".$recommended."',promotion='".$promotion."',image_promotion='".$image_promotion."',promotion_for_home='".$promotion_main."',products_category='".$category."' WHERE id='".$id."'";
  7. $result = $conn->query($SQL);
  8.  
  9.  
  10. $err_f = false;
  11. foreach($filters as $k=>$f){
  12.  
  13. if(!$result_filter = $conn->query("UPDATE fr_product_filter SET filter_valuee='".$f."' WHERE product_code='".$code."' AND filter_id='".$k."'")){
  14. $err_f=true;
  15. }
  16. }
  17.  
  18.  
  19.  
  20.  
  21. if($result && $err_f==false){
  22. [b] $conn->commit();[/b]
  23. echo '<div class="alert alert-success" role="alert"><a href="#" class="close" data-dismiss="alert" aria-label="close">&times;</a>Operacja wykonana poprawnie!</div>';
  24. }else{
  25. $conn->rollback();
  26. echo '<div class="alert alert-danger" role="alert"><a href="#" class="close" data-dismiss="alert" aria-label="close">&times;</a><strong>Nieoczekiwany błąd. </div>';
  27.  
  28. }
  29.  
  30. $conn->close();
  31. break;
  32.  

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.