Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MYSQL] Problem z transakcjami
slawek3422
post 7.04.2009, 12:51:29
Post #1





Grupa: Zarejestrowani
Postów: 142
Pomógł: 7
Dołączył: 3.08.2007
Skąd: śląsk

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


Witam.
Mam pewien problem z transakcjami w MySQL. Mam skrypt, w którym robię zapis do bazy. Zapis ten odbywa się w pętli. Dane zapisują się do różnych tabel. Nie wiem jak zrobić żeby transakcja działała dla wywołania skryptu. Działa mi dla pojedynczej iteracji i jak napotka na problem np w piątej iteracji to te zmiany mi anuluje ale poprzednich nie wycofuje no i robi pozostałe sad.gif
Go to the top of the page
+Quote Post
nospor
post 7.04.2009, 13:04:06
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




no bo jak rozpoczynasz tranzakcje w petli to sie nie dziw ze dziala ci tylko dla danej iteracji. tranzakcje rozpoczynaj przed petla jak chcesz by dzialala ci dla calej petli


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
slawek3422
post 7.04.2009, 13:10:21
Post #3





Grupa: Zarejestrowani
Postów: 142
Pomógł: 7
Dołączył: 3.08.2007
Skąd: śląsk

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


transakcję rozpoczynam przed pętlą, dla każdego zapytania daję:
  1. <?php
  2. if(mysql_errno()) $error = True;
  3. ?>


po zamknięciu pętli (a próbowałem też przed zamknięciem) daję
  1. <?php
  2. if($error){
  3.        @mysql_query("ROLLBACK");
  4.        echo '<div class="err_body">Modyfikacja bazy zakończona niepowodzeniem.</div>';
  5.        exit;
  6.    } else {
  7.        @mysql_query("COMMIT");
  8.       header("Location: index.php");
  9.    }
  10. ?>


i niestety powiedzmy że zapisuję 49 rekordów i celowo w formularzu robię błąd, wtedy zapisuje się 48 rekordów a moim celem jest 49 albo nic
Go to the top of the page
+Quote Post
nospor
post 7.04.2009, 13:13:09
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




pokaz pelen kod bo pewnie masz gdzies blad logiczny i tyle smile.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
slawek3422
post 7.04.2009, 13:20:22
Post #5





Grupa: Zarejestrowani
Postów: 142
Pomógł: 7
Dołączył: 3.08.2007
Skąd: śląsk

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


trochę to będzie skomplikowane smile.gif

dodaj.php <-- formularz
  1. <html>
  2. <link rel="stylesheet" href="styl.css" type="text/css">
  3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  4. <form action="zapis.php" method="post" name="zapis">
  5.  
  6.    <table align="center" border="1">
  7.    
  8.    
  9. <!-- NAZWA -->
  10.        <tr><td class="lewa">
  11.        &nbsp;Nazwa monitora&nbsp;&nbsp;:</td>
  12.        <td colspan="2"><input class="nazwa" name="nazwa" type="text"></td>
  13.        </tr>    
  14.    
  15. <!-- PARAMETRY-->
  16.  
  17.        
  18.        
  19.        <?php
  20.        include('polacz.php');
  21.        $kategorie = mysql_query("SELECT * FROM kategorie ORDER BY kolejnosc ASC ");
  22.            while($row = mysql_fetch_array($kategorie)){
  23.                $id_kategorii = $row['id_kategorii'];
  24.                $kategoria = $row['kategoria'];
  25.                    echo '<tr><td class="lewa">';
  26.                    echo '&nbsp;'.$kategoria.'&nbsp;&nbsp;:</td>';
  27.                    
  28.                            
  29.                            $zapytanie1 = mysql_query("SELECT * FROM parametry WHERE id_kategorii = $id_kategorii order by parametr asc;");
  30.                                   echo '<td class="up">';
  31.                                echo "<select name='$id_kategorii'>
  32.                                        <option value=\"0\">-- nie wybrano --</option>";
  33.                                        while($wynik1 = mysql_fetch_array($zapytanie1)){
  34.                                            $id = $wynik1['id_parametru'];
  35.                                            $parametr = $wynik1['parametr'];    
  36.                                            echo "<option value=\"$id\">";
  37.                                            echo $parametr;
  38.                                            echo "</option>r\t\t\t\t\t\t\t";
  39.                                }
  40.                                echo '</select></td>
  41.        <td align="center"><input class="text" name="'.$id_kategorii.'_input" type="text"></td></tr>';    
  42.                            }
  43.                                
  44.        echo "<tr><td colspan=\"3\">&nbsp;</td></tr>";
  45.        echo "<tr><td colspan=\"3\" align=\"center\"><input type=\"submit\" value=\"Zapisz\">&nbsp;&nbsp;&nbsp;&nbsp;<input type=\"reset\" value=\"Reset\"></td></tr></table>";
  46.                        
  47.                    
  48.        
  49.            ?>


zapis.php
  1. <?php
  2.  
  3.  
  4.    include('polacz.php');
  5.    $nazwa = $_POST['nazwa'];
  6. mysql_query("START TRANSACTION");    
  7.            $query = mysql_query("SELECT nazwa FROM monitor WHERE nazwa = '$nazwa'");
  8.                if(mysql_num_rows($query) == 0){
  9.                $query = mysql_query("INSERT INTO monitor (id_monitora, nazwa, id_sklep) VALUES (NULL, '$nazwa', 0)");
  10.                $query = mysql_query("SELECT id_monitora FROM monitor WHERE nazwa = '$nazwa'");
  11.                    while($row = mysql_fetch_array($query)){
  12.                $id_monitora = $row['id_monitora'];
  13.                
  14.                }
  15.    $kategorie = mysql_query("SELECT * FROM kategorie ORDER BY kolejnosc ASC ");
  16.            while($row = mysql_fetch_array($kategorie)){
  17.                $id = $row['id_kategorii'];
  18.                $kategoria = $row['kategoria'];
  19.                    
  20.        if($_POST["$id"] != 0 && $_POST["$id"."_input"] != null){
  21.            $error = True;
  22.            echo "Wybrano wartość z listy i wpisano do selecta";
  23.            
  24.        }
  25.        if($_POST["$id"] == 0 && $_POST["$id"."_input"] != null){
  26.            $error = 0;
  27.            $parametr = $_POST["$id"."_input"];
  28.            $query = mysql_query("SELECT parametr FROM parametry WHERE parametr = '$parametr' AND id_kategorii = $id");
  29.                if(mysql_num_rows($query) == 0){
  30.            $query = mysql_query("INSERT INTO parametry (id_parametru, id_kategorii, parametr) VALUES (NULL, $id, '$parametr')");
  31.            $query = mysql_query("SELECT id_parametru FROM parametry WHERE parametr = '$parametr' AND id_kategorii = $id");
  32.                    while($row = mysql_fetch_array($query)){
  33.                    $id_parametru = $row['id_parametru'];
  34.                    $query = mysql_query("INSERT INTO parametry_monitora (id_parametru_monitora, id_monitora, id_parametru) VALUES (NULL, $id_monitora, $id_parametru)");
  35.                    
  36.                    }
  37.                    IF(mysql_errno()) $error = True;
  38.                }    else    {
  39.                    
  40.                    $query1 = mysql_query("SELECT id_parametru FROM parametry WHERE parametr = '$parametr' AND id_kategorii = $id");
  41.                    while($row = mysql_fetch_array($query1)){
  42.                    $id_parametru = $row['id_parametru'];
  43.                    $query = mysql_query("INSERT INTO parametry_monitora (id_parametru_monitora, id_monitora, id_parametru) VALUES (NULL, $id_monitora, $id_parametru)");
  44.                    
  45.                    
  46.                }IF(mysql_errno()) $error = True;
  47.            }
  48.        }
  49.        if($_POST["$id"] != 0 && $_POST["$id"."_input"] == null){
  50.            
  51.            echo $_POST["$id"]."<br>";
  52.        }
  53.                    
  54.  
  55. }
  56. if($error){
  57.        @mysql_query("ROLLBACK");
  58.        echo '<div class="err_body">Modyfikacja bazy zakończona niepowodzeniem.</div>';
  59.    } else {
  60.        @mysql_query("COMMIT");
  61.      header("Location: index.php");
  62.    }
  63. }    else echo "Błąd w nazwie monitora";
  64. ?>
Go to the top of the page
+Quote Post
nospor
post 7.04.2009, 13:24:45
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




ten kod to sieczka. zero sensownych wciec, nie wiadomo ktora linijka w jakim while, if, .... siedzi...

tego commit i rollback masz tez w petli czy poza nią? Bo widze ze siedzi w jakims bloku, ale za grzyba nie wiem w jakim. Jesli w petli to masz źle, bo ma byc poza.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
slawek3422
post 7.04.2009, 13:40:34
Post #7





Grupa: Zarejestrowani
Postów: 142
Pomógł: 7
Dołączył: 3.08.2007
Skąd: śląsk

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


może teraz będzie lepiej:
  1. <?php
  2.  
  3. include('polacz.php');
  4. $nazwa = $_POST['nazwa'];
  5. mysql_query("START TRANSACTION");    
  6.  
  7. $query = mysql_query("SELECT nazwa FROM monitor WHERE nazwa = '$nazwa'");
  8.    if(mysql_num_rows($query) == 0){
  9.        $query = mysql_query("INSERT INTO monitor (id_monitora, nazwa, id_sklep) VALUES (NULL, '$nazwa', 0)");
  10.        $query = mysql_query("SELECT id_monitora FROM monitor WHERE nazwa = '$nazwa'");
  11.            while($row = mysql_fetch_array($query)){
  12.                $id_monitora = $row['id_monitora'];
  13.            }
  14.            
  15.        $kategorie = mysql_query("SELECT * FROM kategorie ORDER BY kolejnosc ASC ");
  16.            while($row = mysql_fetch_array($kategorie)){
  17.                $id = $row['id_kategorii'];
  18.                $kategoria = $row['kategoria'];
  19.                
  20.                    if($_POST["$id"] != 0 && $_POST["$id"."_input"] != null){
  21.                        $error = True;
  22.                        echo "Wybrano wartość z listy i wpisano do selecta";
  23.                    }
  24.                    
  25.            if($_POST["$id"] == 0 && $_POST["$id"."_input"] != null){
  26.                $parametr = $_POST["$id"."_input"];
  27.                $query = mysql_query("SELECT parametr FROM parametry WHERE parametr = '$parametr' AND id_kategorii = $id");
  28.                    if(mysql_num_rows($query) == 0){
  29.                        $query = mysql_query("INSERT INTO parametry (id_parametru, id_kategorii, parametr) VALUES (NULL, $id, '$parametr')");
  30.                        $query = mysql_query("SELECT id_parametru FROM parametry WHERE parametr = '$parametr' AND id_kategorii = $id");
  31.                    
  32.                            while($row = mysql_fetch_array($query)){
  33.                            $id_parametru = $row['id_parametru'];
  34.                            $query = mysql_query("INSERT INTO parametry_monitora (id_parametru_monitora, id_monitora, id_parametru) VALUES (NULL, $id_monitora, $id_parametru)");
  35.                            }
  36.                    
  37.                            if(mysql_errno()) $error = True;
  38.                    
  39.                    }    else    {
  40.                    
  41.                        $query1 = mysql_query("SELECT id_parametru FROM parametry WHERE parametr = '$parametr' AND id_kategorii = $id");
  42.                            while($row = mysql_fetch_array($query1)){
  43.                            $id_parametru = $row['id_parametru'];
  44.                            $query = mysql_query("INSERT INTO parametry_monitora (id_parametru_monitora, id_monitora, id_parametru) VALUES (NULL, $id_monitora, $id_parametru)");
  45.                            }
  46.                    
  47.                            if(mysql_errno()) $error = True;
  48.                    }
  49.            }
  50.        
  51.            if($_POST["$id"] != 0 && $_POST["$id"."_input"] == null){
  52.                echo $_POST["$id"]."<br>";
  53.            }        
  54.        }
  55.    }
  56.    
  57.    if($error){
  58.            @mysql_query("ROLLBACK");
  59.            echo '<div class="err_body">Modyfikacja bazy zakończona niepowodzeniem.</div>';
  60.    
  61.        } else {
  62.            @mysql_query("COMMIT");
  63.            header("Location: index.php");
  64.        }    
  65.        
  66. ?>


commit i rollback są poza jakąkolwiek pętlą
Go to the top of the page
+Quote Post
nospor
post 7.04.2009, 13:53:31
Post #8





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




zniknelo teraz z kodu takie cos:$error=0;
nie wiem czy to zamierzone czy nie.
Tak czy siak, teraz gdy natrafisz na blad to powinienes wogole zakonczyc dzialanie petli (break;)

widze tutaj petle w petli. powinienes przerwac wszystkie petle.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
slawek3422
post 7.04.2009, 14:06:56
Post #9





Grupa: Zarejestrowani
Postów: 142
Pomógł: 7
Dołączył: 3.08.2007
Skąd: śląsk

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


zniknęło celowo, a co do break; to teraz pętla działa do napotkania pierwszego błędu czyli zapisy wykonują się kolejno do momentu przerwania pętli, więc zapisując 49 rekordów i robiąc błąd w 10 tym - zapisze się 9, dobrze zapisanych rekordów nie można wycofać .... poddaje się ...
Go to the top of the page
+Quote Post
nospor
post 7.04.2009, 14:13:55
Post #10





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




ale innoDB to ty uzywasz?

a, i sprawdz czy przypadkiem autocomita nie masz wlaczonego


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
slawek3422
post 9.04.2009, 11:27:26
Post #11





Grupa: Zarejestrowani
Postów: 142
Pomógł: 7
Dołączył: 3.08.2007
Skąd: śląsk

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


problem tkwił w InnoDB

dzięki za pomoc nospor

Pozdrawiam
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 Wersja Lo-Fi Aktualny czas: 17.06.2025 - 11:15