Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Warunkowe dodawanie zmiennych
Forum PHP.pl > Forum > Przedszkole
Therminus
Mam taką tabelkę ze zmiennymi:
  1. echo '<tr >
  2. <td align="center">'.$wiersz2['Status_A'].'</td>
  3. <td align="right">'.$wiersz2['Pow_Uzyt_A'].'</td>
  4. <td align="center">'.$wiersz2['Status_B'].'</td>
  5. <td align="right">'.$wiersz2['Pow_Uzyt_B'].'</td>
  6. <td align="center">'.$wiersz2['Status_C'].'</td>
  7. <td align="right">'.$wiersz2['Pow_Uzyt_C'].'</td>
  8. ...
  9. <td align="right">'.($wiersz2['Pow_Uzyt_A'])+
  10. ($wiersz2['Pow_Uzyt_B'])+
  11. ($wiersz2['Pow_Uzyt_C'])+
  12. ...
  13.  
  14. .'</td>
  15. </tr>';

W sumie 8 pozycji (do litery "H")
Problem w tym, że na końcu muszę dodać te zmienne (wiersz 9 i dalsze w przedstawionym kodzie) pod warunkiem, że...
i tutaj zaczynają się schody.
Zmienna $wiersz2['Pow_Uzyt_A'] ma być brana pod uwagę w dodawaniu tylko wtedy, kiedy zmienna $wiersz2['Status_A'] = 'A' .
I analogicznie wartość ze zmiennej $wiersz2['Pow_Uzyt_B'] będzie dodawana, jeżeli zmienna $wiersz2['Status_B'] = 'B' i tak dalej.
W bazie pole w kolumnach "Status_[A...H]" po prostu zawiera tylko jedną literę (A...H) lub jest puste.
Jak to zrobić?
trueblue
Użyj funkcji if.
Salvation
  1. <?php
  2.  
  3. declare(strict_types=1);
  4.  
  5. function summary(array $row): int
  6. {
  7. $sum = 0;
  8.  
  9. foreach(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'] as $char) {
  10. $char = mb_strtoupper($char);
  11. $status = (string)($row['Status_' . $char] ?? '');
  12. $userPower = (int)($row['Pow_Uzyt_' . $char] ?? 0);
  13.  
  14. if ($status === $char) {
  15. $sum += $userPower;
  16. }
  17. }
  18.  
  19. return $sum;
  20. }

Wykorzystanie (w Twoim przypadku):
  1. <td align="right">' . summary($wiersz2) . '</td>


PS. Czy ktoś może wyłączyć parsowanie na emoty w blokach kodu?
nospor
Cytat
PS. Czy ktoś może wyłączyć parsowanie na emoty w blokach kodu?

Niestety nie.
Ale mozesz zrobic to sam przed wyslaniem postu, WYLACZ EMOTKI czy jakos tak checkbox. To wylaczy dla calego postu
Salvation
Cytat(nospor @ 24.08.2022, 16:58:50 ) *
Niestety nie.
Ale mozesz zrobic to sam przed wyslaniem postu, WYLACZ EMOTKI czy jakos tak checkbox. To wylaczy dla calego postu

Dzięki! Zapamiętam smile.gif
nospor
ps: oj ta funkcja co naskrobales to chyba cos ci nie wyszla wink.gif I to tak dosc mocno wink.gif
Salvation
Niby dlaczego? Wszystko dobrze jest wg mnie: https://3v4l.org/4MkRf
nospor
A widzisz, nie doczytalem o co chodzilo autorowi. Zwracam honor smile.gif
Therminus
[quote name='Salvation' date='24.08.2022, 16:52:52 ' post='1259713']
Coś mi się ta funkcja nie odpala z moim kodem.

  1. declare(strict_types=1);
  2.  
  3. function summary(mysqli_fetch_array $row): int
  4. {
  5. $sum = 0;
  6.  
  7. foreach(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'] as $char) {
  8. $char = mb_strtoupper($char);
  9. $status = (string)($row['Status_'.$char] questionmark.gif '');
  10. $userPower = (int)($row['Pow_Uzyt_'.$char] questionmark.gif 0);
  11.  
  12. if ($status === $char) {
  13. $sum += $userPower;
  14. }
  15. }
  16.  
  17. return $sum;
  18. }
  19.  
  20. $zapytanie2 = "SELECT * FROM `budynki` WHERE `Ulica` = '$wybor' and `Kategoria` LIKE 'LU%' and `Podzielone` = 'P'";
  21. $wykonaj2 = mysqli_query($sql, $zapytanie2);
  22. while($wiersz2=mysqli_fetch_array ($wykonaj2)) {
  23.  
  24. echo '<tr >
  25. <td align="center">'.$wiersz2['Status_A'].'</td>
  26. <td align="right">'.$wiersz2['Pow_Uzyt_A'].'</td>
  27. <td align="center">'.$wiersz2['Status_B'].'</td>
  28. <td align="right">'.$wiersz2['Pow_Uzyt_B'].'</td>
  29. <td align="center">'.$wiersz2['Status_C'].'</td>
  30. <td align="right">'.$wiersz2['Pow_Uzyt_C'].'</td>
  31. ...
  32. <td align="right">' . summary($wiersz2) . '</td>
  33.  
  34. </tr>';
  35. }


Nie jestem pewien wiersza nr 3. Być może tutaj jest błąd.
nospor
Czemu zrobiles
mysqli_fetch_array $row
?
Przeciez wyraznie miales napisane
array $row

Row to tablica

ps: I patrze nadal masz wywalone na to ze twoj skrypt jest podatny na sql injection. Zamiast to poprawic jak ci to juz dawno mowiono to ty wiesz "lepiej "
Salvation
Cytat(Therminus @ 25.08.2022, 14:04:34 ) *
Nie jestem pewien wiersza nr 3. Być może tutaj jest błąd.

Nie być może, a tak. Niepotrzebnie zmieniałeś deklarację funkcji. Miałeś zrobić jedynie copy-paste do siebie do kodu.

I popraw ten SQL Injection, bo Puchatek zaraz krwotoku dostanie haha.gif
Therminus
Cytat(nospor @ 25.08.2022, 14:56:59 ) *
ps: I patrze nadal masz wywalone na to ze twoj skrypt jest podatny na sql injection.

Mam wywalone, bo mnie w LAN nikt atakował nie będzie. oneeyedsmiley02.png

Cytat(Salvation @ 25.08.2022, 18:17:16 ) *
Niepotrzebnie zmieniałeś deklarację funkcji.

Na początku rzeczywiście przekopiowałem tak jak było, ale nie działało. Potem kombinowałem i zmieniłem na próbę, a przed wysłaniem posta zapomniałem zmienić z powrotem.
Mam w przeglądarce biały ekran. Jak zakomentuję tę funkcję, to stronka się wyświetla (oczywiście z błędem o próbie użycia nie zadeklarowanej funkcji).
Wersja PHP: 7.4.29
Cytat(Salvation)
I popraw ten SQL Injection, bo Puchatek zaraz krwotoku dostanie haha.gif

haha.gif
nospor
Cytat
Mam wywalone, bo mnie w LAN nikt atakował nie będzie

Tyko kiedys zaczniesz pisac poza LAN i nagle ZONK bo zle nawyki zostaly. Jaki problem tam uzyc binodwania? Toz to 10 sekund roboty :/

Cytat
Na początku rzeczywiście przekopiowałem tak jak było, ale nie działało. Potem kombinowałem i zmieniłem na próbę, a przed wysłaniem posta zapomniałem zmienić z powrotem.
Mam w przeglądarce biały ekran. Jak zakomentuję tę funkcję, to stronka się wyświetla (oczywiście z błędem o próbie użycia nie zadeklarowanej funkcji).

Pewnie uzywasz starego php. Salvation niestety lubi zakladac ze ludzie jada na najnowszym. Od mysli ze ktos uzywa starego to jemu krwotok grozi tongue.gif
Therminus
Cytat(nospor @ 26.08.2022, 13:30:16 ) *
Jaki problem tam uzyc binodwania? Toz to 10 sekund roboty :/

Jak się już wie co to jest bindowanie w tym przypadku. A ogarnięcie tematu, to dla mnie pewnie kilkanaście godzin. tongue.gif
Cytat(nospor)
Pewnie uzywasz starego php. Salvation niestety lubi zakladac ze ludzie jada na najnowszym. Od mysli ze ktos uzywa starego to jemu krwotok grozi tongue.gif

Tak pomyślałem, dlatego edytowałem poprzedniego posta
PHP 7.4.29 (cli) (built: Apr 14 2022 14:45:47) ( ZTS )
Nie taki bardzo stary, zatem...

EDIT:
Sprawdziłem na tej stronce gdzie Salvation umieścił kod i wybrałem moją wersję PHP i... tam działa. smile.gif
A u mnie nie chce.
nospor
Skoro masz biala strone to sprawdz logi, jakis blad masz

Cytat
Jak się już wie co to jest bindowanie w tym przypadku. A ogarnięcie tematu, to dla mnie pewnie kilkanaście godzin

https://www.php.net/manual/en/mysqli-stmt.bind-param.php
Therminus
Cytat(nospor @ 26.08.2022, 14:27:01 ) *
Skoro masz biala strone to sprawdz logi, jakis blad masz


Wiemy coś więcej.
PHP Fatal error: strict_types declaration must be the very first statement in the script in /var/www/(...)/lok_uzytkowe.php on line 147,
U mnie ta linia to:
  1. declare(strict_types=1);


Dzięki za linka.
nospor
Cytat
PHP Fatal error: strict_types declaration must be the very first statement in the script in /var/www/(...)/lok_uzytkowe.php on line 147,

Komunikat dosc jasny...

Daj
declare(strict_types=1);
Na poczatku pliku jako pierwsza linia albo wywal to w ogole
Therminus
Cytat(nospor @ 26.08.2022, 14:57:17 ) *
Daj
declare(strict_types=1);
Na poczatku pliku jako pierwsza linia albo wywal to w ogole


Wywaliłem to, ale przy dodawaniu nie bierze pod uwagę części dziesiętnych liczb.

Na początku pliku, to znaczy zaraz za <?php
?
Tak miałem od początku.

nospor
No bo w kodzie masz

$userPower = (int)($row['Pow_Uzyt_'.$char] questionmark.gif 0);

zamien na
$userPower = (float)($row['Pow_Uzyt_'.$char] questionmark.gif 0);


Dostales pare linije kkodu, no naprawde mogles sie zastanowic co robi kazda z nich. Branie z forum tez polega na nauce tego co sie dostaje

Cytat
Na początku pliku, to znaczy zaraz za <?php
?
Tak miałem od początku.

Komunikat bledu mowil jednak co innego, mowil tez ze bylo to w linii 147 a nie na poczatku pliku
Salvation
Cytat(nospor @ 26.08.2022, 13:30:16 ) *
Od mysli ze ktos uzywa starego to jemu krwotok grozi :P

xDDD dokładnie!

Cytat(Therminus @ 26.08.2022, 15:18:49 ) *
przy dodawaniu nie bierze pod uwagę części dziesiętnych liczb.

Bo masz rzutowanie na INT, no ale to już nospor wyjaśnił.

Cytat(Therminus @ 26.08.2022, 15:18:49 ) *
Na początku pliku, to znaczy zaraz za <?php
?
Tak miałem od początku.

Jak znam życie, to ten plik co umieściłeś w temacie include'ujesz do index.php albo do innego pliku, prawda?
nospor
Cytat
Jak znam życie, to ten plik co umieściłeś w temacie include'ujesz do index.php albo do innego pliku, prawda?

Includowanie tu nie ma nic do znaczenia. declare ma byc na poczatku i tyle w temacie. Bardziej bym odstawial ze na poczatku tego pliku ma wpyte kodu HTML, a dokladnie 146 linii ( wink.gif ) a dopiero potem otwiera <?php i daje declare.
A na poczatku znaczy na poczatku i tyle wink.gif
Therminus
Cytat(nospor @ 26.08.2022, 15:24:21 ) *
No bo w kodzie masz

$userPower = (int)($row['Pow_Uzyt_'.$char] questionmark.gif 0);

Aaaa... ślepota. haha.gif

Cytat(nospor)
Komunikat bledu mowil jednak co innego, mowil tez ze bylo to w linii 147 a nie na poczatku pliku

Ale jesteś czujny, smile.gif
W pliku mam trochę HTML-a, potem jedną sekcję PHP, potem znowu HTML, i drugą sekcję PHP.
I te 147 jest właśnie na początku tej drugiej sekcji.

Już dodaje dobrze. smile.gif

Przy okazji mam pytanie nietypowe...
chcę w rzeczonej tabelce dać kolorowe litery, cyfry i jednocześnie pogrubione, ale nie mogę tego efektu uzyskać.
Albo mam bold, albo kolor
Coś takiego:
  1. <td align="center"; style= "font-weight: bold", "color:blue">'.$wiersz2['Status_C'].'</td>

Jak wyrzucę z kodu "font-weight: bold" to kolor jest, jak wyrzucę "color:blue", to mam pogrubienie (czarne).
Zaklęcia jakie znalazłem w sieci nie działają. smile.gif
nospor
nie
style= "font-weight: bold", "color:blue"

a:
style= "font-weight: bold,color:blue"
Therminus
Cytat(nospor @ 26.08.2022, 16:01:19 ) *
style= "font-weight: bold,color:blue"

To było pierwsze, co zastosowałem, potem kombinowałem inaczej smile.gif
Niestety, kolor działa, bold nie działa. thumbsdownsmileyanim.gif
trueblue
style= "font-weight: bold; color:blue"
nospor
Oczywiscie sredni a nie przecinek jak raczyl poprawic trueblue.
Therminus
Cytat(trueblue @ 26.08.2022, 16:29:19 ) *
style= "font-weight: bold; color:blue"

Dzięki, a wydawało mi się, ze sprawdziłem wszystkie opcje z cudzysłowami i przecinkiem, średnikiem...
gino
@Salvation troszkę się przyczepię do tej funkcji.
Mnie uczono na studiach, że funkcja napisana dobrze poza oczywistymi przypadkami ma być nienaruszalna.
A co jeśli kodującemu przyjdzie ochota rozszerzyć zakres dajmy na to do K? Tablica ta powinna być argumentem funkcji. Po co też dodatkowa funkcja mb_strtoupper? Nie można od razu tablicy z dużymi literami zdefiniować?
Sorki, że się czepiam, ale jeśli chodzi o kod to troche pedantyczny jestem a że wywodzę się z C to operatory trójargumentowe jakoś same mi się piszą :)

Kod
function summary(array $chars, array $row): int
{
    $sum = 0;
    
    foreach($chars as $char) {
        $status = (string)($row['Status_' . $char] ?? '');
        $userPower = (int)($row['Pow_Uzyt_' . $char] ?? 0);
        
        $sum += ($status === $char) ? $userPower : 0;
    }
    
    return $sum;
}

$chars = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'];
$array = [
    'Status_A' => 'A',
    'Pow_Uzyt_A' => 10,
    'Status_B' => 'B',
    'Pow_Uzyt_B' => 25,
    'Status_C' => '',
    'Pow_Uzyt_C' => 100,
];

echo summary($chars, $array);
Salvation
Cytat(gino @ 27.08.2022, 07:46:38 ) *
Mnie uczono na studiach, że funkcja napisana dobrze poza oczywistymi przypadkami ma być nienaruszalna.

Też kończyłem studia i takich głupot nie słyszałem na wykłądach.

Cytat(gino @ 27.08.2022, 07:46:38 ) *
A co jeśli kodującemu przyjdzie ochota rozszerzyć zakres dajmy na to do K? Tablica ta powinna być argumentem funkcji.

Jak dla mnie, niepotrzebne rozszerzenie o argument. Sama tablica powinna być "zamknięta" w funkcji, bo to jest baza funkcji.
+ Nie programuje się na zapas. Jest to jedna z zasad dobrych praktyk wink.gif

Cytat(gino @ 27.08.2022, 07:46:38 ) *
Po co też dodatkowa funkcja mb_strtoupper? Nie można od razu tablicy z dużymi literami zdefiniować?

Można. Szybciej mi jednak było użyć małych liter i skorzystać z funkcji biggrin.gif - z założenia też wychodzę, że to co "przyjmę" jest z małych liter.
Równie dobrze możesz użyć stringa i iterować po tym :shrug: Rozwiązanie zależy od autora wink.gif

A żeby było prawilniej i z zachowaniem typowania od początku, to $row powinno być VO, ale wiadomo jak to jest z "projektami do szuflady" i nauką wink.gif
gino
Może inaczej ujmę nienaruszalność, chodzi o to, że minimalizuje się czas do późniejszego grzebania w funkcjach, metodach ogólnie w bibliotekach współdzielonych lub pisanych dla konkretnego programisty, czasem mniej ogarniętego - do zera. Opis co ma robić ta funkcja nie narusza praktyki pisania na zapas w żadnym wypadku.
Coś należy lub nie do "bazy" funkcji? Sorki, nie znam takiego pojęcia. Może to jakiś skrót myślowy, niemniej domyślam się o co chodzi. Dane które mogą być w przyszłości zmienione lub rozszerzone nie należą do niej.

Pracowałeś kiedyś w projekcie w którym brało udział kilkunastu programistów wzwyż? Bo ja wiele razy. I jeśli widzieliśmy, pomimo opisu projektu często niedokładnego z racji tego, że ktoś kto to nadzorował miał delikatnie mówiąc wywalone, jakieś założenie nie było opisanie dokładnie np. jak tutaj zakres może ulec zmianie to się to pisało od razu. Uwierz, to czasem dobra praktyka. Później piszesz coś innego, ktoś sobie jednak przypomni że zakres może się zmienić i zawraca Ci głowę, którą masz zaprzątniętą czymś innym bo już piszesz coś innego. A uwierz mi też, że wszystko jest na wczoraj, cito, już, death line itd. Funkcja nie traci nic z opisu i działania i nic nie jest pisane na zapas.
Sorki, że trochę nieopatrznie wywołałem dyskusje zupełnie tutaj zbędną, więc to ostatni mój post w tym temacie.
Salvation
Nie wiem w ogóle skąd pomysł na CR w wątku biggrin.gif to nie SO. Mogłeś dać swoje rozwiązanie i tyle, a nie czepiać się teraz czyjegoś kodu, bo wg Ciebie nie jest "piękny".
Jakoś w innych tematach nie widać Twoich postów z poprawianiem czyichś kodów, a też nie są idealne ;D

A odnośnie "bazy", to miałem na myśli to, że funkcja "summary" podsumowuje JEDYNIE kolumny A-H. Na chwilę obecną spełnia założenia. Trzeba będzie to rozszerzyć, przepisać lub delikatnie zmienić, to przyjdzie czas na to. Tak działa green field.
NIGDY nie pisze się idealnego kodu od razu, bo jedynie co się traci, to czas. A czas, to pieniądze klienta.

I dla Twojej wiadomości. Pracowałem i sam, i w zespołach po 15-20 osób. Także multi-narodowościowych wink.gif
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.