ugrás a tartalomhoz

PHP Dátum műveletek, MySQL-ból lekérdezve

Dfoglalo · 2013. Okt. 17. (Cs), 10.11
Sziasztok!

Hogyan tudok MySQL adatbázisból lekérdezett dátumhoz hozzáadni X napot?
$datum = date("Y-m-d", strtotime("+1 month"));
echo $datum;
Ezzel még hozzáadja a napokat a mai dátumhoz. Azonban ha lekérdezek egy dátumot az adatbázisból, majd hozzáadok 1 hónapot, máris nem adja hozzá a hónapot a dátumomhoz. Kiírtam echo-val, hogy a lekérdezés jó e, és igen, jó, de már nem adja hozzá. Szóval ezt a lekérdezett dátumos hozzáadást hogy oldhatom meg?

Remélem hamar kapok választ. Üdvözlettel: Dfoglalo
 
1

A feladatot többféleképp meg

Hidvégi Gábor · 2013. Okt. 17. (Cs), 10.18
A feladatot többféleképp meg lehet oldani. Akár körülnézhetsz a MySQL dokumentációban, milyen kapcsolódó MySQL függvények jöhetnek szóba, akár utánajárhatsz, a PHP hogyan kezeli a dátumokat, és ebből gyorsan rájöhetsz, hogyan tudod egy egyszerű szorzással és összeadással abszolválni a problémát.

A téma zárható.
2

Datetime aritmetika

complex857 · 2013. Okt. 17. (Cs), 10.45
hogyan tudod egy egyszerű szorzással és összeadással abszolválni a problémát.

Dátum idő környékén 4 elemi művelettel dolgozni életveszélyes a szökőévek, óra átállítások és időzónák miatt. SOHA nem jó ötlet egyszerű szorzásokkal operálni, erre vannak a dátum/idő kezelő könyvtárak. Csakhogy egy (legalábbis számomra) klasszikust idézzek: "If you don't hate time zones, you're not a real programmer."

De, hogy az eredeti kérdésre is válaszoljak:
A problémát az okozza, hogy adatbázisból valószínűleg kész stringként (pl: "2013-04-20") kapod vissza a dátumot. Ahoz, hogy ebből számolni tudjon az strtotime() előbb újra EPOC time-á kell alakítanod (másodpercek száma 1970 január elseje óta), erre ugyanúgy használhatod az strtotime() -ot:

date('Y-m-d', strtotime('+1 month', strtotime($date_from_db)));
Mindez persze csak akkor ad majd eredményt ha a php globális időzónája és a dbből jövő dátum ugyanabban az időzónában vannak. Ha időzónákkal is meg kell bírkoznod akkor érdemesebb DateTime objektumokkal operálni.

Másik megoldás lehet elve SQL querybe berakni ezt a műveletet mondjuk DATE_ADD -al, vagy sima összeadással, valahogy így:
select interval 1 month + some_date_column from tabe;
3

Megoldva

Dfoglalo · 2013. Okt. 17. (Cs), 10.55
complex857, ez kellet nekem. Pedig puszta logika az egész... Amúgy úgy próbálkoztam, hogy az adatbázisból lehívva raktam be date() függvénybe, habár butaság volt. Ha ott strtotime()-ba raktam volna bele, majd strtotime('+1 month', $datum)-ot használtam volna, működött is volna a dolog azt hiszem. Vagy így egybe, ahogy te is írtad. És működik is, ezt kerestem. Köszi a megoldást, és a gyors választ :D
4

Az aritmetikával kapcsolatban

Hidvégi Gábor · 2013. Okt. 17. (Cs), 10.58
Az aritmetikával kapcsolatban igazad van, de az szerintem nem járható út, hogy megoldod a delikvens helyett a problémát, mert rövidesen megint ilyen Móriczka-egyszerűségű kérdésekkel fogja teleszemetelni a fórumot, ahelyett, hogy venné a fáradságot, és utánajárna a dolgoknak. Vagy ha sok a szabadidőd, nekem is dolgozhatsz ingyen : )
6

Trollok

Dfoglalo · 2013. Okt. 17. (Cs), 11.31
Utánajártam :) Guglizok napok óta, mivel egyszerűen nem tudtam rájönni a megoldásra. Átnéztem több száz oldalt, de sehol sem találtam a megfelelő megoldást. Köszönöm szépen a helyes megoldást, mert nagy szükségem volt rá. Amúgy azért nyitottam ide, mert itt hamar választ kapok, hiszen úgy láttam, igen sokan vagytok fent, és igen kis időközönként nyílik 1-1 újabb téma, és íródik 1-1 újabb válasz. Az pedig egyedi probléma, hogy nem szeretnéd, hogy az újoncok is profibb szinten használják majd ezt a nyelvet. Tudod azt hinné az ember, azért van ez az oldal, hogy bátran kérdezzünk, de minden ilyen oldalon akad egy olyan troll, aki csak be tud szólni a kezdőbbnek. Valamikor te is voltál ennyire kezdő, mint én. Valaha te sem tudtad ezt a dolgot. Akkor miért baj, hogy én ilyeneket kérdezek? Ahogy felteszem az első kérdésemet, már valakinek gondja akad velem. Szánalmas. Ha pedig nem tetszik, nem olvasod a témát, nem válaszolsz rá, és nem segítesz nekem. Ennyi. A jövőben pedig megvan, hogy kinek a hozzászólásait biztosan nem fogom olvasni. Hiába van nagy tapasztalatod és tudásod ezen a téren, nem kéne lealacsonyítani más személyeket, csak mert kisebb a tudásuk a php terén, és azért, mert mernek segítséget kérni. Congratulations, Mr.




A többi értelmes hozzászólónak mondom: nem szükséges figyelembe vennem az időzónákat, sem a szökőéveket, és a pontos dátum sem olyan fontos az én helyzetemben. Elég egy napra pontos dátum. Amit meg akartam csinálni, azt pedig megcsináltam, köszi a segítséget.
7

Hidd el, én is voltam kezdő,

Hidvégi Gábor · 2013. Okt. 17. (Cs), 11.53
Hidd el, én is voltam kezdő, nekem is voltak hasonló kérdéseim, mint neked, de elég hamar rá lehet jönni, hogy PHP+MySQL fejlesztéshez elég ismerni két url-t, ahonnan minden kideríthető.

Guglizok napok óta, mivel egyszerűen nem tudtam rájönni a megoldásra.
Akkor valamit rosszul csinálsz, mert ha kinyitod a php dokumentáció dátumokkal foglalkozó szekcióját, a második függvény a date_add(), ami - mint ahogy a nevéből kiderül - pont dátumok összeadására való. Ennek öt másodperc alatt utána lehet járni.

Érzésre: jó lenne megtanulnod (számítástechnikai) angolul, párezres a szókészlet, és utána minden szöveget meg fogsz érteni.

Ha új programozási nyelvet vagy rutinkönyvtárat, keretrendszert szeretnék megismerni, egy ideje az az első, hogy végignyálazom a teljes dokumentációját, és akkor összeáll a fejemben a kép, hogy mit lehet vele megcsinálni.

Akkor miért baj, hogy én ilyeneket kérdezek?
Egyrészt azért, mert ilyen kérdésnek a dokumentáció ismeretében nem kéne felmerülnie benned, másrészt a kérdést már mások is feltették, harmadrészt a complex857 által adott kész megoldás nem segíti a fejlődésed (azaz csak részben, mert a szökőéves dolog nekem valóban nem jutott eszembe).

nem kéne lealacsonyítani más személyeket
Csak a statisztikai adatokból indultam ki, mert a hasonló kérdéseket feltevő, hasonló válaszokat kapó elődeid így cselekedtek. Miért gondolkozna bárki, ha kap egy szép sült galambot?
8

Kedves Dfoglalo és Gábor!

Pepita · 2013. Okt. 17. (Cs), 22.21
Egyikteknek sincs igaza teljesen.

Gábor, linkelhetted volna az első hozzászólásodban a doksikat (esetleg a fv-t pontosan), ez sokszor hatalmas segítség, mert idegességében, gyakorlatlanságában, stb okból tényleg nem találta. Kicsit tényleg leszóltad, pedig nem szoktad.

Dfoglalo, pár órás reg-gel letrollozod az egyik legsegítőkészebb profit - hát én is meggondolom, hogy a további kérdéseidet elolvassam-e, pedig én is többet válaszolok, mint kérdezek... Ez így nem egészen kerek. Ebben az esetben a kód kiírásával nagyon nem értek egyet én sem, de complex857 sajnos így szeret bizonyítani. Ha időben látom a témát, biztos hogy én linkelek + megmondom, mit keress. De az tényleg igaz: jobb, ha neked kell rátalálni, mi csak rávezetünk.

Mindketten: légyszíves beszéljetek meg egy találkozót, és hívjátok meg egymást egypár sörre, az én egészségemre ( :) ), vagyis béke legyen veletek.

(Gábor, a szökőév mellett sose felejtsd az óraállítást sem, országonként különböző!)

Még egy odafigyelnivaló (mindenkinek): az adatbázisszerver és a PHP órája (időzónája) nem mindig azonos, mivel többnyire fizikálisan is másik szerver, rendszergizda nem figyelt, te csak a PHP-t állítottad, stb. Az ebből eredő tévedések elkerülésére egy nagyon egyszerű módszer (ha rendszered lehetővé teszi): soha nem használsz MySQL NOW() és társait, mindig (insert és update esetén) PHP-ból előállított időt írsz a DB-be. Ez nem mindig járható út, és lehet emiatt lassabb is a művelet.
Janoszen írt erről egy cikket, amiben minden fontos benne van, de "elhagytam" a könyvjelzőjét. Janoszen, belinkelnéd? Ahol az összes PHP-MySQL időproblémával foglalkozol. (WL cikknek is kéne lenni belőle, és tudástárba vele.)
5

Én a DateTime osztályt

inf · 2013. Okt. 17. (Cs), 11.08
Én a DateTime osztályt használnám a helyedben, kényelmesebb vele, mint függvényekkel...