Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [PHP]Wykluczenie poszczególnych elementów z pętli
jacusek
post
Post #1





Grupa: Zarejestrowani
Postów: 262
Pomógł: 3
Dołączył: 18.10.2009
Skąd: Łódź

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


Witam.
Mam skrypt który generuje listę wyboru dat z godzinami - jest to rodzaj systemu rezerwacyjnego dla przychodni lekarskich.
Skrypt wygląda następująco:
  1. <?php
  2. include('connect2.php');
  3. $sql= "select concat(dni_tyg,godz_pocz) as poczatek, czas_BAD*60 as czas_BAD, concat(dni_tyg,godz_kon)
  4. as koniec from bad_lek where id_lek=3";
  5. $rez= mysqli_query($mysqli, $sql);
  6. while ($nowaTab=mysqli_fetch_array($rez,MYSQLI_ASSOC))
  7. {
  8. $pocz=$nowaTab['poczatek'];
  9. $czas=$nowaTab['czas_BAD'];
  10. $konc=$nowaTab['koniec'];
  11. $poczatek= date('Y-m-d G:i:s', strtotime($pocz));
  12. $koniec= date('Y-m-d G:i:s', strtotime($konc));
  13. }
  14. $sql2= "select timestamp(termin) as zajety from wizyta where id_lek=3";
  15. $rez2= mysqli_query($mysqli, $sql2);
  16. while ($nowaTab1=mysqli_fetch_array($rez2,MYSQLI_ASSOC))
  17. {
  18. $zaj=$nowaTab1['zajety'];
  19. $zajety= date('Y-m-d G:i:s', strtotime($zaj));
  20. }
  21. echo '<select name="termin">';
  22. echo '<option value=>--wybierz datę--</option>';
  23. $termin=$poczatek;
  24. while ($termin<=$koniec){
  25. echo '<option value="'.$termin.'">'.$termin.'</option>';
  26. echo $termin. "<br>";
  27. $termin=date("Y-m-d G:i:s", strtotime("+$czas second", strtotime($termin)));
  28. if ($termin==$zajety){continue;}
  29. }
  30. echo '</select>';
  31. ?>


Próbowałem już różnych rzeczy i chciałem żeby skrypt przy wykonywaniu pętli wykluczał wszystkie opcje które będą podawane przez zmienną $zajety. Są to dokładnie takie same ciągi.
Chciałem to zrobić pętlą for, ale z jakiegoś powodu nie działa mi na datach. Wpadłem na to while, ale nie bardzo wiem jak sprawę rozwiązać dalej. Prosiłbym o jakieś wskazówki ew. przykłady. Mnie się skończyłu pomysły. A że niestety jestem początkujący to za dużo ich nie mam.
Z góry dzięki za waszą pomoc

Wpadłem jeszcze na coś takiego:
  1. for ($termin=$poczatek;$termin<=$koniec;){
  2. echo '<option value="'.$termin.'">'.$termin.'</option>';
  3. echo $termin. "<br>";
  4. $termin=date("Y-m-d G:i", strtotime("+$czas second", strtotime($termin)));
  5. if($termin==$zajety){
  6. continue;
  7. }
  8. }
  9. echo '</select>';

ale to też mi pokazuje całą pętlę. bez wyłączenia $zajety. (IMG:style_emoticons/default/sciana.gif)
Pls pomocy bo już zupełnie nie wiem co zrobić a nie daje mi to spokoju.

Ten post edytował jacusek 8.12.2009, 23:47:22
Go to the top of the page
+Quote Post
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
ale to też mi pokazuje całą pętlę. bez wyłączenia $zajety.

A ja kiedyś najpierw zjadłem jabłko, a dopiero potem sprawdziłem, czy nie jest zatrute...no i się zatrułem....

Tak samo u ciebie: najpierw wyswietlasz a dopiero potem sprawdzasz czy to nalezalo wogole wyswietlic i jestes niesamowicie zdziwiony ze sie wyswietliło (IMG:style_emoticons/default/blinksmiley.gif)
Go to the top of the page
+Quote Post
jacusek
post
Post #3





Grupa: Zarejestrowani
Postów: 262
Pomógł: 3
Dołączył: 18.10.2009
Skąd: Łódź

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


No właśnie nie bardzo wiem jak to sprawdzić.
Dlaczego np nie działa taka opcja:
  1. $termin=$poczatek;
  2. while (($termin<=$koniec)&&($termin!=$zajety)){
  3. echo '<option value="'.$termin.'">'.$termin.'</option>';
  4. echo $termin. "<br>";
  5. $termin=date("Y-m-d G:i", strtotime("+$czas second", strtotime($termin)));
  6. if($termin>$zajety)
  7. continue;
  8. }

zatrzymuje mi się na zmiennej $zajety i dalej się nie wznawia.
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
No właśnie nie bardzo wiem jak to sprawdzić.
o rety. no napisałem ci w czym problem a ty jakbys wogole tego nie przeczytał...
przeciez ty sprawdzasz, sek w tym ze za późno...

  1. //najpierw wyswietlasz
  2. echo $termin. "<br>";
  3. //a dopiero potem sprawdzasz
  4. $termin=date("Y-m-d G:i", strtotime("+$czas second", strtotime($termin)));
  5. if($termin==$zajety)
  6. continue;

No przeciez z logicznego punktu widzenia, ktory nie ma nic do programowania, najpierw musisz sprawdzic, a dopiero potem jakby co wyswietlic
  1. //najpierw sprawdzic
  2. $termin=date("Y-m-d G:i", strtotime("+$czas second", strtotime($termin)));
  3. if($termin==$zajety)
  4. continue;
  5. //potem wyswietlic
  6. echo $termin. "<br>";
Go to the top of the page
+Quote Post
jacusek
post
Post #5





Grupa: Zarejestrowani
Postów: 262
Pomógł: 3
Dołączył: 18.10.2009
Skąd: Łódź

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


Dzięki nospor (IMG:style_emoticons/default/party.gif) . Zaszwankowała u mnie logika (IMG:style_emoticons/default/sad.gif) . Jeszcze cały czas dużo nauki przede mną.
Działa to ale nie do końca. Co teraz zrobić, jeżeli terminów jest więcej niż 1 zajęty żeby je wszystkie wyłączał?
To niestety nie funkcjonuje. Wyłącza tylko ten najwyższy.
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




no to niech $zajęty bedzie tablicą a poźniej sprawdzasz przy pomocy in_array()
Go to the top of the page
+Quote Post
zulik
post
Post #7





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 9.12.2009

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


OT

  1. include('connect2.php');


ja osobiście robię
  1. require('connect2.php');
Go to the top of the page
+Quote Post
jacusek
post
Post #8





Grupa: Zarejestrowani
Postów: 262
Pomógł: 3
Dołączył: 18.10.2009
Skąd: Łódź

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


Ok.
Zrobiłem coś takiego
  1. $sql2= "select timestamp(termin) as zajety from wizyta where id_lek=3";
  2. $rez2= mysqli_query($mysqli, $sql2);
  3. while ($nowaTab1=mysqli_fetch_array($rez2,MYSQLI_ASSOC))
  4. {
  5. $zaj=$nowaTab1['zajety'];
  6. $zajety= date('Y-m-d G:i', strtotime($zaj));
  7. array($zajety);
  8. }
  9. echo '<select name="termin">';
  10. echo '<option value=>--wybierz datę--</option>';
  11. $termin=$poczatek;
  12. while ($termin<=$koniec){
  13. $termin=date("Y-m-d G:i", strtotime("+$czas second", strtotime($termin)));
  14. if ($termin==in_array($zajety))
  15. {
  16. continue;
  17. }
  18. echo '<option value="'.$termin.'">'.$termin.'</option>';
  19. echo $termin. "<br>";

I niestety nadal to nie działa. Dodatkowo nie pokazuje pierwszego wiersza z pętli tylko od razu przechodzi do drugiego (IMG:style_emoticons/default/sad.gif) .
Nie wiem czy o to chodziło.
Go to the top of the page
+Quote Post
nospor
post
Post #9





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




kurcze.... ale weź zajrzyj do manuala jak należy uzywac in_array() a nie strzelasz jakieś kody z kosmosu... przedzież w manualu masz to opisane, nawet masz podane przykłady.

Jak tak dalej bedziesz podchodził do sprawy to temat zamkne to może wówczas odrobinę się zmotywujesz (IMG:style_emoticons/default/smile.gif)

kolejna sprawa:
nie:
  1. while ($nowaTab1=mysqli_fetch_array($rez2,MYSQLI_ASSOC))
  2. {
  3. $zaj=$nowaTab1['zajety'];
  4. $zajety= date('Y-m-d G:i', strtotime($zaj));
  5. array($zajety);
  6. }

a:
  1. $zajety = array();
  2. while ($nowaTab1=mysqli_fetch_array($rez2,MYSQLI_ASSOC))
  3. {
  4. $zaj=$nowaTab1['zajety'];
  5. $zajety[]= date('Y-m-d G:i', strtotime($zaj));
  6.  
  7. }
Go to the top of the page
+Quote Post
jacusek
post
Post #10





Grupa: Zarejestrowani
Postów: 262
Pomógł: 3
Dołączył: 18.10.2009
Skąd: Łódź

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


Wielkie dzięki i gratulacje za cierpliwość (IMG:style_emoticons/default/wstydnis.gif) .
Tylko mam ostatnie pytanko na które nie ma pomysłu jak rozwiązać.
Mianowicie w liście rozwijanej przestała się pokazywać pierwsza data z pytania $sql za to pokazuje się jedna za dużo powyżej $koniec. Jako pierwsza pokazuje się już powiększona o wartość $czas. Co z tym można zrobić?
ta pierwsza wartość też musi być przecież $termin co wynika z konieczności użycia jej jako zmiennej później.
Go to the top of the page
+Quote Post
nospor
post
Post #11





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




to pokaz caly kod bo rzeczy o ktorych tu mowisz nie ma w tym kodzie
Go to the top of the page
+Quote Post
jacusek
post
Post #12





Grupa: Zarejestrowani
Postów: 262
Pomógł: 3
Dołączył: 18.10.2009
Skąd: Łódź

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


oto cały kod. Był powyżej ale rzeczywiście w kawałkach:
  1. <?php
  2. include('connect2.php');
  3. $sql= "select concat(dni_tyg,godz_pocz) as poczatek, czas_BAD*60 as czas_BAD, concat(dni_tyg,godz_kon)
  4. as koniec from bad_lek where id_lek=3";
  5. $rez= mysqli_query($mysqli, $sql);
  6. while ($nowaTab=mysqli_fetch_array($rez,MYSQLI_ASSOC))
  7. {
  8. $pocz=$nowaTab['poczatek'];
  9. $czas=$nowaTab['czas_BAD'];
  10. $konc=$nowaTab['koniec'];
  11. $poczatek= date('Y-m-d G:i', strtotime($pocz));
  12. $koniec= date('Y-m-d G:i', strtotime($konc));
  13. }
  14. $sql2= "select timestamp(termin) as zajety from wizyta where id_lek=3";
  15. $rez2= mysqli_query($mysqli, $sql2);
  16. $zajety = array();
  17. while ($nowaTab1=mysqli_fetch_array($rez2,MYSQLI_ASSOC))
  18. {
  19. $zaj=$nowaTab1['zajety'];
  20. $zajety[]= date('Y-m-d G:i', strtotime($zaj));
  21. }
  22. echo '<select name="termin">';
  23. echo '<option value=>--wybierz datę--</option>';
  24. $termin=$poczatek;
  25. while ($termin<=$koniec){
  26. $termin=date("Y-m-d G:i", strtotime("+$czas second", strtotime($termin)));
  27. if(in_array($termin,$zajety))
  28. {
  29. continue;
  30. }
  31. echo '<option value="'.$termin.'">'.$termin.'</option>';
  32. //echo $termin. "<br>";
  33. }
  34. echo '</select>';
  35. ?>

generalnie wiersze w tabeli rozwijanej wyglądają następująco
2009-12-14 15:00
Go to the top of the page
+Quote Post
nospor
post
Post #13





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




nie pojawia ci sie pierwsza data, bo na dzien dobry w petli zwiekszasz $termin o $czas
pojawia ci sie o jeden termin za duzo, bo dla koncowego warunku ty zwiekszasz znowu $termin o $czas

Stąd te przesunięcia (IMG:style_emoticons/default/smile.gif)
Tym razem zastanow sie bardziej jak to poprawic (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
jacusek
post
Post #14





Grupa: Zarejestrowani
Postów: 262
Pomógł: 3
Dołączył: 18.10.2009
Skąd: Łódź

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


Szczerze mówiąc nie wiem jak to zrobić. Udało mi się nawet wstawić do wyświtlania pierwszą wartość poprzez Próbowałem użyć break ale nie wiedzieć czemu pokazuje mi przed ostatnią wartość z tablicy. Dodatkowo nie spełnia się dla pierwszej wartości warunek if(in_array).
Nie wiem może źle szukam. Ale siedzę nad tym od wczoraj (IMG:style_emoticons/default/sciana.gif)
  1. echo '<select name="termin">';
  2. echo '<option value=>--wybierz datę--</option>';
  3. $termin=$poczatek;
  4. echo '<option value=>'.$termin.'</option>';
  5. while ($termin<=$koniec){
  6. $termin=date("Y-m-d G:i", strtotime("+$czas second", strtotime($termin)));
  7. if(in_array($termin,$zajety))
  8. {
  9. continue;
  10. }
  11. if ($termin===$koniec){
  12. break;
  13. }
  14. echo '<option value="'.$termin.'">'.$termin.'</option>';
  15. //echo $termin. "<br>";
  16. }
  17. echo '</select>';
  18. ?>
Go to the top of the page
+Quote Post
nospor
post
Post #15





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




Mowiac, ze na dzien dobry w petli zwiekszasz termin, mialem na mysli wlasnie to i nic innego. Nie wiem skad ci nagle do glowy wpadl ten break.
Skoro ci mowie, ze zwiekszasz cos na samym poczatku petli a nie powinienes, to znaczy tyle, ze zamiast zwiekszac na poczatku masz to zwiekszac na koncu petli. Nie doszukuj się zadnych ukrytych przekazów bo takowych tu nie ma.
Go to the top of the page
+Quote Post
jacusek
post
Post #16





Grupa: Zarejestrowani
Postów: 262
Pomógł: 3
Dołączył: 18.10.2009
Skąd: Łódź

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


Dobra powiem jak ja rozumuję i popraw mnie gdzie popełniam błąd.
deklaruję że pętla ma się kończyć jak osiągnie koniec.
  1. while ($termin<=$koniec){

zaczyna się od $poczatek
  1. $termin=$poczatek;

no właśnie i tutaj następuje sprawdzanie
  1. if(in_array($termin,$zajety))
  2. {
  3. continue;
  4. }

No ale jak ma coś sprawdzać skoro pętla nie ma z czego wykonywać jeżeli to
  1. $termin=date("Y-m-d G:i", strtotime("+$czas second", strtotime($termin))); "<br>";
  2. echo '<option value=>'.$termin.'</option>';

będzie pod koniec.
Z tego co rozumiem, to tak to powinno wyglądać, ale nie działa i nie wiem w czym rzecz.
Ja rozumiem to co mi piszesz, że od razu zwiększam o wartość $czas. Ale po pierwsze dlaczego nie kończy się na $koniec mimo że ma taki warunek w while i jak mogę zadeklarować początek tabeli, tak żeby warunek in_array też się dla niego spełniał.
Go to the top of the page
+Quote Post
nospor
post
Post #17





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
No ale jak ma coś sprawdzać skoro pętla nie ma z czego wykonywać jeżeli to
[PHP] pobierz, plaintext
$termin=date("Y-m-d G:i", strtotime("+$czas second", strtotime($termin))); "<br>";
echo '<option value=>'.$termin.'</option>';

będzie pod koniec.
No i dlatego to daj pod koniec (tylko zwiekszanie $termin. reszte kodu zostaw), a ten termin sobie formatuj na początku bez zwiekszania go:
$termin=date("Y-m-d G:i", strtotime($termin));
kapisz? Calego kodu ci nie podam bo czas troche wysilic szare komorki (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
jacusek
post
Post #18





Grupa: Zarejestrowani
Postów: 262
Pomógł: 3
Dołączył: 18.10.2009
Skąd: Łódź

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


Poprawiłem kod tak jak mówiłeś i nadal nie działa. (IMG:style_emoticons/default/sciana.gif) . Tak to teraz wygląda:
  1. $termin=$poczatek;
  2. echo '<select name="termin">';
  3. echo '<option value=>--wybierz datę--</option>';
  4. echo '<option value=>'.$termin.'</option>';
  5. while ($termin<=$koniec){
  6. $termin=date("Y-m-d G:i", strtotime($termin));
  7. $termin=date("Y-m-d G:i", strtotime("+$czas second", strtotime($termin)));
  8. if(in_array($termin,$zajety))
  9. {
  10. continue;
  11. }
  12. echo '<option value=>'.$termin.'</option>';
  13. }
  14. echo '</select>';
  15. ?>

Ale po pierwsze przy rezerwacji pierwszego terminu nie traktuje go jako $zajete - czyli mimo rezerwacji nadal się wyświetla - i druga sprawa nadal zwiększa się $koniec o wartość $czas.
Go to the top of the page
+Quote Post
nospor
post
Post #19





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




przeciez to:
$termin=date("Y-m-d G:i", strtotime("+$czas second", strtotime($termin)));
miales dac na koniec petli... Wiesz co to jest koniec petli?
Go to the top of the page
+Quote Post
jacusek
post
Post #20





Grupa: Zarejestrowani
Postów: 262
Pomógł: 3
Dołączył: 18.10.2009
Skąd: Łódź

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


w taki przypaku w ogóle mi się nie wykonuje. Już na prawdę kompletnie nie rozumiem na czym to polego (IMG:style_emoticons/default/sciana.gif) (IMG:style_emoticons/default/sciana.gif) (IMG:style_emoticons/default/sciana.gif) (IMG:style_emoticons/default/sciana.gif) (IMG:style_emoticons/default/sciana.gif)
  1. $termin=$poczatek;
  2. echo '<select name="termin">';
  3. echo '<option value=>--wybierz datę--</option>';
  4. echo '<option value=>'.$termin.'</option>';
  5. while ($termin<=$koniec){
  6. $termin=date("Y-m-d G:i", strtotime($termin));
  7. if(in_array($termin,$zajety))
  8. {
  9. continue;
  10. }
  11. $termin=date("Y-m-d G:i", strtotime("+$czas second", strtotime($termin)));
  12. echo '<option value=>'.$termin.'</option>';
  13. }
  14. echo '</select>';
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.12.2025 - 19:51