Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL]Godziny przyjęć
Forum PHP.pl > Forum > Przedszkole
piotr485
Stworzyłem tabele:
SKLEP id nazwa
CZYNNE id od do id_dzien id_sklep
DZIEN id dzien

w tabeli DZIEN mam id od 1 do 7 (poniedziałek, wtorek ...) w tabeli CZYNNE przypada 7 rekordów na każdy dzień tygodnia

mam problem z zapytaniem

  1. SELECT sklep.id, sklep.nazwa_firmy, czynne.od AS od, czynne.do AS do
  2. FROM sklep, czynne, dzien
  3. WHERE sklep.id = czynne.id_sklep



tylko tyle mi sie dalo napisac, nie wiem jak to zmontowac,

ktos wie jak uzyskac dostep do od_poniedzialek od_wtorek itd. itp.
ktos nakieruje pomoże ?
vokiel
Tabele:
SKLEP (ID, NAZWA)
CZYNNE (ID, DZIEN, ID_SKLEP, OD, DO)

Nie widzę potrzebu zapisywania jaki id dnia co oznacza. To raczej się nie zmienia. Zapisz w PHP tablicę dni, lub ustaw locale na PL.

  1. SELECT
  2. `SKLEP`.`ID`,
  3. `SKLEP`.`NAZWA`,
  4. `CZYNNE`.`OD` AS `OD`,
  5. `CZYNNE`.`DO` AS `DO`
  6. FROM `SKLEP` JOIN `CZYNNE` ON `CZYNNE`.`ID_SKLEP` = `SKLEP`.`ID`
  7. WHERE `SKLEP`.`DZIEN` BETWEEN 1 AND 3;
piotr485
Coś nie bardzo mi wychodzi zmieniłem trochę tabelę z zastosowaniem twojego kodu, taki maly katalog ale nie bardzo wiem jak odwołać się do tej tablicy po za tym wyrzuca mi błąd.

Not unique table/alias: 'czynne'


  1. SELECT katalog_firm.id, katalog_firm.nazwa_firmy, ulica.ulica AS ulica, miasta.miasto AS miasto, czynne.od AS od, czynne.do AS do
  2. FROM katalog_firm JOIN czynne ON czynne.id_katalog = katalog_firm.id, ulica, miasta, czynne
  3. WHERE katalog_firm.id_ulica = ulica.id AND katalog_firm.id_miasto = miasta.id AND katalog_firm.dzien BETWEEN 1 AND 3
  4. ORDER BY nazwa_firmy
vokiel
Join odnosi się tylko do jednej tabeli.

  1. SELECT
  2. `katalog_firm`.`id`,
  3. `katalog_firm`.`nazwa_firmy`,
  4. `ulica`.`ulica` AS `ulica`,
  5. `miasta`.`miasto` AS `miasto`,
  6. `czynne`.`od` AS `od`,
  7. `czynne`.`do` AS `do`
  8.  
  9. FROM `katalog_firm` JOIN `czynne` ON `katalog_firm`.`id` = `czynne`.`id_katalog`,
  10. JOIN `ulica` ON `katalog_firm`.`id_ulica` = `ulica`.`id`,
  11. JOIN `miasta` ON `katalog_firm`.`id_miasto` = `miasta`.`id`
  12.  
  13. WHERE `katalog_firm`.`dzien` BETWEEN 1 AND 3
  14. ORDER BY `katalog_firm`.`nazwa_firmy`


Jak to nie pomoże to daj dumpa bazy, nie chce mi się kombinować w pamięci sciana.gif
piotr485
Może napiszę dokładnie jak wygląda moja baza.

CZYNNE
id
od
do
id_dzien
id_katalog

DZIEN
id
dzien
(1 - poniedziałek, 2 - wtorek, 3 śr, 4- czw, 5 - piat, 6 - sob, 7 - niedz)

KATALOG_FIRM
id
nazwa_firmy

W sumie dopiero teraz patrzę, że nie ma żadnego połączenia między KATALOG_FIRM, a CZYNNE - jakie pole jeszcze by trzeba dodac do KATALOG_FIRM ?

Tabela czynne posiada takie wpisy:
id od do id_dzien id_katalog
1 08:00:00 17:00:00 1 1
2 10:00:00 16:00:00 2 1
3 09:00:00 18:00:00 3 1
4 08:00:00 18:00:00 4 1
5 16:00:00 18:00:00 5 1
6 12:00:00 18:00:00 6 1
7 12:00:00 20:00:00 7 1
8 08:00:00 20:00:00 1 2
9 15:00:00 18:00:00 2 2
10 08:00:00 15:00:00 3 2
11 00:00:00 00:00:00 4 2
12 00:00:00 00:00:00 5 2
13 00:00:00 00:00:00 6 2
14 00:00:00 00:00:00 7 2

Próbowałem stworzyć zapytanie przy pomocy twojej podpowiedzi, ale gdy się zorientowalem ze nie wiem jakie pole wprowadzić i jakie miały by mieć wartości w tabeli KATALOG_FIRM dlatego proszę o nakierowanie
vokiel
Pole łączące KATALOG_FIRM z CZYNNE umieść w tej drugiej (czy nie masz już tego w polu id_katalog).
piotr485
Cytat(vokiel @ 6.08.2009, 19:55:41 ) *
Pole łączące KATALOG_FIRM z CZYNNE umieść w tej drugiej (czy nie masz już tego w polu id_katalog).


Nie bardzo rozumiem o co ci chodzi. Hmm w sumie teraz tak patrzę to chyba nie potrzebuję już dodatkowego pola ? Sam już się pogubiłem. Potrzebuje dodatkowe pole w tabeli KATALOG_FIRM ?

Moje zapytanie wygląda na razie następująco:
  1. SELECT katalog_firm.id,
  2. katalog_firm.nazwa_firmy,
  3. katalog_firm.adres,
  4. ulica.ulica AS ulica,
  5. miasta.miasto AS miasto,
  6. podkategorie.podkategoria AS podkategoria
  7.  
  8. FROM katalog_firm JOIN podkategorie ON katalog_firm.id_podkategoria = podkategorie.id
  9. JOIN ulica ON katalog_firm.id_ulica = ulica.id
  10. JOIN miasta ON katalog_firm.id_miasto = miasta.id
  11.  
  12. ORDER BY nazwa_firmy


Tutaj mi wszystko działa, reszty tabel nie podawałem bo nie ma takiej potrzeby, próbowałem zrobić tak jak wcześniej radziłeś, ale niestety niewychodziło.

Jak to rozdzielić ? oczywiście chciałbym wyświetlać w ten sposób $od $do tylko nie wiem jak to zapisać, na pewno fajnie by było jak by były podane dane od poniedziałku do piątku takie same godziny, to aby się łączyło i tylko tak pokazywało, a jak różne to po kolei: poniedzialek, wtorek: no, ale myślę, że za daleko wybiegam skoro nie mogę tego rozgryźć, spróbuje ktoś pomóc nakierować ?
motylo
To będzie oddzielne:

  1. SELECT
  2. czynne.od AS od, czynne.do AS do, dzien.dzien AS dzien
  3. FROM czynne JOIN dzien ON (czynne.id_dzien=dzien.id)
  4. WHERE czynne.id_katalog="ID_FIRMY"


Natomiast do tego ostatniego wybierającego:

  1. SELECT katalog_firm.id [b]AS id[/b],
  2. katalog_firm.nazwa_firmy,
  3. katalog_firm.adres,
  4. ulica.ulica AS ulica,
  5. miasta.miasto AS miasto,
  6. podkategorie.podkategoria AS podkategoria,
  7. [b]czynne.od AS od, czynne.do AS do, dzien.dzien AS dzien [/b]
  8.  
  9. FROM katalog_firm JOIN podkategorie ON katalog_firm.id_podkategoria = podkategorie.id
  10. JOIN ulica ON katalog_firm.id_ulica = ulica.id
  11. JOIN miasta ON katalog_firm.id_miasto = miasta.id
  12. [b]JOIN czynne ON katalog_firm.id = czynne.id_katalog
  13. JOIN dzien ON czynne.dzien = dzien.id[/b]
  14.  
  15. ORDER BY nazwa_firmy


Jednakże za każdym razem będzie dodawać ci dane firmy do zapytania.

Lepszym rozwiązaniem będzie pobranie danych firm przez Twoje zapytanie, a następnie w PHP
  1. <?php
  2. $_katalog   =  $db->query("select...from...katalog_firm");
  3.  foreach($_katalog as $firma){
  4.  
  5.    //wypisz dane firmy
  6.    //wykonaj zapytanie z pobieraniem godzin otwarć przez przekazanie
  7.    //parametru $firma
  8.    $_czynne  = $db->query("select...from...czynne...czynne.id_katalog={$firma['id']}");
  9.    if(is_array($_czynne)){
  10.  
  11.      foreach($_czynne as $_dzien){
  12.         echo 'od: '.$_dzien['od'].' do: '.$_dzien['do'].' dzien: '.$_dzien['dzien'];
  13.      }
  14.  
  15.    }
  16.  
  17.  }
  18. ?>
Spawnm
Proszę używać BBcode.
piotr485
Tutaj połączyłeś obiektowość ze struktura o ile się nie mylę. A przy używaniu obiektowosci polaczenie musi wygladac innaczej czy mi sie wydaje ?
Moje polacznie wykonuje w ten sposob includujac plik:

  1. define('SQL_HOST', 'sql............');
  2. define('SQL_USER', '.......);
  3. define('SQL_PASS', '.....');
  4. define('SQL_DB', '........');
  5.  
  6. $db = mysql_connect(SQL_HOST,SQL_USER,SQL_PASS) or die ( 'Nie nawiazano polaczenia z serwerem'.mysql_error());
  7. mysql_select_db( SQL_DB, $db ) or die ( 'Nie nawiazano polaczenia z baza'.mysql_error());


A moj kod wyglada tak:

  1. require_once('../polaczenie.php');
  2.  
  3. $_katalog = $db->query("
  4.  
  5. SELECT katalog_firm.id AS id,
  6. katalog_firm.nazwa_firmy,
  7. katalog_firm.adres,
  8. ulica.ulica AS ulica,
  9. miasta.miasto AS miasto,
  10. podkategorie.podkategoria AS podkategoria,
  11. czynne.od as od, czynne.do as do, dzien.dzien as dzien
  12.  
  13. FROM katalog_firm JOIN podkategorie ON katalog_firm.id_podkategoria = podkategorie.id
  14. JOIN ulica ON katalog_firm.id_ulica = ulica.id
  15. JOIN miasta ON katalog_firm.id_miasto = miasta.id
  16. JOIN czynne ON katalog_firm.id = czynne.id_katalog
  17. JOIN dzien ON czynne.dzien = dzien.id
  18.  
  19. ORDER BY nazwa_firmy
  20.  
  21. ");
  22. foreach($_katalog as $firma){
  23.  
  24. //wypisz dane firmy
  25. //wykonaj zapytanie z pobieraniem godzin otwarć przez przekazanie
  26. //parametru $firma
  27. $_czynne = $db->query("
  28.  
  29. SELECT czynne.od AS od, czynne.do AS do, dzien.dzien AS dzien
  30. FROM czynne JOIN dzien ON (czynne.id_dzien=dzien.id)
  31. WHERE czynne.id_katalog=1
  32.  
  33. ");
  34. if(is_array($_czynne)){
  35.  
  36. foreach($_czynne as $_dzien){
  37. echo 'od: '.$_dzien['od'].' do: '.$_dzien['do'].' dzien: '.$_dzien['dzien'];
  38. }
  39.  
  40. }
  41.  
  42. }


Za daleko nie jadę bo już w 4 lini wyskakuje mi blad
  1. Fatal error: Call to a member function query() on a non-object in /home/czynne.php on line 4


O co chodzi ?
erix
Daj sobie var_dump na $db i zobacz, czy na pewno masz połączenie...
piotr485
Nie no połączenie jest na pewno.
Dałem i przed błędem pokazuje się dodatkowo:
  1. resource(2) of type (mysql link)


Co z tym fantem ?
nospor
$db powinno być obiektem a nie jakims "resource"
piotr485
Jest taki problem, że kolega podał gotowca w obiektowości, a ja póki co nie programuje obiektowo tylko strukturalnie i moje połączenie też takie jest.
Ogólnie wolę podpowiedzi niż gotowca - wiadoma sprawa bo tak to się niczego nie nauczę, a więc jak zamienic ten kod na strukture?

  1. $_katalog = $db->query("select...from...katalog_firm");
  2. foreach($_katalog as $firma){
  3.  
  4. //wypisz dane firmy
  5. //wykonaj zapytanie z pobieraniem godzin otwarć przez przekazanie
  6. //parametru $firma
  7. $_czynne = $db->query("select...from...czynne...czynne.id_katalog={$firma['id']}");
  8. if(is_array($_czynne)){
  9.  
  10. foreach($_czynne as $_dzien){
  11. echo 'od: '.$_dzien['od'].' do: '.$_dzien['do'].' dzien: '.$_dzien['dzien'];
  12. }
  13.  
  14. }
  15.  
  16. }

Fifi209
Kod, który podałeś jest strukturalny prawie w pełni (nie licząc mysqli)

Albo ja Cię nie rozumiem ^^ wytłumacz dokładniej.
piotr485
No prawie w pełni bo musiałbym mieć do niego połączenie obiektowe, a nie chcę zaczynać z obiektowoscią.

  1. $_katalog = $db->query("select...from...katalog_firm");


Jak to zamienic na strukture, aby reszta kodu sie zgadzala ?
nospor
http://pl2.php.net/manual/pl/function.mysql-query.php
oczywiscie najpierw musi byc mysql_connect(). wszystko masz w manualu opisane
piotr485
Nie no tak już robiłem wychodzi coś takiego:

  1. $zapytanie = "
  2. SELECT katalog_firm.id AS id,
  3. katalog_firm.nazwa_firmy AS firma,
  4. katalog_firm.adres,
  5. ulica.ulica AS ulica,
  6. miasta.miasto AS miasto,
  7. podkategorie.podkategoria AS podkategoria,
  8. czynne.od as od, czynne.do as do, dzien.dzien as dzien
  9.  
  10. FROM katalog_firm JOIN podkategorie ON katalog_firm.id_podkategoria = podkategorie.id
  11. JOIN ulica ON katalog_firm.id_ulica = ulica.id
  12. JOIN miasta ON katalog_firm.id_miasto = miasta.id
  13. JOIN czynne ON katalog_firm.id = czynne.id_katalog
  14. JOIN dzien ON czynne.id_dzien = dzien.id
  15.  
  16. ORDER BY nazwa_firmy
  17. ";
  18.  
  19. $_katalog = mysql_query($zapytanie) or die ('Błąd zapytania. <br />Źle napisane zapytanie! <br />Błąd: <font color="red">'.mysql_error().'</font>');
  20.  
  21.  
  22. foreach($_katalog as $firma){
  23.  
  24. //wypisz dane firmy
  25. //wykonaj zapytanie z pobieraniem godzin otwarć przez przekazanie
  26. //parametru $firma
  27.  
  28. $zapytanie2 = "
  29. SELECT czynne.od as od, czynne.do as do, dzien.dzien as dzien
  30. FROM czynne join dzien on (czynne.id_dzien=dzien.id)
  31. WHERE czynne.id_katalog=1
  32. ";
  33.  
  34. $_czynne = mysql_query($zapytanie2) or die ('Błąd zapytania drugiego. <br />Źle napisane zapytanie drugie! <br />Błąd: <font color="red">'.mysql_error().'</font>');
  35.  
  36.  
  37. if(is_array($_czynne)){
  38.  
  39.  
  40.  
  41. foreach($_czynne as $_dzien){
  42.  
  43. echo 'od: '.$_dzien['od'].' do: '.$_dzien['do'].' dzien: '.$_dzien['dzien'];
  44.  
  45. }
  46.  
  47. }
  48. }


i do tego bład:

Warning: Invalid argument supplied for foreach() in /home/zientek/ftp/czynne.php on line 35

Dlatego nie lubię gotowców bo później sam się gubię i nie wiem o co chodzi.

I dlaczego tu jest foreach przeciez nie mam nigdzie tablicy ? Przy obiektowosci sama sie tworzyla przez te inne polaczenie czy co ?
Void
Przecież mysql_query nie zwraca tablicy, użyj wcześniej mysql_fetch_array
piotr485
Jakieś kosmiczne rzeczy mi wychodzą. W ten sposób mam to zrobić ?

  1. $_katalog = mysql_fetch_array(mysql_query($zapytanie)) or die ('Błąd zapytania. <br />Źle napisane zapytanie! <br />Błąd: <font color="red">'.mysql_error().'</font>');


nospor
no przeciez w manualu masz to OPISANE na przykladach...
http://pl2.php.net/mysql_fetch_array
piotr485
No tak rzeczywiście - widzę, ze z programowaniem to tak jak z każdą inną dziedziną - nie ćwiczysz to zapominasz.

Napisałem coś takiego:

  1. while ($_dzien = mysql_fetch_array($_czynne)) {
  2. $od = $_dzien['od'];
  3. $do = $_dzien['do'];
  4. $dzien = $_dzien['dzien'];
  5.  
  6. echo $dzien.': '.$od.' - '.$do;
  7. echo '<br />';
  8.  
  9. }


Chcę napisać do tego funkcję mianowicie teraz mam taki wynik:

poniedziałek: 08:00:00 - 20:00:00
wtorek: 08:00:00 - 20:00:00
środa: 08:00:00 - 20:00:00
czwartek: 08:00:00 - 20:00:00
piątek: 08:00:00 - 20:00:00
sobota: 08:00:00 - 15:00:00
niedziela: 00:00:00 - 00:00:00

Tablica gdy ja sprawdzę wygląda tak:

  1. (
  2. [0] => 08:00:00
  3. [od] => 08:00:00
  4. [1] => 20:00:00
  5. [do] => 20:00:00
  6. [2] => poniedziałek
  7. [dzien] => poniedziałek
  8. )
  9. 1
  10.  
  11.  
  12.  
  13. (
  14. [0] => 08:00:00
  15. [od] => 08:00:00
  16. [1] => 20:00:00
  17. [do] => 20:00:00
  18. [2] => wtorek
  19. [dzien] => wtorek
  20. )
  21. 1
  22.  
  23.  
  24.  
  25. (
  26. [0] => 08:00:00
  27. [od] => 08:00:00
  28. [1] => 20:00:00
  29. [do] => 20:00:00
  30. [2] => środa
  31. [dzien] => środa
  32. )
  33. 1
  34.  
  35.  
  36.  
  37. (
  38. [0] => 08:00:00
  39. [od] => 08:00:00
  40. [1] => 20:00:00
  41. [do] => 20:00:00
  42. [2] => czwartek
  43. [dzien] => czwartek
  44. )
  45. 1
  46.  
  47.  
  48.  
  49. (
  50. [0] => 08:00:00
  51. [od] => 08:00:00
  52. [1] => 20:00:00
  53. [do] => 20:00:00
  54. [2] => piątek
  55. [dzien] => piątek
  56. )
  57. 1
  58.  
  59.  
  60.  
  61. (
  62. [0] => 08:00:00
  63. [od] => 08:00:00
  64. [1] => 15:00:00
  65. [do] => 15:00:00
  66. [2] => sobota
  67. [dzien] => sobota
  68. )
  69. 1
  70.  
  71.  
  72.  
  73. (
  74. [0] => 00:00:00
  75. [od] => 00:00:00
  76. [1] => 00:00:00
  77. [do] => 00:00:00
  78. [2] => niedziela
  79. [dzien] => niedziela
  80. )
  81. 1


Chciałbym odwołac się naprzykład do tablicy poniedzialek od i próbuję to zrobic tak:

  1. $_dzien[0]['od'];


Niestety otrzymuję tylko jedną cyfrę, dlaczego tak się dzieję?

Potrzebuję opisac sobie tak każda zmieną aby napisac funkcje ktora zlaczy mi dni - w tym przykladzie na poniedzialek - piatek 8.00 - 20.00 sobota 8.00 - 15.00 niedziela nieczynne


nospor
przeciez index 0 oraz "od" są na tym poziomie...
nie:$_dzien[0]['od'];
a:$_dzien[0];
lub: $_dzien['od'];
pod inedxami numerycznymi są duplikaty indexow tekstowych. Wszystko masz opisane w manualu...
piotr485
No wiem nospor jak wyświetlic to co napisalem, ale nie wiem jak sie odwolac do kazdego z osobna o ile to mozliwe, aby napisac taka funkcje ktora mi skraca dni jesli sa takie same godziny otwarcia
jak pn., wt. i sr. sa tak samo otwarte to otrzymuje pn - sr. np. 8.00 - 20.00

Dlatego chcialem sobie zrobic zmienne
$od_pn
$od_wt
$od_sr
$od_czw
$od_pt
$od_sob
$od_ndz

$do_pn
$do_wt
$do_sr
$do_czw
$do_pt
$do_sob
$do_ndz

i wtedy napisac warunki

  1. if ($od_pn == $od_wt) {
  2. //itd
  3. }
  4.  
  5. ale nie mam tych zmiennych i nie wiem jak to rozwiazac
nospor
Cytat
No wiem nospor jak wyświetlic to co napisalem,
Ty weź się zdecyduj... moj post byl odpowiedzią na ten tekst:
Cytat
$_dzien[0]['od'];


Niestety otrzymuję tylko jedną cyfrę, dlaczego tak się dzieję?

Z którego ewidentnie wynikalo ze nie wiesz jak sie dobrac do danych. Wiec ci wytlumaczylem to a ty do mnie z tekstem ze wiesz....
piotr485
Oj nie obrażaj się od razu smile.gif nie wiedziałem, że taki wrażliwy jesteś worriedsmiley.gif

Pomóż proszę.
nospor
sie nie obrazam. Drazni mnie tylko, ze jak sie pytasz, ja ci udzielam odpowiedzi, a ty mi mowisz ze to wiesz. To na grzyba sie pytasz i marnujesz moj/innych czas skoro to wiesz? tongue.gif
piotr485
wstydnis.gif no to jak bedzie - pomozecie ?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.