Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [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. 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
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
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 blinksmiley.gif


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

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 557
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>";


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

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 party.gif . Zaszwankowała u mnie logika 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 557
Pomógł: 6315
Dołączył: 27.12.2004




no to niech $zajęty bedzie tablicą a poźniej sprawdzasz przy pomocy in_array()


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

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 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 557
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 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. }


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

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ść 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 557
Pomógł: 6315
Dołączył: 27.12.2004




to pokaz caly kod bo rzeczy o ktorych tu mowisz nie ma w tym kodzie


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

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 557
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 smile.gif
Tym razem zastanow sie bardziej jak to poprawic winksmiley.jpg


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

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 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 557
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.


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

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 557
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 winksmiley.jpg


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

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. 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 557
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?


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

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 sciana.gif sciana.gif sciana.gif sciana.gif 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
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 10:11