Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL] Problem z transakcjami
Forum PHP.pl > Forum > Przedszkole
slawek3422
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
nospor
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
slawek3422
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
nospor
pokaz pelen kod bo pewnie masz gdzies blad logiczny i tyle smile.gif
slawek3422
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. ?>
nospor
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.
slawek3422
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ą
nospor
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.
slawek3422
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ę ...
nospor
ale innoDB to ty uzywasz?

a, i sprawdz czy przypadkiem autocomita nie masz wlaczonego
slawek3422
problem tkwił w InnoDB

dzięki za pomoc nospor

Pozdrawiam
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.