[php] zmienna gubi wartość

0

Witajcie

to co napisałem niżej jest strasznie wymęczone, ale sam skrypt jest
dobrze napisany. Jestem niewyspany, ostatnio mało sypiam, mam
mało siły, żeby tego posta jakoś wyrzeźbić, więc nie krzyczcie ;-)

Napisałem już większą część skryptu, problem mam z ostatnią
funkcją, w której nawet skopiowałem główną część z innej, działającej.
Cały mechanizm wywoływany jest z głównego pliku(index) includem
skryptu php o nazwie rejestruj.

Więc.
Skrypt pobiera dane gościa:i ip, nazwę hosta i ew. adres zza proxy.
Wraz z datą i czasem skrypt zapisuje dane gościa w logach.

Następnym krokiem w pliku rejestruj jest sprawdzenie, czy gościem jest ktoś
z blokowanych adresów. Wykonywane jest to w taki sposób:

$pS = pracownikSerwisu($adresIP, $IP_XFF);
// i jeżeli to pracownik...
if($pS) {
	// ... sprawdź, czy gość z tego adresu już tu kiedyś był...
	$tS = testS($adresIP, $IP_XFF);
	// ... i jeżeli był: zablokuj
	if($tS){ $zablokuj = true; }
	// a gdyby go jeszcze nie było: zapisz fakt odwiedzin
	else zapiszLog($adresIP, $host, $IP_XFF, 'archiwum/adresyS.txt');
	// strona laduje sie pierwszy raz, i ostatni
}

Zmienna $zablokuj sprawdzana jest w głownym pliku...
if($zablokuj) return 1;
... i gdy trzeba, kończy działanie skryptu.

Podobnego sposobu użyłem dla blokowania gości zza proxy.

if( czyProxy($adresIP) ) { $proxy = true; }
else $proxy = false;

Główny skrypt(index):

if($proxy) {
	echo "<span>Wystapil blizej niezidentyfikowany problem.</span>";
	return 2;
}

Teraz okazuje się, że pierwsze rozwiązanie ustala zmienną $zablokuj tak
jak trzeba, drugi skrypt niestety nikogo nie blokuje. Działam na danych
testowych, mam kontrolne echo i wypisywanie zmiennych i według tego
wszystko działa. Dorzuciłem również test zmiennej w głównym skrypcie
przed głównym sprawdzaniem:

if(isset($proxy)) {
	 echo $proxy;
	 echo "bpb/";
} else "bp/";

Ku mojemu zdziwieniu, wyświetla się tylko tekst 'bpb/', czyli zmienna
$proxy jest zarejestrowana, ale jest pusta.

Jeżeli linijkę po użyciu funkcji czyProxy() przypiszę zmiennej $proxy
wartość true, skrypt działa. Z początku myślałem, podczas poprzedniej
konfiguracji, że coś jest nie tak podczas przypisywania do zmiennej
wyniku działania funkcji:
$proxy = czyProxy($adresIP);

jednak po zmianie na obecną, czyli najpierw if(), później przypisanie
ręczne, nic się nie zmieniło.

Teraz właśnie dodałem przed testem isset() test empty() i wyszło na to
że zmienna $proxy jest pusta, czyli generalnie zmienna jest.

Wywoływania funkcji wraz ze zmiennymi są następujące:
(zagnieżdżenie)
index.php <- rejestruj.php <- funkcje.php; index ma include
z rejestruj, a rejestruj ma include funkcje.php.

testS() z funkcje.php, wywyoływana w rejestruj.php i na podstawie wyniku
w pliku rejestruj.php zmienna $zablokuj jest ustawiona na true i użyta
w pliku index.php(jest deklarowana/inicjowana w pliku rejestruj)

czyProxy z funkcje.php, wywoływana w rejestruj.php i na podstawie wyniku
w pliku rejestruj.php zmienna $proxy jest ustawiona na true i użyta w pliku
index.php(zmianna $proxy jest deklarowana/inicjowana w pliku rejestruj)

Zmienna przechowująca stan proxy jest/nie ma w funkcji czyProxy ma inną
nazwę, niż tworzona później i przekazywana zmienna $proxy.

Wnętrze funkcji jest sprawdzane i działa, coś się skopało przy samym
przekazywaniu wyniku zmiennej $proxy.

Nie mam pojęcia co z tym zrobić, restartowałem serwer i system, zmieniałem
nazwę zmienne z proxy na jakaś inne, ale nic nie pomogło. Jakieś rady?
Ledwo żyję :-(

... Wesołych! Ech...

0

Ku mojemu zdziwieniu, wyświetla się tylko tekst 'bpb/', czyli zmienna
$proxy jest zarejestrowana, ale jest pusta.

Zmienna $proxy nie jest pusta, tylko zawiera wartość false. False rzutowane na string daje "" i dlatego nic nie widzisz oprócz 'bpb/';

czyli...

twoja funkcja czyProxy( $IP ) średnio sobie radzi z wykrywaniem proxy.

0

Jednak. Jak pisałem, ciało funkcji jest poprawne, bo na ten przykład mam spreparowaną listę proxy, pasującą pod skrypt/konfigurację i skrypt działa, problem pojawia się przy przekazywaniu wyniku skryptu do pliku wyżej, bo z wartości true robi się nic.

Skrypt debuguję wywołaniami echo i według tych wywołań skrypt działa. Kiedyś miałem podobny problem, chodziło o przekazanie zmiennej o dwa pliki/moduły dalej. Teraz wiem, że dalej nie można, albo trzeba było podać zmienną w tablicy POST, w każdym razie -- to nie powinno być to.

Rzut okiem na kod...

Znalazłem błąd, ale jeszcze go nie rozumiem :-) Chwila odświeżenia i wytypowałem sprawcę. Dziękuję za pomoc, a tymczasem zostawiam fragment kodu dla zainteresowanych :-) Jeżeli rozwiążesz, masz się z czego cieszyć, mnie ślęczenie zajęło trochę czasu ;-)

// spreparowana lista(dwie wybrane linie)
127.0.0.2 127.0.0.2 127.0.0.2 
64.18.158.194 www.proxy.org

parametr to adres gościa, poprawny(127.0.0.2)


# funkcje.php
	function czyProxy($adresIP) {
		$host = gethostbyaddr($adresIP);
		$szukaneHost 	= '/' . $host 		. '/';
		$szukaneIP 		= '/' . $adresIP	. '/';
// testowe	echo $szukaneIP . $szukaneHost;
		$p = false;

		$listaProxy = "proxy.txt"; 	// przypisanie zmniennej $file nazwy pliku 
		$plik = fopen($listaProxy, "r");
		while ($wpis = fscanf($plik, "%s%s%s%s%s\n")) {
		    list ($z1, $z2, $z3, $z4r, $z5r, $z6r) = $wpis;
// testowe	if($z1 == '64.18.158.194') echo "adres11";
// testowe	if($z2 == '127.0.0.1') echo "adres22";
// testowe	if($z3 == '127.0.0.2') echo "adres33";
			// wyszukiwanie pasujących danych pliku proxy.txt z aktualnymi adresami
			if(!empty($z1)) {
				preg_match($szukaneHost, $z1, $wynikHost);
				preg_match($szukaneIP, $z1, $wynikIP);
				$wynik = $wynikHost or $wynikIP; //'sumujemy' wyniki
// testowe			echo "z1 ";
				if(!$wynik) {
					if(!empty($z2)) {
					 	preg_match($szukaneHost,$z2, $wynikHost);
						preg_match($szukaneIP, $z2, $wynikIP);
						$wynik = $wynikHost or $wynikIP;
// testowe					echo "z2 ";
					} if(!$wynik) {
					 	if(!empty($z3)) {
					 	 	preg_match($szukaneHost,$z3, $wynikHost);
							preg_match($szukaneIP, $z3, $wynikIP);
							$wynik = $wynikHost or $wynikIP;
// testowe						echo "z3 ";
						} if (!$wynik) $p = false;
						else $p = true;
					} else $p = true;
				} else $p = true;
			}
			if($p) {
			 	fclose($plik);	// zamknij plik
			 	return $p;
			}
		} // petla while

(...)

	return $p;
} // funkcja wyświetla adres11 oraz adres33 oraz każde echo 'z', nie ma komunikatów o błędzie





# rejestruj.php
parametr poprawny(127.0.0.2)

// 2.c -- wprawdzie użytkownik może być już zablokowany
// ale jeszcze odrzucamy gości zza proxy i zapisujemy
// nowe proxy, jeżeli gość jest z innego adresu

	if( czyProxy($adresIP) ) { $proxy = true; }
	else $proxy = false;

// tutaj nic się nie wyświetla





# index.php

	if(empty($proxy)) {
		echo "pp/";
	}
	
	if(isset($proxy)) {
	 	echo $proxy;
	 	echo "bpb/";
	} else "bp/";
	
	
	if($proxy) {
		echo "<span>Dostęp zza proxy zablokowany(wykrzacza bazę danych)</span>";
		return 2;
	}

// kod wyświetla tylko 'pp/bpb/'
0

Szczerze to nie mam zamiaru tego "rozwiązywać" :) I to nie tylko dlatego, że nie wiem dlaczego w jednej linii pliku proxy.txt masz trzy wartości, a w innej dwie oraz co znaczą zmienne $z1, $z2, $z4r, ...

PS. Dobrze że sprawdzasz tylko $z1, $z2 i $z3. Jakbyś musiał sprawdzać aż do $z10 to pewnie dziesięć razy byś tego ifa zagnieździł ;) Ale skoro działa i ci taki kod nie przeszkadza to ok.

0

Lol...
powiedz mi tylko jedno
if(isset($proxy)) Wiesz jak działa isset?

$proxy = false;
isset zwróci true, bo zmienna istnieje...

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