Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]logi
Forum PHP.pl > Forum > Przedszkole
kamilo818
Mym pytanie na temat logow.
Chciałbym aby zapisywały mi się wszystkie działania na bazie danych. Tzn jeśli użytkownik dodał rekord -> log, jeśli usunął -> log, jeśli jakaś operacja się nie powiodła -> log.

Aktualnie robię to tak ze w funkcji która wykonuje operacje na bazie mysql mam kolejna funkcje addLog() która w zależności od tego czy operacja zwróciła false czy true dodaje odpowiedni rekord do bazy.
Dodawana tam są informacje : kto, kiedy, do jakiej tabeli, jaka akcja ( dodanie, usunięcie ), wartość na jaka miała być zmieniona.

W sumie działa to jak oczekuje. Ale może jest jakaś wbudowana funkcja mysql czy php która dzięki której lepiej można gromadzić logi. Albo czy można jakoś to lepiej napisać ? W sensie czy moje podejście do tematu nie jest błędne .
rad11
Uzyj do tego wyzwalaczy.

  1. DROP TRIGGER IF EXISTS `NAZWA_WYZWALACZA`;
  2. SET @OLDTMP_SQL_MODE=@@SQL_MODE, SQL_MODE='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';
  3. DELIMITER //
  4. CREATE TRIGGER `NAZWA_WYZWALACZA` AFTER UPDATE ON `NAZWA_SLEDZONEJ_TABELI` FOR EACH ROW BEGIN
  5.  
  6. IF (@user_id IS NULL ) THEN
  7. SET @user_id=0;
  8. END IF;
  9.  
  10. IF OLD.NAZWA_SLEDZONEGO_POLA1<> NEW.NAZWA_SLEDZONEGO_POLA1 THEN
  11. INSERT INTO logs (user_id,object,object_field,object_id,new_value,old_value,date) VALUES (@user_id,'rounds_country','name',OLD.id,NEW.name,OLD.name,NOW()); -- DEFINICJA CO ZAPISUJESZ W TABELI DZIENNIKA
  12. END IF;
  13.  
  14. END//
  15. DELIMITER ;
  16. SET SQL_MODE=@OLDTMP_SQL_MODE;


w phpie ustawiasz tylko user_id

  1. set @user_id = TUTAJ NUMER ID USERA
kamilo818
Dobra super opcja.

Nie wiem jak ustawic w php set @user_id = TUTAJ NUMER ID USERA. Po wipisaniu tego po prostu
  1. <?php
  2. set @user_id = TUTAJ NUMER ID USERA
  3. ?>


wywala błędy
rad11
Stworz sobie tabele:
  1. CREATE TABLE IF NOT EXISTS `logs` (
  2. `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  3. `user_id` smallint(5) unsigned NOT NULL,
  4. `object` varchar(50) COLLATE utf8_unicode_ci NOT NULL COMMENT 'nazwa tabeli',
  5. `object_field` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  6. `object_id` int(10) unsigned NOT NULL COMMENT 'id rekordu',
  7. `new_value` mediumtext COLLATE utf8_unicode_ci,
  8. `old_value` mediumtext COLLATE utf8_unicode_ci,
  9. `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  10. PRIMARY KEY (`id`),
  11. KEY `object` (`object`,`object_field`,`object_id`,`date`,`user_id`),
  12. KEY `user_id` (`user_id`)
  13. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;


potem uruchom wyzwalacz w phpmyadmin np:
  1. DROP TRIGGER IF EXISTS `NAZWA_WYZWALACZA`;
  2. SET @OLDTMP_SQL_MODE=@@SQL_MODE, SQL_MODE='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';
  3. DELIMITER //
  4. CREATE TRIGGER `NAZWA_WYZWALACZA` AFTER UPDATE ON `NAZWA_SLEDZONEJ_TABELI` FOR EACH ROW BEGIN
  5.  
  6. IF (@user_id IS NULL ) THEN
  7. SET @user_id=0;
  8. END IF;
  9.  
  10. IF OLD.NAZWA_SLEDZONEGO_POLA1<> NEW.NAZWA_SLEDZONEGO_POLA1 THEN
  11. INSERT INTO logs (user_id,object,object_field,object_id,new_value,old_value,date) VALUES (@user_id,'rounds_country','name',OLD.id,NEW.name,OLD.name,NOW()); -- DEFINICJA CO ZAPISUJESZ W TABELI DZIENNIKA
  12. END IF;
  13.  
  14. END//
  15. DELIMITER ;
  16. SET SQL_MODE=@OLDTMP_SQL_MODE;

a to linijke:

  1. set @user_id = TUTAJ NUMER ID USERA


ustawiaj w przed miejscem w ktorym robisz update, insert itd.
kamilo818
  1. set @user_id = $_SESSION['nick'];
  2. mysqli_query($db, "UPDATE $tabela SET $rekord_zmiana = '$wartosc_zmiana' WHERE $rekord = '$wartosc'");


tak?
nie działa :/
rad11
Oczywiscie ta linijke z set ustaw jako zwykle zapytanie z poziomu php.

  1. mysqli_query($db, "set @user_id = $_SESSION['nick']");


tylko czy nick to jest id usera? I przed albo za zapytaniem ale chyba raczej za haha.gif sorry jak pisalem przed.
kamilo818
Dzięki smile.gif

A jeszcze pytanie.
Czy mogę zamiast @user_id usawić całą nazwę? Bo w tym przypadku tylko cyfry da sie zapisać pod @user_id
rad11
Lepiej jak masz powiazanie poprzez id usera, ale tak mozesz tez zrobic jako nick.
kamilo818
ok, ale jak bo w taki sposób nie wychodzi.
pod $_SESSION['nick'] jest np user@o2.pl
  1. mysqli_query($db, "set @user_id = $_SESSION['nick']");


//edit

juz wiem smile.gif
rad11
No musisz zmienic w strukturze tabeli user_id na nick i jako varchar.
kamilo818
A jest możliwość aby trigger dodawał rekord gdy operacja sie nie powiedzie? Bo teraz zbieram tylko logi z udanymi zmianami w tabeli. A chciałbym jeszcze gdy coś sie nie powiedzie.
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.