Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Liczba w przedziale liczbowym PHP + MySQL
startCode
post 30.04.2015, 10:32:46
Post #1





Grupa: Zarejestrowani
Postów: 19
Pomógł: 0
Dołączył: 2.03.2015

Ostrzeżenie: (0%)
-----


Witajcie, mam problem z którym walczę już drugi dzień.
Piszę skrypt w php z wykorzystaniem MySQLa, używam PDO.

W bazie danych mam następujący układ

ID | Nazwa | od | do | grupa
----------------------------------------
1 Adam 2 5 A
2 Marcin 7 9 B
3 Tomek 13 20 B

I teraz formularz w PHP wygląda następująco:

[imie]
[od]
[do]

I teraz warunkiem wpisu do bazy danych jest to że od i do nie może być w przedziale i w grupie.
Tzn. można przyjąć że te od i do jest godziną.
Czyli jeżeli ktoś zarezerwował miejsce w grupie B od godziny 7 do 9 to teraz kolejna osoba nie może zarezerwować tego miejsca w tych godzinach.
Kombinowałem z BETWEEN ale niestety nic z tego, nie mam pojęcia jak to ugryźć.

Jedna z próbek kodu:

  1. $stmt = $pdo->prepare("SELECT * FROM rezerwacja WHERE ohmy.gifd <= `od` OR >= `do`");
  2. $stmt->bindValue(":od", $od, PDO::PARAM_STR);
  3. $stmt->execute();
  4. $results = $stmt->fetch(PDO::FETCH_ASSOC);
  5.  
  6. if ($stmt->rowCount() !== 0)
  7. {
  8. echo 'Miejsce zajęte.';
  9. return;
  10. }


Nie liczę na gotowe rozwiązanie, ale fanie byłoby gdyby ktoś mnie nakierował na odpowiednią ścieżkę.
Go to the top of the page
+Quote Post
prz3kus
post 30.04.2015, 10:53:28
Post #2





Grupa: Zarejestrowani
Postów: 260
Pomógł: 30
Dołączył: 22.01.2007

Ostrzeżenie: (0%)
-----


$rezerwacja_od
$rezerwacj_do

SELECT * FROM rezerwacja WHERE (rezerwacja.od <= $rezerwacja_od && rezerwacja.do <= $rezerwacja_od) || (rezerwacja.od <= $rezerwacja_do && rezerwacja.do <= $rezerwacja_do)

jeżeli zwróci rekord znaczy że czas się gryzie, można użyć funkcji z bazy danych aby to skompresować jeszcze, napisane prosto dla zrozumienia

Pozdrawiam
Go to the top of the page
+Quote Post
Gelio
post 30.04.2015, 10:55:16
Post #3





Grupa: Zarejestrowani
Postów: 33
Pomógł: 2
Dołączył: 28.02.2009

Ostrzeżenie: (10%)
X----


Źle napisane zostało zapytanie, jak pewnie się domyśliłeś. Powinno być coś w stylu:
  1. SELECT * FROM rezerwacja WHERE od >= ohmy.gifd AND do <= biggrin.gifo;

Pozwoliłem sobie zmienić spójnik na "i", ponieważ oba warunki winny być spełnione, a także dodałem parametr związany z "do", ponieważ nie sprawdzałeś go. Nie zapomnij dodać kolejnego "bindValue" dla parametru do.
Go to the top of the page
+Quote Post
startCode
post 30.04.2015, 11:10:52
Post #4





Grupa: Zarejestrowani
Postów: 19
Pomógł: 0
Dołączył: 2.03.2015

Ostrzeżenie: (0%)
-----


Cytat(prz3kus @ 30.04.2015, 11:53:28 ) *
$rezerwacja_od
$rezerwacj_do

SELECT * FROM rezerwacja WHERE (rezerwacja.od <= $rezerwacja_od && rezerwacja.do <= $rezerwacja_od) || (rezerwacja.od <= $rezerwacja_do && rezerwacja.do <= $rezerwacja_do)

jeżeli zwróci rekord znaczy że czas się gryzie, można użyć funkcji z bazy danych aby to skompresować jeszcze, napisane prosto dla zrozumienia

Pozdrawiam



Przerobiłem to na swoje, niestety dalej wszystkie godziny się dodają, przedziały na siebie nachodzą.
Tak wygląda mój kod:
  1. $stmt = $pdo->prepare("SELECT * FROM rezerwacja WHERE (od <= $od && do <= $od) || (od <= $do && do <= $do");




Cytat(Gelio @ 30.04.2015, 11:55:16 ) *
Źle napisane zostało zapytanie, jak pewnie się domyśliłeś. Powinno być coś w stylu:
  1. SELECT * FROM rezerwacja WHERE od >= ohmy.gifd AND do <= biggrin.gifo;

Pozwoliłem sobie zmienić spójnik na "i", ponieważ oba warunki winny być spełnione, a także dodałem parametr związany z "do", ponieważ nie sprawdzałeś go. Nie zapomnij dodać kolejnego "bindValue" dla parametru do.


Też tak próbowałem, niestety nic z tego.


  1. $stmt = $pdo->prepare("SELECT * FROM rezerwacja WHERE od >= ohmy.gifd AND do <= biggrin.gifo;");
  2. $stmt->bindValue(":od", $od, PDO::PARAM_STR);
  3. $stmt->bindValue(":do", $do, PDO::PARAM_STR);
  4. $stmt->execute();
  5. $results = $stmt->fetch(PDO::FETCH_ASSOC);
  6.  
  7.  
  8. if ($stmt->rowCount() !== 0)
  9. {


Ten post edytował startCode 30.04.2015, 11:14:32
Go to the top of the page
+Quote Post
Pyton_000
post 30.04.2015, 11:14:47
Post #5





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


masz sprawdzić czy:

- od < b_od I do < b_od
LUB
- od > b_do I do > b_do
Go to the top of the page
+Quote Post
startCode
post 30.04.2015, 11:19:58
Post #6





Grupa: Zarejestrowani
Postów: 19
Pomógł: 0
Dołączył: 2.03.2015

Ostrzeżenie: (0%)
-----


Cytat(Pyton_000 @ 30.04.2015, 12:14:47 ) *
masz sprawdzić czy:

- od < b_od I do < b_od
LUB
- od > b_do I do > b_do


Fajnie, tylko że te warunki sprawiają że mogę dodać tylko jeden przedział.
TZn. np. od 10 - 20 , jeżeli chce zrobić od 21-23 to już niestety nie jest to możliwe.


Ale tutaj popchnąłeś mnie na kolejne myśli, będę kombinował dalej, może coś z tego wyjdzie. DZięki smile.gif
Go to the top of the page
+Quote Post
Pyton_000
post 30.04.2015, 11:28:48
Post #7





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Nie, te warunki sprawdzają czy którakolwiek godzina nie zawiera się już w istniejącym przedziale. (Przedziały nie nachodzą na siebie)

Więc jeśli dodasz <= i >= to mając przedział 10-12 możesz dodać np. 7-10 i 12-13

PS. b_od i b_do to wartości z BD

Ten post edytował Pyton_000 30.04.2015, 11:29:11
Go to the top of the page
+Quote Post
startCode
post 30.04.2015, 11:37:33
Post #8





Grupa: Zarejestrowani
Postów: 19
Pomógł: 0
Dołączył: 2.03.2015

Ostrzeżenie: (0%)
-----


Tak, tak, wiem, domyśliłem się.
Zamieniłem to na bindy z bazy danych, sprawdzałem kilka razy.
I teraz jeżeli w tabeli rezerwacja nie mam żadnych danych to moge zarezerwować, ale jak zarezerwuję powiedzmy od 10-15 to już nie moge dokonać żadnej rezerwacji, czy to 17-20 czy też 20-23 czy też 1-9.
Go to the top of the page
+Quote Post
Pyton_000
post 30.04.2015, 11:44:17
Post #9





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


pokaż zapytanie
Go to the top of the page
+Quote Post
startCode
post 30.04.2015, 11:46:49
Post #10





Grupa: Zarejestrowani
Postów: 19
Pomógł: 0
Dołączył: 2.03.2015

Ostrzeżenie: (0%)
-----


  1. $stmt = $pdo->prepare("SELECT * FROM rezerwacja WHERE (odtime < :odtime AND dotime < :odtime) OR (odtime > :dotime AND dotime > :dotime)");
  2. $stmt->bindValue(":odtime", $odtime, PDO::PARAM_STR);
  3. $stmt->bindValue(":dotime", $dotime, PDO::PARAM_STR);
Go to the top of the page
+Quote Post
prz3kus
post 30.04.2015, 12:06:16
Post #11





Grupa: Zarejestrowani
Postów: 260
Pomógł: 30
Dołączył: 22.01.2007

Ostrzeżenie: (0%)
-----


Cytat(startCode @ 30.04.2015, 12:46:49 ) *
  1. $stmt = $pdo->prepare("SELECT * FROM rezerwacja WHERE (odtime < :odtime AND dotime < :odtime) OR (odtime > :dotime AND dotime > :dotime)");
  2. $stmt->bindValue(":odtime", $odtime, PDO::PARAM_STR);
  3. $stmt->bindValue(":dotime", $dotime, PDO::PARAM_STR);


popraw na

  1. $stmt = $pdo->prepare("SELECT * FROM rezerwacja WHERE (odtime <= :odtime AND dotime >= :odtime) OR (odtime <= :dotime AND dotime >= :dotime)");
  2. $stmt->bindValue(":odtime", $odtime, PDO::PARAM_STR);
  3. $stmt->bindValue(":dotime", $dotime, PDO::PARAM_STR);


wczesniej pomyliłem znaczniki mniejszy większy
Go to the top of the page
+Quote Post
startCode
post 30.04.2015, 12:11:23
Post #12





Grupa: Zarejestrowani
Postów: 19
Pomógł: 0
Dołączył: 2.03.2015

Ostrzeżenie: (0%)
-----


Też nie działa, rezerwuje wszystko wszędzie biggrin.gif

Ale przed chwilą rozpisałem sobie cały wykres na kartce, przeanalizowałem, i wyszło że takie coś będzie działało:
  1. (odtime > :odtime AND odtime < :dotime) OR (dotime > :odtime AND dotime < :dotime)


i działa! smile.gif

Ale i tak bardzo dziękuję wszystkim za pomoc!



Po raz kolejny rzuciliście się na ratunek. smile.gif


Pozdrawiam

Ten post edytował startCode 30.04.2015, 12:19:12
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.04.2024 - 22:12