Pereiti prie turinio

Eilutės rezervavimas lentelėje (PHP/MySQL)


Rekomenduojami pranešimai

Sveiki,

 

Susidūriau su tokia problemėle ir nelabai pavyksta sugalvoti, kaip ją išspręsti, nes programavime esu gana dar žalias. Kadangi techniškai šiek tiek sudėtinga man papasakoti, ko aš noriu, pamėginsiu paimti pavyzdį iš realaus pasaulio, kad viskas būtų kuo aiškiau.

 

Tarkim vyksta žaidimas, kuriame gali dalyvauti ne daugiau nei 20 dalyvių. Kurie pirmi užsiregistruoja, tie ir dalyvauja. Tarkim žmogus ateina į vietą ir nori užsiregistruoti. Jam įteikiama anketa, kurią jis turi užpildyti ir automatiškai rezervuojama vieta žaidime. Tai reiškia, kad jeigu registruotų ir rezervuotų vietų yra jau 20, tai daugiau registracija nebevykdoma, kol kažkuris iš pildančių anketą nepasitraukė. Jei vienas iš pildančiųjų persigalvojo ir išėjo, tai automatiškai ta vieta atsilaisvina.

 

Tai va man reikia kažko panašaus su PHP/MySQL. Žmogus ateina į puslapį ir nori užsiregistruoti. Jei yra laisvų vietų jis permetamas į registracijos puslapį ir jam automatiškai rezervuojama vieta duombazės lentelėje, kad kitas vartotojas pradėjęs registraciją vėliau, tačiau atlikęs viską greičiau neužimtų pirmojo eilės. Jei pirmasis vidury registracijos nusprendžia, kad nebenori dalyvauti ir išeina iš puslapio, jo rezervacija automatiškai būtų panaikinta ir tuomet kitas žmogus galėtų registruotis.

 

Taigi, kaip reikėtų šitą rezervaciją įgyvendinti? Neprašau parašyti kodo ar išspręsti viską, tiesiog man reikia, kad kažkas užvestų ant kelio, nes dabar net nežinau kokios informacijos ieškoti.

 

Tikiuosi paaiškinau viską gana aiškiai ir atsiras žmogus, kuris bent kažkiek man padės.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Užėjus į puslapį kuriame pildoma anketą tarkim į userių lentą įrašai jau kaip vartotoją su kažkokių unikalių jo kodų (kad ir IP adresų) prie to pačio prirašęs dar ir time() . Kitus įleisdamas į tą puslapį skaičiuoji MySQL lauku skaičių jei viršiją 20 nebeleidi.

 

Jeigu tarkim po 10min neužpildo registracijos formos ištrini jį iš to useriu lauko ir jau kai jis paspaudžia registruotis (po valandos tarkim) rašai, kad registraciją bandytu iš naujo, maždaug session has time out.

 

Kad jis išjungia registracijos puslapį tu nesuseksi (nebent priverstum paspaust mygtuką "atšaukti registraciją"), o taip darai viską su laiku. Laikinas useris, baigėsi laikas - ištrinei.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Užėjus į puslapį kuriame pildoma anketą tarkim į userių lentą įrašai jau kaip vartotoją su kažkokių unikalių jo kodų (kad ir IP adresų) prie to pačio prirašęs dar ir time() . Kitus įleisdamas į tą puslapį skaičiuoji MySQL lauku skaičių jei viršiją 20 nebeleidi.

 

Jeigu tarkim po 10min neužpildo registracijos formos ištrini jį iš to useriu lauko ir jau kai jis paspaudžia registruotis (po valandos tarkim) rašai, kad registraciją bandytu iš naujo, maždaug session has time out.

 

Kad jis išjungia registracijos puslapį tu nesuseksi (nebent priverstum paspaust mygtuką "atšaukti registraciją"), o taip darai viską su laiku. Laikinas useris, baigėsi laikas - ištrinei.

 

Na aš kažką panašaus ir galvojau, bet dabar iškyla kitas klausimas. Kaip turėtų būti daromas patikrinimas ar laikas baigėsi ir įrašo pašalinimas? Kaip suprantu ši užklausa turėtų būti vykdoma tuomet, kai tik žmogus bando registruotis, tuomet automatiškai patikrinama lentelė ir jei reikia pašalinamos jau neaktyvios eilutės. Ar teisingai mąstau?

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Na aš kažką panašaus ir galvojau, bet dabar iškyla kitas klausimas. Kaip turėtų būti daromas patikrinimas ar laikas baigėsi ir įrašo pašalinimas? Kaip suprantu ši užklausa turėtų būti vykdoma tuomet, kai tik žmogus bando registruotis, tuomet automatiškai patikrinama lentelė ir jei reikia pašalinamos jau neaktyvios eilutės. Ar teisingai mąstau?

 

Teisingai. Prieš patikrinimą kiek yra userių įdėti reikėtu MySQl užklausą DELETE FROM `users` WHERE `time` < UNIX_TIMESTAMP() AND `user_status` = 'laikinas'

 

 

o įrašant tą time iškarto pridėk sekundės kiek galios tas laikinas useris.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Teisingai. Prieš patikrinimą kiek yra userių įdėti reikėtu MySQl užklausą DELETE FROM `users` WHERE `time` < UNIX_TIMESTAMP() AND `user_status` = 'laikinas'

 

 

o įrašant tą time iškarto pridėk sekundės kiek galios tas laikinas useris.

 

Na ir iškilo dar vienas klausimas. Tarkim yra "Žaidimas1", "Žaidimas2", "Žaidimas3"...

Gerai, pirmiausia daromas patikrinimas ar kuriame nors žaidime yra laisvos vietos ir atrenkami visi, kuriuose yra laisvos vietos. Po patikrinimo vartotojui pateikiami visi žaidimai, kuriuose yra laisvų vietų ir duodama galimybė jam pasirinkti norimą. Kaip tada turėtų vykdyti rezervacija iki vartotojo pasirinkimo? Nes nežinant kokį žaidimą vartotojas pasirinks, neįmanoma taip paprastai atlikti rezervacijos. Ir tada iškyla kita problema, jei lieka tik viena vieta per visus žaidimus, o vienu metu užklausą atlieka keletas žmonių, tai jiems abiems rodys, jog ta vieta laisva. Kaip to išvengti?

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Na ir iškilo dar vienas klausimas. Tarkim yra "Žaidimas1", "Žaidimas2", "Žaidimas3"...

Gerai, pirmiausia daromas patikrinimas ar kuriame nors žaidime yra laisvos vietos ir atrenkami visi, kuriuose yra laisvos vietos. Po patikrinimo vartotojui pateikiami visi žaidimai, kuriuose yra laisvų vietų ir duodama galimybė jam pasirinkti norimą. Kaip tada turėtų vykdyti rezervacija iki vartotojo pasirinkimo? Nes nežinant kokį žaidimą vartotojas pasirinks, neįmanoma taip paprastai atlikti rezervacijos. Ir tada iškyla kita problema, jei lieka tik viena vieta per visus žaidimus, o vienu metu užklausą atlieka keletas žmonių, tai jiems abiems rodys, jog ta vieta laisva. Kaip to išvengti?

 

Rezervuoti vieta prieš pasirenkant kambary? :) būtų geriausias pasirinkimas.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

  • Prisijunk prie bendruomenės dabar!

    Uždarbis.lt nariai domisi verslo, IT ir asmeninio tobulėjimo temomis, kartu sprendžia problemas, dalinasi žiniomis ir idėjomis, sutinka būsimus verslo partnerius ir dalyvauja gyvuose susitikimuose.

    Užsiregistruok dabar ir galėsi:

    ✔️ Dalyvauti diskusijose;

    ✔️ Kurti naujas temas;

    ✔️ Rašyti atsakymus;

    ✔️ Vertinti kitų žmonių pranešimus;

    ✔️ Susisiekti su bet kuriuo nariu asmeniškai;

    ✔️ Naudotis tamsia dizaino versija;

    ir dar daugiau.

    Registracija trunka ~30 sek. ir yra visiškai nemokama.

  • Naujausios temos

  • Karštos temos

×
×
  • Pasirinkite naujai kuriamo turinio tipą...