[PHP] class i preg_match

0

Witam mam taki skrypt:

class Core
{
   function Spr()
   {

// jakiś kod

$info = chr(6).chr(0).chr(255).chr(255).'info';
$lacze = fsockopen(elfen80.servegame.com, 7171, $errno, $errstr, 1);

if($lacze){

    fwrite($lacze, $info);

    while(!feof($lacze))
	$data .= fgets($lacze, 1024);
    fclose($lacze);

preg_match('/players online="(\d+)" max="(\d+)" peak="(\d+)" waiting="(\d+)"/', $data, $what);


echo $what[1];
echo "online";
} else {
echo "offline";
}
// jakiś kod
   }
}

i teraz mam tak ze pisze online/offline ale gdy jest online to zmienna $what[1] jest puste (inne też). O co chodzi?

jeżeli dany kod nie jest w klasie i funkcji to działa bez zarzutu.

0

sproboj zamienic $lacze = fsockopen(elfen80.servegame.com, 7171, $errno, $errstr, 1);

na
$lacze = fsockopen("elfen80.servegame.com", 7171, $errno, $errstr, 1);

Ale z 2 strony... to co to za funkcja... Ja bym to zrobil w sposób, ze coś daje. To znaczy ze jest return, a nie zwykłe echo. Spróboj zrobić tez bez tego echo.. Mozę pójdzie bo nie testowałem kodu.

0

Ja do pobierania plików z zewnętrznego serwera użyłbym w ogóle curl'a.

0

fajnie się zajmować poprawnością rozwiązań gdy kod w ogóle nie działa
najprawdopodobniej wyrażenie regularne jest złe skoro nic nie zwraca, skąd je masz ?
daj
var_dump($data);
przed
preg_match(...
i powiedz co zwróciło

0
  1. mniejsza o to czy jest "" czy tego nie ma. Bo tam normalnie występuje zmienna, ale nie napisałem całego kodu, tylko kod potrzebny.

  2. to ma być ta funkcja i proszę o pomoc w niej. Co powoduje że nie działa?

3)już wiem o co chodzi.

jeżeli w fsockopen napisze "nazwa_serwera" to jest ok ale jeżeli odwołam się do zmiennej z bazy $baza[ip] to już nie działa

--

<ort>odświerzam</ort> temat

0
  1. piszemy "odświeżam"

  2. powiedz co zwróciło

  3. nie syp pseudokodami i nie wmawiaj że dzieją się jakieś dziwne rzeczy typu podanie stałej działa a zmiennej z tą samą zawartością nie, pokaż realny kod

0
class Core
{
   function Spr()
   {
	$wynik = $this->sql("SELECT * FROM 000_Serwery WHERE aktywacja='1' ORDER BY id");
	$i=0;
		while($project = mysql_fetch_array($wynik))
		{

$info = chr(6).chr(0).chr(255).chr(255).'info';
$lacze = @fsockopen("$project[ip]", 7171, $errno, $errstr, 1);

if($lacze){

    fwrite($lacze, $info);

    while(!feof($lacze))
	$data .= fgets($lacze, 1024);
    fclose($lacze);

preg_match('/players online="(\d+)" max="(\d+)" peak="(\d+)" waiting="(\d+)"/', $data, $what);

echo $what[1];
 echo "online";
} else {
 echo "offline";
}
		   $i++;
		}
return $show;
   }
}

Lenin mówił czytać:

i teraz mam tak ze pisze online/offline ale gdy jest online to zmienna $what[1] jest puste (inne też).

mam tutaj literówkę, miało być pusta.

Teraz sprawdź sobie dając w bazie danych w tabeli 'ip' => elfen80.servegame.com,
a jeżeli wpiszesz stałą "elfen80.servegame.com".

A co do pseudokodu to co to ma niby znaczyć? przecież nikt nie da Tobie całego kodu od zera, tylko część potrzebną do ocenienia błędu. Czyli to co dostałeś ode mnie teraz to też w Twoim mniemaniu pseudokod.

0

no daj po prostu działający kod a nie coś co wymaga dorobienia 90% żeby zobaczyć co ci nie działa (zwłaszcza gdy w tym fragmencie który dajesz jest wszystko ok)

naucz się debugować
przed fsockopen daj:

var_dump($project['ip']);

przed preg_match daj:

var_dump($data);

pokaż co zwróciło
łaske mi robisz ? sorry że jestem

0

zapomniałem dodać, że działam na webserv i to może przez to. Poprzedni kod działał w 100% o ile nie stosowałem funkcji i klasy. Założę się że nic nie zwróci bo chodzi po prostu oto że nie może odnaleźć i $what[1] jest "pusta". Inaczej by od razu zwrócił błąd.

O to mi chodzi.

0

dobra, no to grajmy po twojemu
wchodzę w zakład, stawiam 4 milky waye

0

xD powaliłeś mnie tym. Proszę o rozwiązanie.

P.S. Zakład anulowany :D

Oto co wyświetla:
string(21) "elfen80.servegame.com"
dla $data:
string(391) " Novo Elfen Server 8.0 - Divirta-se. "

0

string(391) " Novo Elfen Server 8.0 - Divirta-se. "

ten tekst nijak nie ma 391 znaków
jeszcze raz daj przed pregiem:

var_dump(str_replace("\0", '', $data));

// jak widzisz zawartość $project['ip'] jest taka sama jak tego ciągu który wprowadzasz ręcznie, więc to nie to. Nie mieszaj do tego jakichś zjawisk paranormalnych, w dodatku odpowiedź od serwera jest, więc 90% że wyrażenie regularne jest złe (lub nieaktualne), a 10% warto zawsze zostawić

// dobra, już samemu sprawdziłem, odpowiedź dałbyś ze źródła a nie z przeglądarki bo okazała się ona kodem xml

interesujący urywek z odpowiedzi:

players online="37" max="1200" peak="39"/>

wyrażenie regularne oczekuje natomiast:

players online="37" max="1200" peak="39" waiting="?"/>

nie znalazło tego waiting więc poległo całkiem, najprostsze rozwiązanie:

preg_match('/players online="(\d+)" max="(\d+)" peak="(\d+)"/', $data, $what);

nie dostaniesz waiting, ale jeśli chcesz go to najpierw sprawdź czy on w ogóle występuje lub np:

preg_match('/players online="(\d+)" max="(\d+)" peak="(\d+)"( waiting="(\d+)")?/', $data, $what);

względnie:

preg_match('/players( online="(\d+)")?( max="(\d+)")?( peak="(\d+)")?( waiting="(\d+)")?/', $data, $what);

ale wtedy zmieniają ci się nieco indeksy (1 => 2, 2 => 4, 3 => 6, 4 => 8)

możesz też zwyczajnie przeparsować odpowiedź jako xml lub najszybciej znaleźć interesujący ciąg poprzez substr i strpos

ale mam duże wątpliwości czy ja trzeźwo teraz myślę

0

proszę oto nowa odpowiedź:
var_dump(str_replace("\0", '', $data));

A teraz tak. Sprawdź sobie ten kod:
index.php:

<?
include("core.php");
?>

core.php:

<?
class Core
{
   function Spr()
   {
        $wynik = $this->sql("SELECT * FROM 000_Serwery WHERE aktywacja='1' ORDER BY id");
        $i=0;
                while($project = mysql_fetch_array($wynik))
                {

$info = chr(6).chr(0).chr(255).chr(255).'info';
$lacze = fsockopen("elfen80.servegame.com", 7171, $errno, $errstr, 1);

if($lacze){

    fwrite($lacze, $info);

    while(!feof($lacze))
        $data .= fgets($lacze, 1024);
    fclose($lacze);

preg_match('/players online="(\d+)" max="(\d+)" peak="(\d+)" waiting="(\d+)"/', $data, $what);

echo $what[1];
 echo "online";
} else {
 echo "offline";
}
                   $i++;
                }
return $show;
   }
}
?>

A teraz zrób w bazie mysql tabele gdzie dla ip dajesz elfen80.servegame.com.
Umieść odpowiednie połączenie i zamiast:

$lacze = fsockopen("elfen80.servegame.com", 7171, $errno, $errstr, 1);

wklej:

$lacze = fsockopen($project[ip], 7171, $errno, $errstr, 1);

i odpal.

Jak widać w momencie umieszczenia stałej wynik jest np: 192, natomiast po umieszczeniu zmiennej nie ma nic.

// jaki kod napisałeś że wyświetlił Tobie zawartość?

0

cały kod:

<?php

$info = chr(6).chr(0).chr(255).chr(255).'info';
$project['ip'] = "elfen80.servegame.com";

$lacze = @fsockopen($project['ip'], 7171, $errno, $errstr, 1);

if($lacze){

    fwrite($lacze, $info);

$data = '';
    while(!feof($lacze))
        $data .= fgets($lacze, 1024);
    fclose($lacze);

preg_match('/players online="(\d+)" max="(\d+)" peak="(\d+)"(?: waiting="(\d+)")?/', $data, $what);

list(,$players,$max,$peak,$waiting) = $what + Array(4 => 'N/A');

echo "Gracze: $players <br />" .
     "Max: $max <br />" .
     "Peak: $peak <br />" .
     "Waiting: $waiting";

}
?>

nie będe tworzył tabeli w bazie żeby sprawdzić jakieś nielogiczne teorie
a jak widzę uparty jesteś i nie zmienisz wyrażenia mimo iż teraz ci udowodniłem że skrypt nie ma prawa z nim działać (choć nie w 100%, tylko gdy nie ma "waiting" ale nie wiem co ta wartość oznacza)

nie mów też że to zależy od tego że funkcja nie jest w klasie :| po prostu zmień wyrażenie regularne

albo załóżmy się o coś większego

0

ale napisz mi proszę czy da się odczytać całą zawartość $lacze. Szczerze mówiąc nigdy nie działałem w ten sposób i nie wiem jak to zrobić,a potrzebuje tego.

Twój kod działa w osobnym pliku. Jutro zintegruje go z kodem i sprawdzę.

//działa, dzięki wielkie. Pewnie musi być błąd w tym moim kodzie.

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