Brak poprawnego przypisania wartości w warunku do zmiennej globalnej.

0

Witajcie,

Nie mogę sobie poradzić z tematem. Czy ktoś mi może powiedzieć dlaczego zmienna globalna jest niewidoczna w warunku gdzie przypisuje do niej inną wartość? Próbowałem już na różne sposoby i nie mogę przypisać wartości do zmiennej w tym konkretnym miejscu. Po warunkach przeskakuje w kolejności jak jest napisane.

$definicjaPrzychodow = array();
$definicjaWydatkow = array(); // zmienna globalna z pusta tablica
$wydatkiWartosc = array();
$przychodyWartosc = array();
$pozycjeWydatki = 0;
$pozycjePrzychody = 0;
$nazwyTabeli = array("Nazwa", "Wartość", "Nazwa", "Wartość");
$suma = 0;
print_r($_POST);
if($_POST == null){

	definicjaNazw();
}else{
	
	
	   if ($_POST['Submit'] == "Utworz Definicje"){
		konfiguracja();
	   }else if($_POST['Submit'] == "Dodaj Nazwy"){
		$definicjaWydatkow = array("Nazwa"); // przypisanie do zmiennej globalnej wartosci tablicy
		definicjaTabel();
		
	   }else if ($_POST['Submit'] == "Utworz Tabele"){
		$pozycjeWydatki = $_POST['pozycjeWydatki'];
		$pozycjePrzychody = $_POST['pozycjePrzychody'];
		
		wyswietl($pozycjeWydatki, $pozycjePrzychody, $definicjaWydatkow, $definicjaPrzychodow,
			$wydatkiWartosc, $przychodyWartosc);
		print_r($definicjaWydatkow); // zmiennna globala pusta mimo przypisania

        }
}
0

co ty tam chcesz wyświetlać, skoro nigdy do tego bloku nie dotrzesz bo wypełniasz tę tablicę w innym warunku

1
  1. Sformatuj ten kod normalnie
  2. Nie stosuj globali? Dlaczego? Właśnie dlatego.
0

@Rossik: Pisząc na temat, odpisuj w postach.

Tak wygląda moim zdaniem sformatowany kod - wcięcia w każdym nowym bloku. else przeniosłem do nowej linii, bo tworzy to wizualnie pustą przestrzeń, która też ułatwia zorientowanie się w kodzie.

$definicjaPrzychodow = array();
$definicjaWydatkow = array(); // zmienna globalna z pusta tablica
$wydatkiWartosc = array();
$przychodyWartosc = array();
$pozycjeWydatki = 0;
$pozycjePrzychody = 0;
$nazwyTabeli = array("Nazwa", "Wartość", "Nazwa", "Wartość");
$suma = 0;
print_r($_POST);

if($_POST == null){
    definicjaNazw();
}
else{
    if ($_POST['Submit'] == "Utworz Definicje"){
        konfiguracja();
    }
    elseif($_POST['Submit'] == "Dodaj Nazwy"){
        $definicjaWydatkow = array("Nazwa"); // przypisanie do zmiennej globalnej wartosci tablicy
        definicjaTabel();
    }
    elseif ($_POST['Submit'] == "Utworz Tabele"){
        $pozycjeWydatki = $_POST['pozycjeWydatki'];
        $pozycjePrzychody = $_POST['pozycjePrzychody'];

        wyswietl($pozycjeWydatki, $pozycjePrzychody, $definicjaWydatkow, $definicjaPrzychodow,
            $wydatkiWartosc, $przychodyWartosc);
        print_r($definicjaWydatkow); // zmiennna globala pusta mimo przypisania
    }
}

W każdym razie - pokaż kod funkcji wyswietl - bez tego nic Ci nie pomożemy, bo tam dzieje się (lub nie dzieje właśnie) najważniejsze.

0

Źle nazwany temat. Można by pomyśleć że są tu jakieś zmienne lokalne - ale ich nie ma.
Wszystko tu jest globalne, bo nie ma funkcji, więc nie ma się co przykrywać (ew. może się coś nadpisać).

0

Dziękuję za sugestię, różne szkoły różnie uczą, do tej pory robiłem od nowej linii ale w książkach pojawia się też wersja jak powyżej. Zerknę na kod w funkcji wyświetl i dam znać. Swoją drogą czy nie jest tak, że argumenty przekazane przez parametr są kopiowane? Czy tak jak w C i Javie odbywa się to przez referencje jak jest tablica i umożliwia zmianę wartości argumentów w funkcji? Skoro tak by się działo to musiałoby być przypisanie tablicy do pustej w tejże funkcji. Jakieś inne sugestie?

0

Argumenty są kopiowane, z wyjątkiem obiektów (być może też zasobów, tego nie wiem w sumie), bądź argumentów, które w funkcji docelowej oznaczasz do przekazania jako referencja.

0

Ok czyli skoro są kopiowane to co się dzieje w funkcji wyświetl() nie ma wpływu na zmienną globalną, chyba że zaznaczę zmienną jako globalną, a tak w tym przypadku nie jest (mam parametr oraz zmienną lokalną w funkcji wyświetl o tej samej nazwie - bez związku). Równie dobrze mogę usunąć wykonanie tej funkcji z warunku. Jakieś inne sugestie?

Edit : Zresztą nie ma to znaczenia, w funkcji parametr też zwraca pusto

0

Daj kod, zamiast o nim opowiadać ;) Do mechanika przyjeżdżasz z samochodem, a nie książką z opowieścią jak coś stuka, charczy i sapie.

0

Tutaj: http://4programmers.net/Forum/1102420 dostałeś poprawną sugestię.

0

Dobra, nie będę wrzucał implementacji funkcji, bo to nic nie zmienia (sprawdzone). Doszedłem za to do ciekawego rezultatu. Jeśli wrzucę przypisanie poza warunek $_POST to w warunku poprawnie wyświetla. Niestety nie wiem dlaczego tak się dzieje. Specyfika języka?

$definicjaWydatkow = array(); // zmienna globalna z pusta tablica
 
if($_POST == null){
    definicjaNazw();
}
else{
       $definicjaWydatkow = array("jeden"); // przypisanie poza warunkiem
       if ($_POST['Submit'] == "Utworz Definicje"){
        
       $definicjaWydatkow = array("dwa"); // przypisanie w warunku
       
       }else
          var_dump($definicjaWydatkow); // gdy przypisanie poza warunkem print jeden, gdy przypisanie w warunku print array();
}

`dodanie znacznika ``` - @furious programming

0

kajam się, jak kopiowałem to ucięło mi jeden nawias. Zdaje sobie sprawę ze 'print_r' jest wykonywany właśnie w tym warunku i tak ma być. Ma to na celu wykazanie, że zmienna globalna '$definicjaWydatkow' jest pustą tablicą zamiast przypisanej wcześniej tablicy z wartością "Nazwa" i w tym tkwi błąd którego nie rozumiem. Przypisanie wartości do zmiennej globalnej następuje przed wyświetleniem, a i tak odwołuje się do pustej tablicy. - Rossik dzisiaj, 08:19

Poprawiłeś już ten nawias, który ci "ucięło" przy kopiowaniu czy tak już jest poprawnie?

Nigdy nie przypiszesz niczego do tej zmiennej jeżeli dotrzesz do bloku który ma ją wyświetlać, albo nigdy jej nie wyświetlisz jeżeli coś do niej przypiszesz bo jest czyszczona przy każdym żądaniu do tego pliku/strony/funkcji czy co to jest, więc nawet jeżeli pomiędzy requestami coś do niej przesyłasz to sam ją zerujesz przypisując pustą tablicę na początku pliku.

nie bardzo rozumiem co masz na mysl. Przechodze przez wszystkie bloki warunku i to nie jest istotne w zapytaniu. przypisanie wartosci do definicji dziala bo jak printuje w tym warunku to sie wyswietla. Jednak jak wyjdzie z bloku to juz wyswietla zmienna globalna czyli pusta tablice. - Rossik dzisiaj, 06:22

Przez nic nie przechodzisz, wykonuje się tylko kod w warunku który zwraca prawdę, pozostałe są ignorowane. Żeby wykonać wszystkie 3 warunki potrzebujesz 3 osobnych żądań, albo dziwnego, ręcznego nadpisywania zmiennych w $_POST w pozostałych warunkach, co z kolei sugeruje, że te bloki warunkowe są zbędne i niczemu nie służą, albo nie wiesz jak mają działać.

Dopisz nawias w 25 liniii to może ci coś zadziała, albo kombinuj dalej, ładnie sformatowany kod już dostałeś.

0

Poprzedni kod nie ma już znaczenia. Zamieściłem prostszą implementację. Zgodzę się z wnioskami - każde żądanie czyści zmienną globalną do zera. W takim razie jak używać zmiennej statycznej by nie była wrażliwa na żądanie i zachowała wartość dynamicznie?

Już sobie poradziłem, proszę o zamknięcie wątku.

1
Rossik napisał(a):

Dobra, nie będę wrzucał implementacji funkcji, bo to nic nie zmienia (sprawdzone). Doszedłem za to do ciekawego rezultatu. Jeśli wrzucę przypisanie poza warunek $_POST to w warunku poprawnie wyświetla. Niestety nie wiem dlaczego tak się dzieje. Specyfika języka?

$definicjaWydatkow = array(); // zmienna globalna z pusta tablica
 
if($_POST == null){
    definicjaNazw();
}
else{
       $definicjaWydatkow = array("jeden"); // przypisanie poza warunkiem
       if ($_POST['Submit'] == "Utworz Definicje"){
        
       $definicjaWydatkow = array("dwa"); // przypisanie w warunku
       
       }else
          var_dump($definicjaWydatkow); // gdy przypisanie poza warunkem print jeden, gdy przypisanie w warunku print array();
}

Ten kod też nie ma sensu, przez ten 'else', wyświetlasz zawsze $definicjaWydatkow gdy $_POST['Submit'] != "Utworz Definicje"
Nie rozumiesz kodu który piszesz

$definicjaWydatkow = array(); // przypisanie array() do zmiennej $definicjaWydatkow
 
if($_POST == null)
{
    // Ten kawalek kodu wykona sie tylko gry $_POST będzie pusty
    definicjaNazw();
    // TUTAJ DOSTANIESZ array() dla $definicjaWydatkow
}
else
{
    // Ten kawalek kodu wykona sie tylko gry $_POST będzie zawierał dowolną wartość
    // TUTAJ DOSTANIESZ array() dla $definicjaWydatkow
    // przypisanie array("jeden") do zmiennej $definicjaWydatkow i nadpisanie poprzedniej zawartości zmiennej
    $definicjaWydatkow = array("jeden"); 
    // TUTAJ DOSTANIESZ array("jeden")  dla $definicjaWydatkow

    if ($_POST['Submit'] == "Utworz Definicje")
    {
        // JEŻELI $_POST['Submit'] == "Utworz Definicje"
        // przypisanie array("dwa") do zmiennej $definicjaWydatkow i nadpisanie poprzedniej zawartości zmiennej 

        // TUTAJ DOSTANIESZ array("jeden")  dla $definicjaWydatkow
        $definicjaWydatkow = array("dwa"); 
        // TUTAJ DOSTANIESZ array("dwa")  dla $definicjaWydatkow
    }
    else 
    {
        // wyrzucenie zawartosci $definicjaWydatkow JEŻELI $_POST['Submit'] != "Utworz Definicje"
        var_dump($definicjaWydatkow); 
        // TUTAJ DOSTANIESZ array("jeden") dla $definicjaWydatkow bo taką wartość ustawiłeś przed całym blokiem warunkowym if else, 
        // a wartość zmieniałeś tylko w bloku if, ktory sie nie wykonal jezeli tutaj dotarles
    }
        // TUTAJ DOSTANIESZ array("jeden") lub array("dwa") dla $definicjaWydatkow w zależności od tego co znajduje się w $_POST['Submit']
        // bo albo nadpisałeś wartość w bloku if powyżej, albo wykonał sie blok else który nic z ta zmienna nie robi, wiec pozostała wartość 
        // sprzed bloku warunkowego
}
0

Dziękuje Ci bardzo za poświęcony czas i wyjaśnienie, które jest dla mnie zrozumiałe. Sęk w tym, że myślałem iż globalne zmienne są dostępne podczas działania strony cały czas i mogę zmieniać je w każdym momencie co zaowocuje zmianą wartości w innej wyświetlanej akurat funkcji. Nie myślałem,że żądanie ma wpływ na zadeklarowane zmiennie i, że wszystko inicjalizuje z każdym postem od nowa. Powyższy kod jest bez sensu oczywiście masz rację(gdyby miał sens i działał nie zawracał bym głowy), ale obrazuje istotę problemu. Myślałem, że globalne zmienne w PHP są tożsame ze zmiennymi statycznymi z Javie i trzyma je w jakieś pamięci. Wiem jak działa instrukcja warunkowa i tak to ma działać, rzeczywiście mogło być niezrozumiałe stąd twoje mało przyjemne dygresje. Zasada działania jest następująca :

if ($_POST('1')){
	wykonaj1();
}
else if($_POST('2')){
	wykonaj2();
}
else if($_POST('3'))
	wykonaj3();

który warunek ma być wykonany steruję odpowiednim formularzem i wiem, że w danej chwili tylko jeden (ewentualnie można użyć switch)

założyłem sobie kilka formularzy, których wyniki są podstawą utworzenia nowego formularza np. form1 - wynik liczba pol form2, form2 - wynik definicja nazw form3, form3 - liczba pol i definicje - tabela.

Stąd też potrzebowałem poszczególnych zmiennych z każdego forma do zapisania w globalnych zmiennych "na potem" gdzie finalnie tworze forma z liczbą pól oraz combobox z nazwami definiowanymi przez użytkownika, a tu się okazuje, że php nie ma zmiennych statycznych(chyba,że się mylę) ;) mogę zrobić to w sesji, lub javascript ,ale to ma być proste, bo na projekt zaliczeniowy z podstaw dla koleżanki.

Aaaa i żeby nie było, że nie rozumiem kodu :

$definicjaWydatkow = "Podaj definicje";
 
if($_POST == null){
    definicjaNazw();
}
else{
       
       if ($_POST['Submit'] == "Utworz Definicje"){
           if(!empty($_POST['definicja'])
              $definicjaWydatkow = $_POST['definicja']; // przypisanie w warunku
           print($definicjaWydatkow);
       }
         
}

To chyba ma już sens? :)

1
Rossik napisał(a):

Sęk w tym, że myślałem iż globalne zmienne są dostępne podczas działania strony cały czas i mogę zmieniać je w każdym momencie co zaowocuje zmianą wartości w innej wyświetlanej akurat funkcji.

Globalne zmienne są dosępne cały czas podczas działania skryptu, nie strony. Jeśli widzisz stronę to zapewne skrypt PHP już się wykonał - robota skończona. Przy kolejnym żądaniu (odświeżenie strony, wysłanie formularza) zostanie uruchomiony jeszcze raz od początku. Z takim samym stanem początkowym jak w każdym innym żądaniu.
Tak jak wspomniałeś wcześniej - zapamiętać pewien stan możesz używając sesji lub po prostu przesyłać odpowiednie dane w żądaniach.

0

Może się komuś przyda. Podobny efekt można uzyskać za pomocą cookies o ile ktoś oczywiście je zaakceptuje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1