Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Skripta za zakazivanje termina u PHP

[es] :: PHP :: Skripta za zakazivanje termina u PHP

[ Pregleda: 1260 | Odgovora: 16 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

kladar
Novi Sad

Član broj: 187182
Poruke: 172
87.116.176.*



+4 Profil

icon Skripta za zakazivanje termina u PHP30.09.2021. u 18:23 - pre 31 meseci
Pozdrav ljudi,

Ako može malo pomoći oko ovog konflikta,bio bih zahvalan. Amater sam u PHP-u i zaglavio sam se u kodu.
Situacija je sledeća:
1.Korisnik se uloguje u sistem, izabere svog doktora i unese datum i vreme kada želi zakazati termin. To funkcioniše besprekorno.
2.Drugi korisnik sa nekog drugog mesta se uloguje, izabere istog doktora i unese isti datum i vreme za zakazivanje.

Dobijam dva uspešno zakazana termina u isto vreme kod istog doktora, za dva različita pacijenta. Što znači i da njih 10 može isto to učiniti.
Doktor, kad se uloguje u svoj profil, vidi nekoliko osoba zakazanih u istom terminu.
Kako da izbegnem preklapanje?
Odnosno, kako da podesim da, kad se ulogujem kao neki pacijent i pokušam zakazati termin kod doktora, to ne mogu učiniti ako se neko zakazao pre mene?
I da eventualno imam prikaz sledećeg slobodnog termina.
Ovaj PHP sistem u originalu nema to što želim, već je zakazivanje slobodno, upravo kako sam naveo.
Dakle, u pitanju bi bila prepravka koda, ili Mysql baze, ali nakon par dana pretrage i probe nekih rešenja, nisam uspeo ništa uraditi.
Ako je dozvoljeno poslaću ceo kod u ZIP-u ovde,ili segment, pa ako neko ima rešenje, bio bih zahvalan.
 
Odgovor na temu

Zlatni_bg
Nikola S
Beograd

Član broj: 65708
Poruke: 4420
87.116.177.*



+498 Profil

icon Re: Skripta za zakazivanje termina u PHP30.09.2021. u 19:26 - pre 31 meseci
Mozes da napravis neku veznu tabelu ili nesto, da ne bude bas preko timestampova, da ne stavljas recimo "doktor zauzet od tad do tad".

Ja bih tu ubacio recimo ordinacije. Ordinacija se zauzima u terminima koji su definisani, i vezuje doktora i pacijenta po nekoj vrednosti, auto-increment ili neka sifra zakazivanja. U vremenskom periodu od - do je zauzeta od strane doktora tog i tog, i pacijenta tog i tog.

Kada zakazujes termin, povlacis relaciju izmedju doktora i ordinacija, i gledas koji su slobodni termini. Logiku napravis da ne bude "okej, doktor je slobodan sledece sekunde, dacu mu termin od 7 minuta i 15 sekundi". Ima mnogo nacina da implementiras termine. Mozes da uzimas ciste vrednosti u satima, a mozes i da stavis jos jedan entitet "termini" gde bi bili definisani od kad do kad traju odredjeni u danu.

Sve zavisi koliko zelis da zakomplikujes, ili olaksas sebi posao. Nekad je lakse da ubacis sto vise entiteta. Lakse ti je da prosiris logiku.

Moj predlog tabela:

Doktori
Pacijenti
Ordinacije
ListaTermina (definises vremenska razdoblja u danu)
ZakazaniTermini

Pacijent bira doktora iz termina koji mu je ponudjen (onaj koji je slobodan, a vuce se iz zakazanih termina koji su povezani sa listom termina koja definise kad je koji termin), dodeljuje se slobodna ordinacija, ili ordinacija koja pripada tom lekaru (nekad ima vise lekara a jedna ordinacija?), i po danima imas tipa 10-15 termina koje zauzimas jer vidim da ne zelis da se petljas sa vremenskim razdobljem. Njega onda definises u toj listi termina, ima ID, svaki dan je neka zasebna vrednost u tabeli ZakazaniTermini i to je to. Ne dozvoljavas da se isti lekar i/ili ordinacija dodele ukoliko im je taj termin zauzet tog i tog dana.
THE ONLY EASY DAY WAS YESTERDAY
 
Odgovor na temu

kladar
Novi Sad

Član broj: 187182
Poruke: 172
87.116.176.*



+4 Profil

icon Re: Skripta za zakazivanje termina u PHP30.09.2021. u 19:45 - pre 31 meseci
Aha,ok...
Tabele doktori,pacijenti,zakazani termini već imam u bazi. Dodaću i ovu sa listom termina,a inače imam 3 doktora koji koriste istu ordinaciju. Svaki ima radno vreme 8 sati i u tome moram kreirati termine po 45 minuta. Ok pozabaviću se time sutra.
Hvala Zlatni_bg
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Skripta za zakazivanje termina u PHP30.09.2021. u 19:53 - pre 31 meseci
Ako ti update query ne vrati TRUE, onda zakazivanje termina nije uspelo:

https://www.w3schools.com/php/php_mysql_update.asp

Ne znam na koji način upisuješ rezervaciju u MySQL bazu, ali ti on obezbeđuje logiku.
Recimo da imaš tabelu SCHEDULE

DOCTOR_ID
OFFICE_ID
PATIENT_ID
TIMFRAME

onda, recimo uradiš
insert into schedule values (1, 1, 1234, 55) where not exists (select 1 from schedule where doctor_id = 1 and office_id =1 and timeframe = 55)

Ako uspe insert, onda termin za tog doktora i tu ordinaciju i to vreme nije bio zauzet, inače se ne upiše ništa.
Imaš koliko god hoćeš načina da ne dozvoliš dvostruki upis ili update...
 
Odgovor na temu

kladar
Novi Sad

Član broj: 187182
Poruke: 172
87.116.160.*



+4 Profil

icon Re: Skripta za zakazivanje termina u PHP30.09.2021. u 20:09 - pre 31 meseci
Ovako izgleda sql za moju bazu.
Baza: doctordb
Appointment_list su zakazani termini
Zatim doctors_list i patient_list, a doctors_schedule je radno vreme doktora (8 sati, prepodne ili popodne)

Code:
-- phpMyAdmin SQL Dump
-- version 5.1.1
-- https://www.phpmyadmin.net/
--
-- Host: localhost
-- Generation Time: Sep 29, 2021 at 05:00 PM
-- Server version: 10.4.20-MariaDB
-- PHP Version: 7.4.21

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
START TRANSACTION;

SET GLOBAL time_zone = "+02:00";



--
-- Database: `doctordb`
--

-- --------------------------------------------------------

--
-- Table structure for table `appointment_list`
--

CREATE TABLE `appointment_list` (
  `id` int(30) NOT NULL,
  `doctor_id` int(30) NOT NULL,
  `patient_id` int(30) NOT NULL,
  `schedule` datetime NOT NULL,
  `status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0= for verification, 1=confirmed,2= reschedule,3=done',
  `date_created` datetime NOT NULL DEFAULT current_timestamp()
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

--
-- Dumping data for table `appointment_list`
--

INSERT INTO `appointment_list` (`id`, `doctor_id`, `patient_id`, `schedule`, `status`, `date_created`) VALUES
(38, 4, 5, '2021-09-23 17:00:00', 0, '2021-09-22 19:52:02');

-- --------------------------------------------------------

--
-- Table structure for table `doctors_list`
--

CREATE TABLE `doctors_list` (
  `id` int(30) NOT NULL,
  `name` text NOT NULL,
  `name_pref` varchar(100) NOT NULL,
  `clinic_address` text NOT NULL,
  `contact` text NOT NULL,
  `email` text NOT NULL,
  `specialty_ids` text NOT NULL,
  `img_path` text NOT NULL,
  `date_created` datetime NOT NULL DEFAULT current_timestamp()
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

--
-- Dumping data for table `doctors_list`
--

INSERT INTO `doctors_list` (`id`, `name`, `name_pref`, `clinic_address`, `contact`, `email`, `specialty_ids`, `img_path`, `date_created`) VALUES
(4, 'petar petrović', 'doktor medicine', 'petra petrovića 2,  21000 Novi Sad', '+381 222222222', '[email protected]', '[7]', '1631635740_Screenshot_20210914-175252-399.png', '2021-09-14 17:17:51');

-- --------------------------------------------------------

--
-- Table structure for table `doctors_schedule`
--

CREATE TABLE `doctors_schedule` (
  `id` int(30) NOT NULL,
  `doctor_id` int(30) NOT NULL,
  `day` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_croatian_ci NOT NULL,
  `time_from` time NOT NULL,
  `time_to` time NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

--
-- Dumping data for table `doctors_schedule`
--

INSERT INTO `doctors_schedule` (`id`, `doctor_id`, `day`, `time_from`, `time_to`) VALUES
(27, 4, 'Ponedeljak', '14:00:00', '20:00:00'),
(28, 4, 'Utorak', '14:00:00', '20:00:00'),
(29, 4, 'Sreda', '14:00:00', '20:00:00'),
(30, 4, 'Četvrtak', '14:00:00', '20:00:00'),
(31, 4, 'Petak', '14:00:00', '20:00:00'),
(32, 5, 'Ponedeljak', '10:00:00', '14:00:00'),
(33, 5, 'Utorak', '10:00:00', '14:00:00'),
(34, 5, 'Sreda', '10:00:00', '14:00:00'),
(35, 5, 'Četvrtak', '10:00:00', '14:00:00'),
(36, 5, 'Petak', '10:00:00', '14:00:00'),
(37, 6, 'Ponedeljak', '10:00:00', '14:00:00'),
(38, 6, 'Utorak', '10:00:00', '14:00:00'),
(39, 6, 'Sreda', '10:00:00', '14:00:00'),
(40, 6, 'Četvrtak', '10:00:00', '14:00:00'),
(41, 6, 'Petak', '10:00:00', '14:00:00');

-- --------------------------------------------------------


--
-- Table structure for table `patient_list`
--

CREATE TABLE `patient_list` (
  `id` int(30) NOT NULL,
  `name` text NOT NULL,
  `contact` varchar(30) NOT NULL,
  `email` varchar(100) NOT NULL,
  `password` varchar(200) NOT NULL,
  `price` varchar (10) NOT NULL,
  `type` tinyint(1) NOT NULL DEFAULT 3 COMMENT '3=patient',
  `date_created` datetime NOT NULL DEFAULT current_timestamp()
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

--
-- Dumping data for table `patient_list`
--

INSERT INTO `patient_list` (`id`, `name`, `contact`, `email`, `password`, `price`, `type`, `date_created`) VALUES
(5, 'ivana ivić', '0642222222', '[email protected]', '7f112a7714e70f6efc5d59374f49dde1', 1500, 3, '2021-09-22 19:48:59');

-- --------------------------------------------------------


--
-- Indexes for dumped tables
--

--
-- Indexes for table `appointment_list`
--
ALTER TABLE `appointment_list`
  ADD PRIMARY KEY (`id`);

--
-- Indexes for table `doctors_list`
--
ALTER TABLE `doctors_list`
  ADD PRIMARY KEY (`id`);

--
-- Indexes for table `doctors_schedule`
--
ALTER TABLE `doctors_schedule`
  ADD PRIMARY KEY (`id`);

--
-- Indexes for table `patient_list`
--
ALTER TABLE `patient_list`
  ADD PRIMARY KEY (`id`);


--
-- AUTO_INCREMENT for dumped tables
--

--
-- AUTO_INCREMENT for table `appointment_list`
--
ALTER TABLE `appointment_list`
  MODIFY `id` int(30) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=41;

--
-- AUTO_INCREMENT for table `doctors_list`
--
ALTER TABLE `doctors_list`
  MODIFY `id` int(30) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8;

--
-- AUTO_INCREMENT for table `doctors_schedule`
--
ALTER TABLE `doctors_schedule`
  MODIFY `id` int(30) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=42;


--
-- AUTO_INCREMENT for table `patient_list`
--
ALTER TABLE `patient_list`
  MODIFY `id` int(30) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;

COMMIT;


 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Skripta za zakazivanje termina u PHP30.09.2021. u 20:18 - pre 31 meseci
Pa već sam ti napisao, ne radiš insert u tabelu appointment_list ako već postoji slog sa tim doctor_id i schedule.
Tebi je problem rad sa bazama, a ne PHP.

Pogledaj, recimo, select for update konstrukciju https://dev.mysql.com/doc/refm...,would%20set%20on%20the%20rows.
Ne znam koju verziju baze koristiš, ali POSTOJI LOGIKA. Ne upisuješ, ako slog postoji. Lokuješ slog koji hoćeš da promeniš.
 
Odgovor na temu

Zlatni_bg
Nikola S
Beograd

Član broj: 65708
Poruke: 4420
87.116.177.*



+498 Profil

icon Re: Skripta za zakazivanje termina u PHP30.09.2021. u 20:32 - pre 31 meseci
Pa moze i u PHPu da odradi taj deo s obzirom da ne verujem da se radi o API-ju. Jednostavno ne daje mogucnost da se izabere taj termin i to je to. Napravi funkciju da se izlistaju po danima slobodni termini. Jedino zbog dodatne validacije na nivou DB-a moze da radi update if not exists, ali to mi nekako ne ide kao nesto sto bi trebalo uopste da se desi kao query u ovom slucaju, a da vrati false.
THE ONLY EASY DAY WAS YESTERDAY
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Skripta za zakazivanje termina u PHP30.09.2021. u 20:50 - pre 31 meseci
Može da se desi da dva klijenta u isto vreme gledaju kada ima slobodni termin i da u isto vreme pokušaju da zakaži isti termin.
Jednostavno, logika za upis termina (insert ili update) mora da dozvoli samo jednom pacijentu unos, drugom da javi da rezervacija nije uspela i da ga vrati na formu za rezervaciju.
Taj mehanizam obezbeđuje baza.
 
Odgovor na temu

Zlatni_bg
Nikola S
Beograd

Član broj: 65708
Poruke: 4420
87.116.177.*



+498 Profil

icon Re: Skripta za zakazivanje termina u PHP30.09.2021. u 22:56 - pre 31 meseci
Jeste, ali je pitanje koliko se cesto i zakazuje, itd, itd... ovo moze da se realizuje na 50 nacina, a iskreno, valjalo bi i sa php strane zastititi mogucnost zakazivanja, a i sa DB strane naravno. Mada pretpostavljam da ako ne na DB nivou, ubacio bi validaciju na PHPu bar pri zakazivanju.

Idealan sistem bi bio reaktivni front + api + websockets + validacija na svim nivoima da ne moze da dodje do toga da iko uopste moze da bude u situaciji da u isto vreme zakaze termin.

Takodje, ne znam da li je sistem interni - u smislu da neko u "zdravstvenoj ustanovi" to sve zakazuje, ili pacijenti sami - to diktira dalje kompleksnost. Ali, da, stoji da je potrebno imati i lock mehanizam u svakom slucaju da ne bi dolazilo do raznih scenarija.
THE ONLY EASY DAY WAS YESTERDAY
 
Odgovor na temu

mjanjic
Šikagou

Član broj: 187539
Poruke: 2700



+699 Profil

icon Re: Skripta za zakazivanje termina u PHP01.10.2021. u 12:10 - pre 30 meseci
Možda je overkill, ali bi bio poželjan neki trigger u bazi koji će pri rezervaciji termina od strane jednog pacijenta odmah osvežiti slobodne/zauzete termine kod onih koji trenutno vrše pregled slobodnih termina.
Blessed are those who can laugh at themselves, for they shall never cease to be amused.
 
Odgovor na temu

Deunan

Član broj: 338178
Poruke: 84
*.kti.rs.



+21 Profil

icon Re: Skripta za zakazivanje termina u PHP01.10.2021. u 15:39 - pre 30 meseci

Mozes samo da proveris da li je termin zauzet.
Code:

$start = '10:00';
$end = '11:30';

SELECT * FROM `doctors_schedule` WHERE doctor_id = 1 AND (time_from > $start AND time_from < $end) OR (time_to > $start AND time_to < $end) OR ($start > time_from AND start < time_to)

if(empty)  {
  // nije zauzeto, upisi
} else {
  // TERMIN JE ZAUZET
}


Bolje ti je da prebacis 'time_to' i 'time_from' iz TIME u TIMESTAMP ili DATETIME field. I napravi neki kalendar koji pokazuje slobodne termine.
 
Odgovor na temu

kladar
Novi Sad

Član broj: 187182
Poruke: 172
87.116.162.*



+4 Profil

icon Re: Skripta za zakazivanje termina u PHP05.10.2021. u 18:22 - pre 30 meseci
Evo me.
Nisam hteo da se javljam dok bar nešto ne uradim, s obzirom da je komentar od @djoka_l, potpuno ispravan u vezi mog znanja o bazama, pa sam istraživao teme lokovanja.
Uglavnom postigao sam da jedan korisnik može izabrati termin i rezervisati ga, dok drugi ulogovan na nekom drugom mestu, ne može zauzeti to isto vreme. Ali može zakazati termin 1 minut kasnije .... pozabaviću se time kasnije, jer želim da od trenutka zakazivanja, taj doktor bude nedostupan narednih 45 minuta.
Trenutno imam tabelu i funkciju koja izlistava radno vreme pojedinačnog doktora po danima, pa moram kreirati i tabelu sa terminima u danu i skriptu koja će to prikazati pacijentu.
U svakom slučaju svima hvala, svaki komentar sam pojedinačno razrađivao i po njemu pokušavao.
 
Odgovor na temu

VladaSu

Član broj: 31634
Poruke: 1099
*.astratelekom.rs.



+218 Profil

icon Re: Skripta za zakazivanje termina u PHP06.10.2021. u 14:07 - pre 30 meseci
@Deunan ti je dao jednostavno i sigurno resenje. Pre upisa u bazu proveris da li je termin slobodan. Za tako nesto ti je potrebno 3 reda u PHP.
[Ovu poruku je menjao VladaSu dana 14.06.2003. u 11:22 GMT+1]
 
Odgovor na temu

kladar
Novi Sad

Član broj: 187182
Poruke: 172
87.116.162.*



+4 Profil

icon Re: Skripta za zakazivanje termina u PHP10.10.2021. u 15:36 - pre 30 meseci
@VladaSu, to je ok što se tiče provere slobodnog termina od strane pacijenta.
Ali npr. imamo pacijenta koji ne želi proveravati, ne zanima ga, on prosto ukuca termin koji mu odgovara. To želim onemogućiti funkcijom u Mysql-u ili u PHP-u.
Npr. prvi termin rada je: start_1 u 10:15:00 i traje do end_1 u 11:00:00 i kada prvi pacijent rezerviše u 10:15, želim svima ostalima onemogućiti taj interval od 45 minuta za rezervaciju.
E onda će taj neki drugi (bahati ), koji ne želi proveravati ništa, nakon ukucavanja dobiti info kako je termin zauzet i tek tad će pogledati koji je naredni slobodan.
Sa SELECT....FOR UPDATE mogu da blokiram dupliranje u 10:15:00, ali već u 10:16:00 može se zakazati...
 
Odgovor na temu

Predrag Supurovic
Pedja YT9TP
Užice

Član broj: 157129
Poruke: 6279

Sajt: pedja.supurovic.net


+1570 Profil

icon Re: Skripta za zakazivanje termina u PHP10.10.2021. u 15:52 - pre 30 meseci
Pa ne proverava korisnik rezerbacije nego program. Ako termin nije slobodan, program obavesti korisnika o tome i ne upiše rezervaciju.

 
Odgovor na temu

kladar
Novi Sad

Član broj: 187182
Poruke: 172
87.116.181.*



+4 Profil

icon Re: Skripta za zakazivanje termina u PHP10.10.2021. u 16:11 - pre 30 meseci
Loše sam se izrazio @Pedja, ali upravo to želim da modifikujem u postojećoj skripti.
Da korisnik bude obavešten od strane programa i da program u terminu od npr. 10:15:00 do 11:00:00 ne upiše rezervaciju, jer je već upisana za nekog drugog korisnika.
 
Odgovor na temu

VladaSu

Član broj: 31634
Poruke: 1099
*.astratelekom.rs.



+218 Profil

icon Re: Skripta za zakazivanje termina u PHP10.10.2021. u 21:14 - pre 30 meseci
Ta provera koju sam rekao MORA da postoji. To je krajnja provera PHP-a. To ne proverava koristnik vec program.
Pored ove provere teoretski moze da se desi da u istoj milisekundi se izvrsava ova provera za dva klijenta. To je jako malo verovatnoca.
Obicno se izostavi provera na nivou baze i ostavi mogucnost da se desi takva greska i obicno se takva greska nikada ne desi.
Ne desi se ova greska ni na sajtovima koji imaju mnogo vise korisnika, a kamoli na sajtu gde ce dnevno 20 ljudi pokusati da rezervise termin.
Ali ako vec hoces da budes siguran sa bazom ne znam da li ce ti SELECT FOR UPDATE resiti problem jer on privremeno zakljuca citanje odredjenog reda i da se na tom redu ne bi desio update.
Za tako nesto ti treba odgovarajuca struktura baze (tabele i kolone), a mislim da tvoja struktura nije odgovarajuca.

Mozda ti problem resi LOCK TABLES tabela READ. Kada se desi da u isto vreme dva klijenta citaju iz tabele da li je slobodan termin, samo onaj koji je prvi zapoceo citanje iz tabele ce moci procitati dok je drugi na cekanju.
Prvi kada zavrsi rezervaciju termina tabela se oslobadja za citanje i drugi klijent ce da procita da je termin zauzet. Opet, to se sve desava u milisekundama i manje.

Drugo resenje je transakcija.
Trece resenje na nivou baze CREATE TRIGGER BEFORE INSERT gde ces baza odraditi proveru pre inserta.

Iskreno da ti kazem da sam ove stvari radio vise radi ucenje, ali za 20 godina nisam koristio i nisam imao problema. Odradi se provera na nivou PHP-a i to je to.


[Ovu poruku je menjao VladaSu dana 14.06.2003. u 11:22 GMT+1]
 
Odgovor na temu

[es] :: PHP :: Skripta za zakazivanje termina u PHP

[ Pregleda: 1260 | Odgovora: 16 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.