Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Dodawanie rekordu raz na miesiąc
Forum PHP.pl > Forum > Bazy danych
kryko
Problem jest taki. W jaki sposób mogę zabezpieczyć taka sytuacje:
Mam tabele z produktami i przypisane do nich ID. Dodatkowo mam tabele z rezerwacjami gdzie kluczem obcym jest ID Produktów. Jak rozwiązać sytuacje, żeby można było wykonać rezerwacje na dany produkt maksymalnie raz w miesiącu. Cos na zasadzie, że jeśli pójdzie INSERT do tabeli z Rezerwacjami to należy sprawdzić czy przypadkiem w tym miesiącu dany produkt nie był już rezerwowany i w razie konieczności zwrócic odpowiedni komunikat.
mortus
Trzeba zapisać datę rezerwacji, a przed dodaniem nowego rekordu dla tego produktu sprawdzać, czy dany miesiąc się już skończył, czy jeszcze nie.
Oczywiście wcześniej trzeba sprawdzić, czy określony produkt był dodany w danym miesiącu.
kryko
No tak w tabeli Rezerwacji przechowuje data. Pytanie brzmi JAK to sprawdzać. Jakaś procedura po stronie bazy czy może po stronie kodu php.
mortus
Zapytaniem z poziomu PHP:
  1. SELECT * FROM `tabela` WHERE `id` = :ID AND YEAR(`data`) = :YEAR AND MONTH(`data`) = :MONTH

gdzie:
:ID - id produktu,
:YEAR - date('Y', time())
:MONTH - date('m', time())

Jeżeli powyższe zapytanie zwróci cokolwiek, to w danym miesiącu produkt o id :ID był już rezerwowany.
kryko
Cytat(mortus @ 19.12.2012, 14:22:01 ) *
Zapytaniem z poziomu PHP:
  1. SELECT * FROM `tabela` WHERE `id` = :ID AND YEAR(`data`) = :YEAR AND MONTH(`data`) = :MONTH

gdzie:
:ID - id produktu,
:YEAR - date('Y', time())
:MONTH - date('m', time())

Jeżeli powyższe zapytanie zwróci cokolwiek, to w danym miesiącu produkt o id :ID był już rezerwowany.


Rozwiązanie wydawało się być ok. Ale w "praniu" wyszła jego niedoskonałość.
Problem się pojawia jak ktoś rezerwuje datę z nie aktualnego na daną chwilę miesiąca. A więc przykładowo jeśli ktoś nie rezerwował daty w grudniu, to może tak na prawdę zarezerwować mi cały styczeń.
Mi zależy na tym aby konkretna osoba mogła w miesiącu dokonać tylko JEDNEJ rezerwacji. Niezależnie na jaki termin (aktualny czy bardzo odległy). Takie zabezpieczenie do nietworzenia fikcyjnych rezerwacji.
Ma ktoś jakieś pomysł na modyfikacje tego zapytania do bazy? Bądź może jakaś sugestia co do napisania jakieś procedury po stronie bazy (niestety nigdy tego nie robiłem).
mortus
Nie wiem, w jakim formacie przesyłasz datę, ale w powyższym zapytaniu wiąże się to jedynie z zastąpieniem funkcji time(). Zatem:
:MONTH - date('m', strtotime(DATA_REZERWACJI))
:YEAR - date('Y', strtotime(DATA_REZERWACJI))
DATA_REZERWACJI - $_POST['data_rezerwacji']
kryko
Dokładnie, ten sposób jest ok. Wczoraj już na niego wpadłem i działa w porządku.
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.