Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Funkcja if kilka warunków
Forum PHP.pl > Forum > Przedszkole
marcus753
witam zastanawiam się nad funkcją warunkową if a mianowicie

  1. <?php
  2. if($dlugosc1<6 || $dlugosc2>20 && $alert<>1){
  3. echo"TAK";}
  4. ?>


jeśli zmienna długość jest mniejsza od 6 lub równa 20 oraz jezeli zmienna alert jest inna niz 1 skrypt powinien sie wykonać ale wykonuje się również wtedy kiedy zmienna alert wynosi jeden a tego chciałbym uniknąć ;/ będę wdzięczny za pomoc jak sformułować takie zapytanie dry.gif
Pawel_W
  1. <?php
  2. if($dlugosc1<6 || $dlugosc2==20 && $alert!=1){
  3. echo"TAK";}
  4. ?>
scanner
  1. <?php
  2. if( ( ( $dlugosc1 < 6 ) || ( $dlugosc2 == 20 ) ) && ( $alert != 1 ) ){
  3.    echo"TAK";
  4. }
  5. ?>

Powinno działać. Grupowanie wyrażeń nawiasami bardzo pomaga - logika i matematyka się kłaniają.
brzanek
  1. if($dzien4maxwind < 30)
  2. {
  3. echo "<td>".$dzien4maxwind."km/h</td>";
  4. }
  5. if( ( $dzien4maxwind > 30 ) || ( $dzien4maxwind < 37 ) )
  6. //if($dzien4maxwind > 30 || $dzien4maxwind < 37)
  7. {
  8. echo "<td class='kolorwiatr'>".$dzien4maxwind."km/h</td>";
  9. }
  10. if( ( $dzien4maxwind > 37 ) || ( $dzien4maxwind < 50 ) )
  11. //if($dzien4maxwind > 37 || $dzien4maxwind < 50)
  12. {
  13. echo "<td class='kolorwiatr1'>".$dzien4maxwind."km/h</td>";
  14. }
  15. if($dzien4maxwind > 50)
  16. {
  17. echo "<td class='kolorwiatr2'>".$dzien4maxwind."km/h</td>";
  18. }


Dlaczego to nie działa? N stronie pojawiają mi się dwie wartości a powinna być tylko jedna.
kapslokk
  1. if( ( $dzien4maxwind > 30 ) || ( $dzien4maxwind < 37 ) )
  2. ...
  3. if( ( $dzien4maxwind > 37 ) || ( $dzien4maxwind < 50 ) )


Przyjmij, że $dzien4maxwind = 30


Jeśli $dzien4maxwind >30 lub $dzien4maxwind <37 - jest ok bo jest mniejszy od 37
Jeśli $dzien4maxwind > 37 lub $dzien4maxwind < 50 - też jest ok bo jest mniejszy od 50
Zamień OR na AND i bedzie działało jak chcesz
brzanek
Zamiana na and nie pomogła
  1. if($dzien4maxwind < 30)
  2. {
  3. echo "<td>".$dzien4maxwind."km/h</td>";
  4. }
  5. if( ( $dzien4maxwind > 30 ) and ( $dzien4maxwind < 37 ) )
  6. {
  7. echo "<td class='kolorwiatr'>".$dzien4maxwind."km/h</td>";
  8. }
  9. if( ( $dzien4maxwind > 37 ) and ( $dzien4maxwind < 50 ) )
  10. {
  11. echo "<td class='kolorwiatr1'>".$dzien4maxwind."km/h</td>";
  12. }
  13. if($dzien4maxwind > 50)
  14. {
  15. echo "<td class='kolorwiatr2'>".$dzien4maxwind."km/h</td>";
  16. }
Pyton_000
1. dla warunków poza pierwszym powinno być elseif
2. musisz użyć >= lub <= bo np. 37 nigdzie Ci nie wpadnie
brzanek
Nadal nie widać odpowiedniego efektu
  1. if($dzien4maxwind < 30)
  2. {
  3. echo "<td>".$dzien4maxwind."km/h</td>";
  4. }
  5. elseif( ( $dzien4maxwind >= 30 ) and ( $dzien4maxwind < 37 ) )
  6. {
  7. echo "<td class='kolorwiatr'>".$dzien4maxwind."km/h</td>";
  8. }
  9. elseif( ( $dzien4maxwind >= 37 ) and ( $dzien4maxwind < 50 ) )
  10. {
  11. echo "<td class='kolorwiatr1'>".$dzien4maxwind."km/h</td>";
  12. }
  13. elseif($dzien4maxwind > 50)
  14. {
  15. echo "<td class='kolorwiatr2'>".$dzien4maxwind."km/h</td>";
  16. }
Pyton_000
Jakiego? Jaka wartość jest podstawiana, co się wyśiwetla... Kurna na prawdę trzeba pytać o każdą pierdołę?

PS. Nie żade "and", "or" tylko && i ||
brzanek
Dzięki działa
uirapuru
ztcp && i || nie są równowazne z and i or - te drugie mają niższą "precendencję", czy tam priorytet, ale moge kłamac smile.gif
Pyton_000
Tak dokładnie && > and
uirapuru
nigdy nie korzystałem, ale strzelam, że można wtedy zrezygnować z nawiasów, co poprawia czytelność pewnie: "A or B || C and D" itd ale prawde mówiąc jako ktoś spoza tematu widzac coś takiego myślałbym: skoro jest 'and' to && musi oznaczać coś innego
brzanek
Mam jeszcze taki kod ale nie działa tak jak powinien
  1. $result = $mysqli->query("SELECT htemperature, AVG(hhumidity) AS suma_wilgotnosc, AVG(hcloudCover) AS suma_zachmurzenie, AVG(hprecipProbability) AS suma_opadow_procenty, SUM(hprecipIntensity) AS suma_opadow FROM prognoza_godzinowa WHERE htime BETWEEN '".$start1."' AND '".$koniec1."' AND hid_miasto=1");
  2. while ( $row = mysqli_fetch_array($result) ) {
  3. $htemmperature = ''.$row['htemperature'].'';
  4. $summa_wilgotnosc = ''.round($row['suma_wilgotnosc'],2).'';
  5. $summa_zachmurzenie = ''.round($row['suma_zachmurzenie'],1).'';
  6. if( ( $htemmperature > 1 ) || ( $summa_wilgotnosc < 5 ) || ( $summa_zachmurzenie < 90 ) ){
  7. echo '<img src="http://brzanek.webd.pl/ikony_svg/21_d.svg" alt="brak" width="50px">';
  8. }
  9. elseif ( ( $htemmperature < 1 ) || ( $summa_wilgotnosc < 5 ) || ( $summa_zachmurzenie < 90 ) ){
  10. echo 'nie';
  11. }
  12. }


Troszkę zmieniłem kod ale i tak nie działa
  1. $result = $mysqli->query("SELECT htemperature, AVG(hhumidity) AS suma_wilgotnosc, AVG(hcloudCover) AS suma_zachmurzenie, AVG(hprecipProbability) AS suma_opadow_procenty, SUM(hprecipIntensity) AS suma_opadow FROM prognoza_godzinowa WHERE htime BETWEEN '".$start1."' AND '".$koniec1."' AND hid_miasto=1");
  2. while ( $row = mysqli_fetch_array($result) ) {
  3. $htemmperature = ''.$row['htemperature'].'';
  4. $summa_wilgotnosc = ''.round($row['suma_wilgotnosc'],2).'';
  5. $summa_zachmurzenie = ''.round($row['suma_zachmurzenie'],1).'';
  6. if( ( $htemmperature > 2 ) || ( $htemmperature < 4 ) && ( $summa_wilgotnosc < 5 ) && ( $summa_zachmurzenie < 90 ) ){
  7. echo '<img src="http://brzanek.webd.pl/ikony_svg/21_d.svg" alt="brak" width="50px">';
  8. }
  9. else if ( ( $htemmperature > 0 ) || ( $htemmperature < 2 ) && ( $summa_wilgotnosc < 5 ) && ( $summa_zachmurzenie < 90 ) ){
  10. echo 'nie';
  11. }
  12. }

Dane jakie obecnie są to:
Temperatura 0.3
Wilgotność 0.74
Zachmurzenie 39.5

Przy tych ustawieniach powinna wyświetlić się druga opcja czyli sam napis nie a pojawia się ikona z pierwszego warunku - dlaczego?
phpion
Nawiasy. Warunki || grupuj razem tj. ((coś || coś) && (coś || coś)) a nie (coś || coś && coś || coś).
brzanek
Jak zmieniłem na to co proponujesz to nic się nie wyświetla
  1. $result = $mysqli->query("SELECT htemperature, AVG(hhumidity) AS suma_wilgotnosc, AVG(hcloudCover) AS suma_zachmurzenie, AVG(hprecipProbability) AS suma_opadow_procenty, SUM(hprecipIntensity) AS suma_opadow FROM prognoza_godzinowa WHERE htime BETWEEN '".$start1."' AND '".$koniec1."' AND hid_miasto=1");
  2. while ( $row = mysqli_fetch_array($result) ) {
  3. $htemmperature = ''.$row['htemperature'].'';
  4. $summa_wilgotnosc = ''.round($row['suma_wilgotnosc'],2).'';
  5. $summa_zachmurzenie = ''.round($row['suma_zachmurzenie'],1).'';
  6. if( ( $htemmperature > 2.0 ) || ( $htemmperature < 3.0 )) && ( $summa_wilgotnosc < 0.8 ) && ( $summa_zachmurzenie < 90 ) {
  7. echo '<td><img src="http://brzanek.webd.pl/ikony_svg/20_d.svg" alt="brak" width="50px"></td>';
  8. }
  9. else if ( ( $htemmperature > 0.0 ) || ( $htemmperature < 2.0 )) && ( $summa_wilgotnosc > 0.5 ) && ( $summa_zachmurzenie < 90 ){
  10. echo '<td>nie</td>';
  11. }
  12. }


Troszkę zmodyfikowałem kod
  1. $result = $mysqli->query("SELECT htemperature, AVG(hhumidity) AS suma_wilgotnosc, AVG(hcloudCover) AS suma_zachmurzenie, AVG(hprecipProbability) AS suma_opadow_procenty, SUM(hprecipIntensity) AS suma_opadow FROM prognoza_godzinowa WHERE htime BETWEEN '".$start1."' AND '".$koniec1."' AND hid_miasto=1");
  2. while ( $row = mysqli_fetch_array($result) ) {
  3. $htemmperature = ''.$row['htemperature'].'';
  4. $summa_wilgotnosc = ''.round($row['suma_wilgotnosc'],2).'';
  5. $summa_zachmurzenie = ''.round($row['suma_zachmurzenie'],1).'';
  6. if( ( $htemmperature > 2.0 ) || ( $htemmperature < 3.0 ) && ( $summa_wilgotnosc < 0.8 ) && ( $summa_zachmurzenie < 90 ) ){
  7. echo '<td><img src="http://brzanek.webd.pl/ikony_svg/20_d.svg" alt="brak" width="50px"></td>';
  8. }
  9. else if ( ( $htemmperature > 0.0 ) || ( $htemmperature < 2.0 ) && ( $summa_wilgotnosc > 0.5 ) && ( $summa_zachmurzenie < 90 ) ){
  10. echo '<td>nie</td>';
  11. }
  12. }

Powinna wyświetlić druga opcja czyli napis Nie a pojawia się obrazek z pierwszego warunku.
nospor
Jak nie rozumiesz prostej logiki w OR i AND to podstaw sobie przykladowe dane do twoich ifow i zastanow sie czy to ma jakikolwiek sens. Teraz prawidlowo wyswietla sie obrazek bo tak ustaliles to w IF - wszystko sie zgadza. 0.3 jest mniejsze od 3.0. A moze wg ciebie 0.3 jest wieksze od 3.0?
brzanek
Witam mam jeszcze jeden problem

  1. $dataa = date('Y-m-d');
  2.  
  3. $result = $mysqli->query("SELECT date FROM liczniki ORDER BY date DESC LIMIT 1");
  4. while ( $row = mysqli_fetch_array($result) ) {
  5. $dzisiaj = $row['date'];
  6. }
  7.  
  8. $result = $mysqli->query("SELECT * FROM liczniki WHERE date = '".$dataa."'");
  9. while ( $row = mysqli_fetch_array($result) ) {
  10. $miastoid = $row['miasto'];
  11. }
  12.  
  13. if (( $dzisiaj = date('Y-m-d') ) && ( $miastoid = $rodzaj_danych )){
  14. $result = $mysqli->query("UPDATE liczniki SET licznik=licznik+1 WHERE date = '".$dataa."' AND miasto = '".$rodzaj_danych."'");
  15. }
  16. else if (( $dzisiaj = date('Y-m-d') ) && ( $rodzaj_danych != $miastoid )) {
  17. $result = $mysqli->query("INSERT INTO liczniki (date, miasto, licznik) VALUES ('".$dataa."','".$rodzaj_danych."',1)");
  18. }
  19. else {
  20. $result = $mysqli->query("INSERT INTO liczniki (date, miasto, licznik) VALUES ('".$dataa."','".$rodzaj_danych."',1)");
  21. }


Jeśli nie ma dzisiejszej daty w bazie danych to pojawia się nowy rekord i tu jest tak jak powinno być.
Jeśli jest dzisiejsza data ale nie ma odpowiedniego miasta (miastoid) to już nie pojawia się nowy rekord w bazie danych a powinien.

Proszę o pomoc.
nospor
5 lat pozniej. No niezly czas. Mogles zalozyc nowy temat wink.gif

= - przypisanie
== - porownanie
brzanek
Ok zmieniłem
  1. $dataa = date('Y-m-d');
  2.  
  3. $result = $mysqli->query("SELECT date FROM liczniki ORDER BY date DESC LIMIT 1");
  4. while ( $row = mysqli_fetch_array($result) ) {
  5. $dzisiaj = $row['date'];
  6. }
  7.  
  8. $result = $mysqli->query("SELECT * FROM liczniki WHERE date = '".$dataa."'");
  9. while ( $row = mysqli_fetch_array($result) ) {
  10. $miastoid = $row['miasto'];
  11. }
  12.  
  13. if (( $dzisiaj = date('Y-m-d') ) && ( $miastoid = $rodzaj_danych )){
  14. $result = $mysqli->query("UPDATE liczniki SET licznik=licznik+1 WHERE date = '".$dataa."' AND miasto = '".$rodzaj_danych."'");
  15. }
  16. else if (( $dzisiaj = date('Y-m-d') ) && ( $rodzaj_danych != $miastoid )) {
  17. $result = $mysqli->query("INSERT INTO liczniki (date, miasto, licznik) VALUES ('".$dataa."','".$rodzaj_danych."',1)");
  18. }
  19. else {
  20. $result = $mysqli->query("INSERT INTO liczniki (date, miasto, licznik) VALUES ('".$dataa."','".$rodzaj_danych."',1)");
  21. }


Pojawiają się nowe rekordy ale za każdym razem. Chcę aby po wybraniu tego samego miasta w tym samym dniu nie tworzył sie nowy rekord tylko dopisywało się do licznika licznik=licznik+1. Jeśli w danym dniu nie było wybranego miasta to oczywiście powinien stworzyć sie kolejny nowy rekord w BD.
nospor
Ja nie widze zadnych zmian. Nadal wszedzie tam gdzie mialo by == to jest =
brzanek
ach racja
  1. $dataa = date('Y-m-d');
  2.  
  3. $result = $mysqli->query("SELECT date FROM liczniki ORDER BY date DESC LIMIT 1");
  4. while ( $row = mysqli_fetch_array($result) ) {
  5. $dzisiaj = $row['date'];
  6. }
  7.  
  8. $result = $mysqli->query("SELECT * FROM liczniki WHERE date = '".$dataa."'");
  9. while ( $row = mysqli_fetch_array($result) ) {
  10. $miastoid = $row['miasto'];
  11. }
  12.  
  13. if (( $dzisiaj == date('Y-m-d') ) && ( $miastoid == $rodzaj_danych )){
  14. $result = $mysqli->query("UPDATE liczniki SET licznik=licznik+1 WHERE date = '".$dataa."' AND miasto = '".$rodzaj_danych."'");
  15. }
  16. else if (( $dzisiaj == date('Y-m-d') ) && ( $rodzaj_danych !== $miastoid )) {
  17. $result = $mysqli->query("INSERT INTO liczniki (date, miasto, licznik) VALUES ('".$dataa."','".$rodzaj_danych."',1)");
  18. }
  19. else {
  20. $result = $mysqli->query("INSERT INTO liczniki (date, miasto, licznik) VALUES ('".$dataa."','".$rodzaj_danych."',1)");
  21. }
nospor
Skoro jak twierdzisz, nie wykonuje ci sie to
$result = $mysqli->query("UPDATE liczniki SET licznik=licznik+1 WHERE date = '".$dataa."' AND miasto = '".$rodzaj_danych."'");

to sprawdz co zawieraja zmienne z twojego warunku
if (( $dzisiaj == date('Y-m-d') ) && ( $miastoid == $rodzaj_danych )){

var_dump($dzisiaj);
var_dump($miastoid);
var_dump($rodzaj_danych);
No przeciez to jest logiczne ze tak trzeba zrobic...

swoja droga moglbys jakos normalnie nazywac zmiennej, odnosnie tego co zaweiraja a nie losowo. W obecnej nazewniczej sytuacji nie trudno o mase glupich innych bledow
brzanek
  1. if (( $dzisiaj == date('Y-m-d') ) && ( $miastoid == $rodzaj_danych )){
  2. $result = $mysqli->query("UPDATE liczniki SET licznik=licznik+1 WHERE date = '".$dataa."' AND miasto = '".$rodzaj_danych."'");
  3. }
  4. else if (( $dzisiaj == date('Y-m-d') ) && ( $rodzaj_danych !== $miastoid )) {
  5. $result = $mysqli->query("INSERT INTO liczniki (date, miasto, licznik) VALUES ('".$dataa."','".$rodzaj_danych."',1)");
  6. }
  7. else {
  8. $result = $mysqli->query("INSERT INTO liczniki (date, miasto, licznik) VALUES ('".$dataa."','".$rodzaj_danych."',1)");
  9. }


W tym całym kodzie poprawnie działa tylko przypadek kiedy w BD nie ma dzisiejszej daty - wtedy jest dopisywany nowy rekord. Jeśli jest już dzisiejsza data i przypisane do niej miasto Szczecin to po wywołaniu strony ze Szczecinem tworzy się nowy rekord w BD a powinien tylko dodać 1 do licznika przy tym wcześniejszym rekordzie.
nospor
Prosilem zebys sprawdzic zmienne z tego IFa. Zrobiles to?
brzanek
Zawierają
$dzisiaj - 2023-10-21
$miastoid - szczecin
$rodzaj_danych - szczecin
nospor
Ja cie proszse zebys podal mi dokladnie to co zwraca var_dump. Dokladnie
brzanek
string(10) "2023-10-21" string(9) "szczecin" string(9) "szczecin"
nospor
No to widac wyraznie ze wartosci wszystkie sie zgadzaja i ten warunek
if (( $dzisiaj == date('Y-m-d') ) && ( $miastoid == $rodzaj_danych )){
sie musi wykonac.

Moze wiec twoje zapytanie sie nie wykonuje

Zrob:

if (( $dzisiaj == date('Y-m-d') ) && ( $miastoid == $rodzaj_danych )){

echo 'WIDZISZ MNIE?questionmark.gifexclamation.gif!!';exit;
$result = $mysqli->query("UPDATE liczniki SET licznik=licznik+1 WHERE date = '".$dataa."' AND miasto = '".$rodzaj_danych."'");
}
trueblue
Cytat(brzanek @ 20.10.2023, 16:14:36 ) *
  1. if (( $dzisiaj = date('Y-m-d') ) && ( $miastoid = $rodzaj_danych )){
  2. $result = $mysqli->query("UPDATE liczniki SET licznik=licznik+1 WHERE date = '".$dataa."' AND miasto = '".$rodzaj_danych."'");
  3. }
  4. else if (( $dzisiaj = date('Y-m-d') ) && ( $rodzaj_danych != $miastoid )) {
  5. $result = $mysqli->query("INSERT INTO liczniki (date, miasto, licznik) VALUES ('".$dataa."','".$rodzaj_danych."',1)");
  6. }
  7. else {
  8. $result = $mysqli->query("INSERT INTO liczniki (date, miasto, licznik) VALUES ('".$dataa."','".$rodzaj_danych."',1)");
  9. }

Po co else if i else skoro i tak mają wykonać się takie same zapytania?

Inna sprawa, że zamiast tworzyć ify i kilka zapytań, wystarczy nadać na pole date i miasto klucz unique i stworzyć jedno zapytanie bez żadnych ifów:
  1. INSERT INTO liczniki (date, miasto, licznik) VALUES ('".$dataa."','".$rodzaj_danych."',1)
  2. ON DUPLICATE KEY UPDATE licznik=licznik+1;

Gdybyś użył powyższego, to nadając wartość domyślną 1 dla pola licznik, wystarczy wstawiać dane tylko do date i miasto.
brzanek
O co chodzi?
Mam listę miast po wybraniu odpowiedniego miasta jesli nikt wcześniej dzisiaj nie wybrał tego miasta to pojawia się nowy rekord w BD
id: 1
data: 2023-10-21
miasto: szczecin
licznik: 1
Jeśli ktoś wejdzie na stronę i wybierze inne miasto to do bazy trafia kolejny rekord:
id: 2
data: 2023-10-21
miasto: koszalin
licznik: 1
Teraz jeśli ktoś wejdzie na strone i wybierze ponownie szczecin to do bazy danych tam gdzie było id: 1 dodaje się tylko wartość do licznika.
Teraz mam tak, że jak ktoś ponownie wybierze szczecin to tworzy sie nowy rekord:
id: 3
data: 2023-10-21
miasto: szczecin
licznik: 2

Oczywiście przy zmianie daty ponownie pojawiają się nowe rekordy i tak dalej.

Dodałem to echo 'WIDZISZ MNIE?';exit; i pojawia się na stronie ale to chyba normalne?

Cytat(trueblue @ 21.10.2023, 10:40:59 ) *
Po co else if i else skoro i tak mają wykonać się takie same zapytania?

Inna sprawa, że zamiast tworzyć ify i kilka zapytań, wystarczy nadać na pole date i miasto klucz unique i stworzyć jedno zapytanie bez żadnych ifów:
  1. INSERT INTO liczniki (date, miasto, licznik) VALUES ('".$dataa."','".$rodzaj_danych."',1)
  2. ON DUPLICATE KEY UPDATE licznik=licznik+1;

Gdybyś użył powyższego, to nadając wartość domyślną 1 dla pola licznik, wystarczy wstawiać dane tylko do date i miasto.


Te wywołanie powoduje, że za każdym razem dodawany jest nowy rekord do BD
trueblue
Cytat(brzanek @ 21.10.2023, 10:56:41 ) *
Te wywołanie powoduje, że za każdym razem dodawany jest nowy rekord do BD

A założyłeś unikalny dwupolowy klucz na date i miasto?
brzanek
Niby założyłem unikalny klucz ale nie wiem czy dwupolowy

Ale nie działa to tak jak powinno

Dobra chyba sobie poradziłem - trueblue dzięki za pomoc
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-2024 Invision Power Services, Inc.