Odbieranie danych CURL'em z tablicy GET

0

Witam,
Dostaje dane o nazwach postaci w tablicy superglobalnej GET np.

www.adres.pl/data.php?=Nick1||Nick2||nick3||nick4||nick5||nick6||nick7.....||Nick20

Następnie rozbijam te nicki explodem i chce foreachem pobrac wszystkie dane tych postaci za pomocą curla i zapisać do bazy, jednakże czasami zamiast zczytać jakąś wartość to przypisuje albo 0 , albo nic nie wstawia, gdy jest większa ilość postaci (choć tutaj tez nie ma reguły, czasami zdarza się , że nie zczyta nawet jak jest 5 nicków przesłanych GET'em do sprawdzenia).

Czy ktoś wie,co jest nie tak? Wstawiam poniżej funkcje curl'a odpowiadającą za pobieranie danych ze strony.

function getInfoCharacters($TibiaCharName)
{
    $result = '0';
    $c = curl_init();
    curl_setopt($c, CURLOPT_URL, 'http://www.tibia.com/community/?subtopic=characters&name='.urlencode($TibiaCharName));
    curl_setopt($c, CURLOPT_TIMEOUT, 15);
    curl_setopt($c, CURLOPT_HEADER, 0);
    curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
    $htmlBuffer = curl_exec($c);
    curl_close($c);
        
        //level
        $lvl = getStrBetween($htmlBuffer, '<td>Level:</td><td>','</td></tr>');
        if (($lvl!='') and (strlen($lvl)<5))
            $result_lvl = $lvl;
        else
        $lvl = getStrBetween($htmlBuffer, '<td>Level:</td><td>','</td></tr>');
        
        //profession
        $profession = getStrBetween($htmlBuffer, '<td>Vocation:</td><td>','</td></tr>');
        if (($profession!='') and (strlen($profession)<30))
            $result_profession = $profession;
        else 
            $result_profession = getStrBetween($htmlBuffer, '<td>Vocation:</td><td>','</td></tr>');
            
        //residence
        $residence = getStrBetween($htmlBuffer, '<td>Residence:</td><td>','</td></tr>');
        if (($residence!='') and (strlen($residence)<40))
            $result_residence = $residence;
        else
            $result_residence = getStrBetween($htmlBuffer, '<td>Residence:</td><td>','</td></tr>');
        
                      
        //house
        $house = getStrBetween($htmlBuffer, '<td>House:</td><td>',' is paid until');
        if (($house!='') and (strlen($house)>3))
            $result_house = $house;
            
        
        $resultAll = $result_lvl . '|' . $result_profession . '|' . $result_residence . '|' . $result_house;   
        return $resultAll;
        
        
    }
0

Naucz się debugowania ;) Z kodu nic nie można wywnioskować na dobrą sprawę, bo nie da się go u siebie uruchomić (wyciąłeś fragmenty z explode, nie ma zawartości funkcji getStrBetween, która może błędnie działać).

Najprostsza metoda - ładuj wszędzie var_dump (otocz to <pre> żeby łatwiej zinterpretować zwrotkę z przeglądarce).

Czyli:

  • Jeżeli wyexplodujesz nicki - zrób var_dump na tablicy zwrotnej. Sprawdzisz, czy nicki są takie, jak oczekujesz.
  • Jeżeli curlem łączysz się pod jakiś adres - wypluj sobie var_dumpem dokładnie taki adres, pod który się łączysz. Sprawdzisz, czy faktycznie łączysz się do oczekiwanego adresu.
  • Wypluj sobie całą zwrotkę z curla. Sprawdzisz czy nie dostajesz jakiegoś komunikatu błędu, albo czy błędne dane nie przychodzą już z tej strony.
  • Jeżeli masz jakiegoś ifa - wypluj sobie za każdym razem informację o zmiennych, które sprawdzasz i wyniku ifa, tj:
var_dump('wchodzę w ifa nr 1');
if (($lvl!='') and (strlen($lvl)<5)) {
  var_dump('if 1 udany, bo lvl: ');
  var_dump($lvl);
  var_dump('oraz strlen');
  var_dump(strlen($lvl));
}
else {
  var_dump('if 1 NIEUDANY, bo lvl: ');
  var_dump($lvl);
  var_dump('oraz strlen');
  var_dump(strlen($lvl));
}

var_dumpa używaj osobno na tekście pomocniczym i na zmiennych, bo unikniesz wtedy konwertowania zmiennych do stringa (co może być krytyczne, przykład niżej).

NIE UŻYWAJ TEŻ "luźnego" porównania, tj. == albo !=.
Używaj porównania dokładnego, który nie "zgaduje" Twoich intencji, ponieważ te zgadywanie może czasem nie być zgodne z Twoimi założeniami.

Przykład?

var_dump(0==''); // zwróci TRUE !!
var_dump('0'==''); // zwróci FALSE !!

var_dump(0===''); // zwróci FALSE
var_dump('0'===''); // zwróci FALSE

Magiczne nie? To nie jest bug! To są założenia języka, które mają ułatwić programowanie w nim, a czasami potrafią doprowadzić do niespodziewanych sytuacji. W tym kawałku kodu raczej to nie wystąpi, bo wszystko masz stringami, a string '0' i pusty string nie są sobie równe, niemniej warto mieć to na uwadze.

I pamiętaj też, że:

var_dump(0=='0'); // zwróci TRUE
var_dump(0==='0'); // zwróci FALSE
// Nie ma tu "zgadywania" czegokolwiek i musisz być świadomy typów zmiennej (int, a string to przecież różne rzeczy).

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