Historia usuniętych rekordów

0

Hej mam stworzoną stronę panelu administracyjnego dla głownej strony internetowej, w które zwykly użytkownik(administrator) nie bedący informatykiem może dodawać, usuwać i edytować rekordy. Panel jest w postaci tabeli, i potrzebuje dodać taką opcje to gdy administrator usunie rekord (czyli cały wiersz tabeli) to może wejść na strone historia rekordów i ten wiersz sie tam pojawi. Próbowałem coś takiego:

[HTML] pobierz, plaintext

    <html>
     <head>
      <meta charset="utf-8">
      <title>Historia usuwania</title>
     </head>
     <body>
      <center>
     <h1>Rekordy usunięte z bazy</h1>
      <table summary= TEST, id=tabela>
       <tr>
              <th>Id</th><th>Typ Osłonki</th><th>Dodatek Typu Osłonki</th><th>Kolor</th><th>Kaliber</th><th>Pakowanie</th><th>Dodatki</th><th>Ilość m.b (cm.b)</th><th>Gatunek</th><th>Edycja</th><th>Usuń</th>
       </tr>
    <?php
    include('polacz.php');
    if ($sql = $mysqli->prepare( "DELETE FROM oslonki WHERE id = ?;" ))
     
            {
                    echo "<tr>
                            <td>$id</td>
                            <td>$typ_oslonki$typ_oslonki_opis</td>
                            <td>$dod_typ_oslonki$dod_typ_oslonki_opis</td>
                            <td>$kolor$kolor_opis</td>
                            <td>$kaliber</td>
                            <td>$pakowanie$pakowanie_opis</td>
                            <td>$dodatki$dodatki_opis</td>
                            <td>$metry$metry_opis</td>
                            <td>$gatunek$gatunek_opis</td>
                            <td><a href=\"przywroc.php?id=$id\">Przywróć</a></td>
                     </tr>";
            }
            $sql->close();
     
    //else die( "Błąd w zapytaniu SQL! Sprawdź kod SQL w PhpMyAdmin." );
     
     $mysqli->close();
    ?>
      </table>
     
      <a href="index1.php">Powrót do panelu administratora</a>
      </center>
     </body>
    </html>
1

Jak zrobisz DELETE z bazy, to nie ma szans (na twoim poziomie zaawansowania), by pokazać to, co zostało usunięte...

0

No właśnie tylko czy ja to dobrze rozumuje bo skoro usunę rekord to jego już nie bedzie w bazie wiec musze zrrboić jakieś zapytanie do id usunietego rekord aby mi wyswietliło to co usunąłem w panelu administratora?

1

Jeśli chcesz zrobić sobie historię usuwanych rekordów to zastosuj soft delete, czyli zwyczajnie zrób dodatkową kolumnę o nazwie deleted typu bit, którą będziesz ustawiał na 1 jeśli będziesz chciał usunąć rekord. Możesz pokusić się o jeszcze jedną kolumnę, w której przechowałbyś datę ustawienia flagi na 1; i już masz historię. Ot ustawiasz datę na getdate() i flagę na 1 i masz.

Trzeba tylko pamiętać o tym, żeby pomijać rekordy z flagą 1 przy selectach czy joinach etc...

0

Wygląda to mniej wiecej tak:
https://images84.fotosik.pl/1097/a6937e4161fb5a60gen.jpg

a plik usun.php:

<?php
include('polacz.php');
$id = wczytaj("id");
if ($sql = $mysqli->prepare( "DELETE FROM oslonki WHERE id = ?;" ))
{
 $sql->bind_param( "i",  $id);
 $sql->execute();
 $sql->close();
}
$mysqli->close();
header ("Location: //localhost/test/index1.php" );
?>
0
grzesiek51114 napisał(a):

Jeśli chcesz zrobić sobie historię usuwanych rekordów to zastosuj soft delete, czyli zwyczajnie zrób dodatkową kolumnę o nazwie deleted typu bit, którą będziesz ustawiał na 1 jeśli będziesz chciał usunąć rekord. Możesz pokusić się o jeszcze jedną kolumnę, w której przechowałbyś datę ustawienia flagi na 1; i już masz historię. Ot ustawiasz datę na getdate() i flagę na 1 i masz.

Trzeba tylko pamiętać o tym, żeby pomijać rekordy z flagą 1 przy selectach czy joinach etc...

A co to znaczy "datę ustawienia flagi na 1"?

0

A co to znaczy "datę ustawienia flagi na 1"?

Np:

UPDATE Product 
SET Deleted = 1, DeletionDate = getdate() 
WHERE Id = 3
0

stworzyłem kolume deleted tak jak mówiłeś, ino ja chce aby każdy rekord był usuwalny to mam każdemu nadać 1 jako oznaczenie do usunięcia??

0

Tak, na tym polega soft delete. Jedynka to nie jest oznaczenie do usunięcia tylko usunięty rekord. Po prostu nie prezentujesz tych rekordów w aplikacji.

0

to moje zapytanie do bazy jak powinno mniej wiecej wygladac??

0

chyba teraz z cziałem o co do końca chodzi... po prostu rekord nie usunie się z bazy tylko kolumna deleted ma się zmienić po kliknieciu usuń z 0 na 1 przez co nie bedzie wuyświetlane w panelu admina a bedzie wyswietlane w histori bazy. O to chodziło tak? A to soft delete to mam w moim pliku usun php zastosowac??

0

chyba teraz z cziałem o co do końca chodzi... po prostu rekord nie usunie się z bazy tylko kolumna deleted ma się zmienić po kliknieciu usuń z 0 na 1 przez co nie bedzie wuyświetlane w panelu admina a bedzie wyswietlane w histori bazy. O to chodziło tak?

Dokładnie.

A to soft delete to mam w moim pliku usun php zastosowac??

W miejscu gdzie wysyłasz kwerendę do usuwania rekordu.

0

Sorki za moją upierdliwość uczę się. Tylko wiem że to nie o to chodziło co mam w tym pliku, ale ktoś moglby mi objasnic mniej wiecej gdzie i co mam dodać, nie mam tej flagi jak coś :(

usun.php

<?php
include('polacz.php');
$id = wczytaj("id");
if ($sql = $mysqli->prepare( "DELETE FROM oslonki SET deleted = 1 WHERE id = ?  ;" ))
{
 $sql->bind_param( "i",  $id);
 $sql->execute();
 $sql->close();
}
$mysqli->close();
header ("Location: //localhost/test/index1.php" );
?>
1

nie :)
musisz zamiast DELETE puścić UPDATE

if ($sql = $mysqli->prepare( "UPDATE oslonki SET deleted = 1 WHERE id = ?  ;" ))

a gdzie prezentujesz w tabelce dane ( te które możesz usunąć ) robisz select ..... where deleted=0
a gdzie prezentujesz co zostało usunięte dajesz where deleted=1

0

Ja to jestem szara masa, no ucze sie... ale dając update niestety rekord w moim panelu sie dalej wyświetla a ja chce zeby sie mi nie wyswietlał, tylko aby już był w histori rekordów bazy. Próbowałem coś takiego:

<?php
include('polacz.php');
$id = wczytaj("id");
if ($sql = $mysqli->prepare( "UPDATE oslonki SET deleted = 1 WHERE id = ?  ;" ))
{
 $sql->bind_param( "s",  $id);
 $sql->execute();
}
if ($sql = $mysqli->prepare( "DELETE oslonki WHERE deleted = 1  ;" ))
{
 $sql->bind_param( "s",  $id);
 $sql->execute();
}
$mysqli->close();
header ("Location: //localhost/test/index1.php" );
?>
1

Nie miałeś kasować, czyli cały blok z "DELETE ... WHERE deleted=1" jest do usunięcia.
I w index1.hph musisz dodać do SELECT warunek "WHERE deleted = 0" (o ile masz defaulta na 0 ustawionego)

0

AAA sorki rozczailem działa

0

A powiedzcie mi czy można jakoś tak zrobić aby moja baza mysql po "usunięciu rekordu" mogła nadać to samo id choć to id już widnieje w bazie?

0

Nie ma takiej możliwości, bo Id jako coś co określa tożsamość musi być unique. Zawsze możesz numerować rekordy na poziomie aplikacji albo z odpowiedniego selecta.

0

Czyli dla wyglądu mojego panelu admina musiałbym stworzyć coś w stylu lewego id, tzn id które jest samo sobie dam generuje swój numer ale id które ja dodam np pod nazwą numer to też moge dać autoinkrementacje? Taki przykład którego nie chce: usuwam rekord np o id = 10 i chce wstawic nowy rekord to on mi wstawia na 70 bierzacych rekordów rekord o id 71 a nie 10, da się coś z tym zrobić??

0

Hej no dodałem takie coś i petle for która spełnia moje wymagania wszystkie identyfikatory ale gdy usunę jakiś wiersz to mi identygikator przeskakuje np nie mam w panelu rekordu o id 70 wiec dodajac nowy rekord to powinien miec id = 70 a ma id 71,dlaczego??

<?php

include('polacz.php');
$l = 1;

if ($sql =  $mysqli->prepare("SELECT * FROM oslonki WHERE deleted = 0")) 
{ 
        $sql->execute();

        $sql->bind_result($id, $typ_oslonki, $typ_oslonki_opis, $dod_typ_oslonki, $dod_typ_oslonki_opis, $kolor, $kolor_opis, $kaliber, $pakowanie, $pakowanie_opis, $dodatki, $dodatki_opis, $metry, $metry_opis, $gatunek, $gatunek_opis,$deleted);

        while ($sql->fetch())
        { for( $l = 1; $l <= 1; $l++ )
          

                echo "<tr>
                        <td>$id</td>
                        <td>$typ_oslonki$typ_oslonki_opis</td>
                        <td>$dod_typ_oslonki$dod_typ_oslonki_opis</td>
                        <td>$kolor$kolor_opis</td>
                        <td>$kaliber</td>
                        <td>$pakowanie$pakowanie_opis</td>
                        <td>$dodatki$dodatki_opis</td>
                        <td>$metry$metry_opis</td>
                        <td>$gatunek$gatunek_opis</td>
                        <td><a href=\"edycja.php?id=$id\">Edytuj</a></td>
                        <td><a href=\"usun.php?id=$id\" onclick=\"javascript:return confirm('Czy na pewno usunąć?'); \">Usuń</a></td>
                   </tr>";
        }
        $sql->close();
 }
else die( "Błąd w zapytaniu SQL! Sprawdź kod SQL w PhpMyAdmin." );

 $mysqli->close();

?>
0

Popatrz na Id jak na kod genetyczny. Nie może być dwóch takich samych w bazie danych. Nawet jeżeli usuniesz rekord to nowe Id będzie kolejnym numerem. Jak w życiu: jeżeli ktoś umrze to przecież nigdy już nie urodzi się ktoś taki sam, prawda?

Można co prawda cofnąć numerację idków dla tabeli ale nawet nie napiszę jak to zrobić, bo jeszcze Cię skuszę do tego żebyś to zrobiła.

0

nie kij ciągnie mi id z bazy a potrzebuje taki jakby licznik który by działał i przypisywał nowe id do kolumny id, a nie ciągnął mi tego z bazy

0

chodzi o to aby w moim panelu kolumna id zawsze była po kolei nawet jak usunę rekord tak dla wizualnego wyglądu, taki tryb numeracji jakby

0

No to przecież dałem Ci rozwiązanie: Historia usuniętych rekordów

0

Method 1 : Set a variable and use it in a SELECT statement

1.SET @row_number:=0;
2.SELECT @row_number:=@row_number+1 AS row_number,db_names FROM mysql_testing
3.ORDER BY db_names;

no dobra ale co to ma byc to @row_number, mysql_testing??

1 użytkowników online, w tym zalogowanych: 0, gości: 1