Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]zabezpieczenie przed wpisaniem tego samego rekordu
Forum PHP.pl > Forum > Przedszkole
jacusek
Witam.
Stworzyłem sobie wewnętrzny skrypcik to wpisywania statystyk. Chciałem jakoś go zabezpieczyć przed możliwością wpisywania dwóch takich samych rekordów. Tablica do wpisywania wygląda następująco:
  1. CREATE TABLE `statystyka` (
  2. `ID_STAT` MEDIUMINT(9) NOT NULL AUTO_INCREMENT,
  3. `ID_LEK` VARCHAR(5) NOT NULL COLLATE 'utf8_polish_ci',
  4. `DATA` DATE NOT NULL,
  5. `09_00` TINYINT(3) UNSIGNED NULL DEFAULT NULL,
  6. `10_00` TINYINT(3) UNSIGNED NULL DEFAULT NULL,
  7. `11_00` TINYINT(3) UNSIGNED NULL DEFAULT NULL,
  8. `12_00` TINYINT(3) UNSIGNED NULL DEFAULT NULL,
  9. `13_00` TINYINT(3) UNSIGNED NULL DEFAULT NULL,
  10. `14_00` TINYINT(3) UNSIGNED NULL DEFAULT NULL,
  11. `15_00` TINYINT(3) UNSIGNED NULL DEFAULT NULL,
  12. `16_00` TINYINT(3) UNSIGNED NULL DEFAULT NULL,
  13. `17_00` TINYINT(3) UNSIGNED NULL DEFAULT NULL,
  14. `18_00` TINYINT(3) UNSIGNED NULL DEFAULT NULL,
  15. `19_00` TINYINT(3) UNSIGNED NULL DEFAULT NULL,
  16. `20_00` TINYINT(3) UNSIGNED NULL DEFAULT NULL,
  17. PRIMARY KEY (`ID_STAT`),
  18. UNIQUE INDEX `ID_STAT` (`ID_STAT`),
  19. INDEX `ID_LEK` (`ID_LEK`),
  20. CONSTRAINT `LEK` FOREIGN KEY (`ID_LEK`) REFERENCES `lekarze_old` (`ID_LEK`)
  21. )
  22. COLLATE='utf8_polish_ci'
  23. ENGINE=InnoDB
  24. ROW_FORMAT=DEFAULT
  25. AUTO_INCREMENT=0

No właśnie. Jak, że jest to tabela zliczająca statystykę chciałbym, ze nie było możliwości powtarzania pól ID_LEK i data w jednym rekordzie. Żyby tego uniknąć po wprowadzeniu formularza wymyśliłem coś takiego:
  1. <?php
  2. include('connect2.php');
  3. //sprawdzanie czy pola są w ogóle wypełnione
  4. //ustawienie zmiennej co do sprawdzania czy taki rekord już się znalazł w bazie
  5. $sql2= "select concat(id_lek,data) as stat from statystyka";
  6. $rez2= mysqli_query($mysqli, $sql2);
  7. while ($nowaTab=mysqli_fetch_array($rez2, MYSQLI_ASSOC))
  8. {
  9. $zmienna=$nowaTab['stat'];
  10. }
  11.  
  12. if(($zmienna)==(($_GET['lek']).($_GET['termin']))){
  13. die ("Już wpisałeś takie badanie");
  14. }
  15. //echo (($_GET['lek']).($_GET['termin']));
  16. if(!empty($_GET['termin'])||(!empty($_GET['lek']))||($zmienna)!=(($_GET['lek']).($_GET['termin']))){
  17. //insert do bazy
  18.  
  19. ?>

Kiedy wpisuję
  1. echo $zmienna;

pokazuje mi tylko i wyłącznie informację o ostatnim rekordzie dodanym do bazy - a to mnie kompletnie nie satysfakcjonuje. Chodzi o to, żeby sprawdził całą tabelę czy takiej pary wpisów już nie ma. Co powiniem uzyć w tym przypadku.
Z góry dzięki za pomoc
wookieb
Załóż index UNIQUE na te dwa pola na raz.
Poza tym w swoim zapytaniu użyj WHERE. Po co pobierasz wszystko i sprawdzasz w php? Głupota
jacusek
Dzięki. Najlepsze są najprostsze rozwiązania smile.gif. Ale teraz zastanawiam się jak na podstawie duplicate entry zrobić obsługę błędów. Przeciętny użytkownik w przyszłości nie będzie wiedział co oznacza 'duplicate entry'.
A tak na marginesie to na ilu kolumnach - przy tabeli powiedzmy do 50000 tys. rekordów 12 kolumn można założyć unique index?
wookieb
Na wszystkich. Ale zakładaj tylko na takich, które rzeczywiście są kluczowe.
Można zrobić coś takiego na błędach mysql ale to zależy od upodobań. Moim zdaniem nie jest to "eleganckie".
jacusek
Po prostu się zastanawiam na ile może to zwolnić pracę przy tej skali tabel. Czy w ogóle będzie to niezauważalne dla użytkownika.

A propos nieleganckie - to jak to można zrobić w inny bardziej elegancki sposób winksmiley.jpg chodzi o obsługę takiego błędu.
wookieb
Sprawdzić zapytaniem czy taki rekord istnieje.
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.