Autor Zpráva
Fastman
Profil
Zdravím,

Řeším jeden menší problém s datumem. Jedná se o VIP, kdy daný člověk odešle SMS například 31.1.2016 a tím se mu do databáze přičte 30 dní, což by znamenalo, že VIP by mu vypršelo 30.2.2016 což nikdy nenastane. Je vůči tomuto nějaké řešení, jak tohle fixnout?

Děkuji všem za odpovědi.
Alphard_
Profil *
Nevím, jak to počítáte, ale standardní funkce, v PHP objekt DateTime, určitě dokáže přičíst 30 dní tak, aby výsledkem bylo validní datum. Přímo v MySQL potom date_add.
Joker
Profil
Fastman:
Pokud se tohle děje, používáte buď špatný datový typ, nebo špatnou funkci pro to přičítání.
juriad
Profil
Fastman:
Vytvoříš si tabulku platby (id INT, uzivatel_id INT, od DATE, do DATE, delka INT). Do ní vždy jen budeš přidávat záznamy, nic nikdy nemažeš ani neupravuješ.

Jestli má uživatel zaplaceno, zjistíš dotazem:
SELECT * FROM platby WHERE uzivatel_id = 123 AND do >= '2015-10-03'

Datumy do databáze vkládáš:
INSERT INTO platby (uzivatel_id, od, do, delka) VALUES (123, '2015-10-03', '2015-11-02', 30);

Kromě DateTime lze použít také strtotime v kombinaci s date. Formát datumu pro MySQL je "Y-m-d".
Fastman
Profil
Alphard:
Díky moc. Zkusil jsem
<?php
$date = date_create('2016-01-31');
date_add($date, date_interval_create_from_date_string('30 days'));
echo date_format($date, 'Y-d-m');
?>
a výsledkem bylo 2016-01-03.
juriad
Profil
Protože date_add vrazí nový datum (ten po přičtení). $date zůstává ten původní.
Fastman
Profil
Akorát stále nevím, jak udělám, aby se vzalo aktuální datum, to se převedlo na Y-d-m a poté přičetlo 30 dní a vypsalo jej pomocí echo. Zkusil jsem
<?php
$date = date("Y-m-d");
date_add($date, date_interval_create_from_date_string('30 days'));
echo date_format($date, 'Y-m-d');
?>
to ale z nějakého důvodu nevzalo.
juriad
Profil
<?php
# bez parametru = aktuální datum a čas
$today = date_create();
$today_as_string = date_format($today, 'Y-m-d');
echo $today_as_string;

# připočtením inervalu k $today vznikne $next_month
$next_month = date_add($today, date_interval_create_from_date_string('30 days'));
$next_month_as_string = date_format($next_month, 'Y-m-d');
echo $next_month_as_string;
?>

Nevzalo to z důvodu, že funkce date vrací řetězec a nikoli instanci DateTime.

↓ Nahrazena můra z měsíc. :-)
Fastman
Profil
juriad:
Díky moc, funguje! Akorát jsem tam doplnil chybějící "n" u next_month.
$next_month = date_add...

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: