Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][MYSQL] Problem z transakcjami
slawek3422
post
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 (IMG:http://forum.php.pl/style_emoticons/default/sad.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 10)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 561
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
Go to the top of the page
+Quote Post
slawek3422
post
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
Post #4





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




pokaz pelen kod bo pewnie masz gdzies blad logiczny i tyle (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
slawek3422
post
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 (IMG:http://forum.php.pl/style_emoticons/default/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
Post #6





Grupa: Moderatorzy
Postów: 36 561
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.
Go to the top of the page
+Quote Post
slawek3422
post
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
Post #8





Grupa: Moderatorzy
Postów: 36 561
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.
Go to the top of the page
+Quote Post
slawek3422
post
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
Post #10





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




ale innoDB to ty uzywasz?

a, i sprawdz czy przypadkiem autocomita nie masz wlaczonego
Go to the top of the page
+Quote Post
slawek3422
post
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
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 25.12.2025 - 05:25