Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL]Ograniczenia wielkości rekordów
vegeta
post 24.11.2010, 19:19:15
Post #1





Grupa: Zarejestrowani
Postów: 122
Pomógł: 0
Dołączył: 9.11.2008

Ostrzeżenie: (10%)
X----


Witam.

Czy jest sposób, żeby dana tabela zawierała maksymalnie X rekordów? Na przykład mam Shoutbox i chcę w bazie trzymać tylko 50 rekordów. Po wysłaniu nowej wiadomości automatycznie kasuje się ostatni wpis w tabeli. Czy obejdzie się to bez PHP (można to zrobić w PHP, ale ja chcę zautomatyzowany proces w samym MySQL)?
Go to the top of the page
+Quote Post
CuteOne
post 24.11.2010, 19:27:40
Post #2





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


Hmmm możesz użyć triggera, który przed insertem usunie starsze wpisy ale chyba łatwiej jest to zrobić poprzez PHP
Go to the top of the page
+Quote Post
blade-mrn
post 24.11.2010, 19:37:45
Post #3





Grupa: Zarejestrowani
Postów: 113
Pomógł: 11
Dołączył: 20.10.2009

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


Czy da się to zrobić w MySql-u nie wiem ale w PHP można to zrobić np tak:
  1. $zapytanie =$db->query ("SELECT * FROM log");
  2. if ($zapytanie->num_rows > 40)
  3. {
  4. $usuwanie = $zapytanie->fetch_assoc();
  5. $zapytanie = $db->query ("DELETE FROM log WHERE id_log=".$usuwanie['id_log']);
  6. }

40 to ilość przechowywanych rekordów.


--------------------
"Wszyscy wiedzą, że czegoś nie da się zrobić, i przychodzi taki jeden, który nie wie, że się nie da, i on to właśnie robi."
Albert Einstein
Go to the top of the page
+Quote Post
vegeta
post 24.11.2010, 22:18:51
Post #4





Grupa: Zarejestrowani
Postów: 122
Pomógł: 0
Dołączył: 9.11.2008

Ostrzeżenie: (10%)
X----


@Spawn: co to za zmienna $db? Wywala mi przy Twojej pierwszej linijce błąd:

Kod
Fatal error: Call to a member function query() on a non-object in (...) on line 16
Go to the top of the page
+Quote Post
kamillo121
post 24.11.2010, 22:23:24
Post #5





Grupa: Zarejestrowani
Postów: 127
Pomógł: 6
Dołączył: 26.07.2009

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


$DB zapewne jest to obiekt klasy, która obsługuje bazę danych, jak sam skrótowiec wskazuje DB -database smile.gif (oczywiście sam sobie musisz stworzyć taką klasę i utworzyć obiekt albo skorzystać z gotowych)
Po prostu wykonaj normalne zapytanie do bazy...

Ten post edytował kamillo121 24.11.2010, 22:24:26
Go to the top of the page
+Quote Post
Mephistofeles
post 24.11.2010, 22:25:05
Post #6





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

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


Czy ty w ogóle myślisz, czy po prostu wklejasz fragmenty do edytora?
Zastanów się jak w swoim skrypcie komunikujesz się z bazą, używasz do tego jakiejś klasy? Wątpię, więc czemu wstawiasz bezmyślnie kod używający obiektu jakiejś klasy zarządzającej bazą?
Go to the top of the page
+Quote Post
vegeta
post 24.11.2010, 23:02:32
Post #7





Grupa: Zarejestrowani
Postów: 122
Pomógł: 0
Dołączył: 9.11.2008

Ostrzeżenie: (10%)
X----


No dobra mam teraz:
Kod
$zapytanie_usuniecie = mysql_query ("SELECT * FROM shoutbox2");
    if ($zapytanie_usuniecie->mysql_num_rows > 50)
    {
    $usuwanie = $zapytanie_usuniecie->fetch_assoc();
    $zapytanie_usuniecie = mysql_query ("DELETE FROM shoutbox2 WHERE id=".$usuwanie['id']);
    }


Ale nie usuwa mi danych, brak błędu. Na 98% wiem, że jest coś z tymi ->. Pytanie: co zrobić?
Go to the top of the page
+Quote Post
daros17
post 24.11.2010, 23:09:12
Post #8





Grupa: Zarejestrowani
Postów: 233
Pomógł: 27
Dołączył: 27.08.2007

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


Spróbuj tak
  1. $zapytanie_usuniecie = mysql_query("DELETE FROM users WHERE id = '$usuwanie[id]'");


Ten post edytował daros17 24.11.2010, 23:09:53
Go to the top of the page
+Quote Post
kamillo121
post 24.11.2010, 23:12:59
Post #9





Grupa: Zarejestrowani
Postów: 127
Pomógł: 6
Dołączył: 26.07.2009

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


1. Sprawdź czy warunek if się spełnia, dodaj w środku jakieś echo tak dla kontroli żeby się upewnić że przechodzi warunek
2.1. Jeżeli tak to odpal sobie phpmyadmin i poćwicz zapytania sql
2.2. Jeżeli nie to wiesz co zrobić

Ten post edytował kamillo121 24.11.2010, 23:13:34
Go to the top of the page
+Quote Post
CuteOne
post 25.11.2010, 00:12:30
Post #10





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


ale co to w ogóle jest?questionmark.gif

if ($zapytanie_usuniecie->mysql_num_rows > 50)

naucz się podstaw bo z każdym "problemem" wynikającym z braku wiedzy będziesz leciał na forum....
Go to the top of the page
+Quote Post
blade-mrn
post 25.11.2010, 11:17:55
Post #11





Grupa: Zarejestrowani
Postów: 113
Pomógł: 11
Dołączył: 20.10.2009

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


Po pierwsze to nie Spown, avatar to nie wszystko smile.gif
Po drugie oczywiście kamillo121 ma rację jeśli chcesz się łączyć z bazą w ten sposób to robi się to tak:
  1. $db = new mysqli ($db_host, $db_user, $db_pass, $db_name);
  2. $zap = $db->query ("tresc zapytania");

A tak możesz sprawdzić ile rekordów zwróciło zapytanie:
  1. $zap->num_rows;


Natomiast co do twojego skryptu to to powinno chyba być tak:
  1. $zapytanie_usuniecie = mysql_query ("SELECT * FROM shoutbox2");
  2. if (mysql_num_rows($zapytanie_usuniecie) > 50)
  3. {
  4. $usuwanie = mysql_fetch_assoc($zapytanie_usuniecie);
  5. $zapytanie_usuniecie = mysql_query ("DELETE FROM shoutbox2 WHERE id=".$usuwanie['id']);
  6. }


Ten post edytował blade-mrn 25.11.2010, 11:18:55


--------------------
"Wszyscy wiedzą, że czegoś nie da się zrobić, i przychodzi taki jeden, który nie wie, że się nie da, i on to właśnie robi."
Albert Einstein
Go to the top of the page
+Quote Post
thek
post 25.11.2010, 11:56:37
Post #12





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




A ja myślę o prostszym rozwiązaniu. Skoro już pobiera informacje z bazy i wie ile ma rekordów to sprawa jest prosta...

Znasz swój limit = 50
Dodajesz nowy rekord bez sprawdzania ilości
Sprawdzasz ilość.
Jeśli jest większa niż limit robisz delete z takim limit ile wystaje ponad niego.

Przykładowo masz 50 i dodałeś do shouta. Zwróci Ci count 51 a więc musisz zrobić delete dla 51-50=1 smile.gif
W efekcie zamiast zarżynać bazę zapytaniami robisz proste 2 lub 3 query w zależności czy osiągnąłeś limit czy nie:

INSERT INTO shoutbox2 jakieś dane; <-zawsze.
SELECT count(id) AS ile FROM shoutbox2; <-zawsze, to lepsze i szybsze niż robić select * i jeszcze potem po stronie php to obliczać, co jest głupotą i marnotrawieniem czasu.
DELETE FROM shoutbox2 LIMIT policzona różnica <- opcjonalnie, a i tak zazwyczaj będzie tutaj 1, jeśli już do usuwania dojdzie.

Widzisz jak Twoje całe kombinowanie się upraszcza?
  1. $limit = 50;
  2. $zapytanie_dodanie = mysql_query('INSERT INTO shoutbox2 jakieś_dane');
  3. $number = mysql_result( mysql_query ('SELECT count(id) AS ile FROM shoutbox2'), 0, 0 );
  4. if( $number > $limit ) {
  5. $zapytanie_usuniecie = mysql_query ('DELETE FROM shoutbox2 LIMIT '.($number-$limit));
  6. }
To jest całość dodawania rekordu wraz z usuwaniem nadmiarowych ponad limit... Takie coś jest już żywcem w sumie do zastosowania.

EDIT: Może wyjaśnię czemu tak... Sprawa jest prosta smile.gif DELETE wywala wszystkie rekordy lecąc od początku tabeli do jej końca. Jeśli więc zrobimy mu LIMIT to wywali X pierwszych wpisów. Skoro wiemy ile mamy ogółem, ile mamy jako limit, to wiemy ile jest ponad stan i tyle mu każemy z początku usunąć. Myślę, że to jedno z najprostszych i jednocześnie bardziej eleganckich bez używania transakcji, która jeszcze bardziej by to zabezpieczyła. Jeśli zaś całość zapiszesz jako procedurę w mysql to masz po prostu rakietę, bo całość nawet nie wyjdzie poza silnik bazy.
Powód edycji: [thek]: Wyjaśnienie


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
vegeta
post 26.11.2010, 20:41:33
Post #13





Grupa: Zarejestrowani
Postów: 122
Pomógł: 0
Dołączył: 9.11.2008

Ostrzeżenie: (10%)
X----


Dzięki wielkie winksmiley.jpg
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: 21.06.2025 - 01:39