2011-07-04 44 views
1

首先讓我開始說我使用CodeIgniter和Facebook類埃利奧特Haughin創建。 http://www.haughin.com/code/facebook/我有那份工作,發現一切都很好。但是當我用各種FB賬戶測試我的代碼時,我偶然發現了一個我想評估的問題,但是我的嘗試失敗了。我搜索了一下,並打了其他論壇,我一直想出我最初提出的答案。一些應該通過一切手段,但似乎並沒有在這種情況下..stdClass問題與檢測isset,空,其他

現在,我已經說過,我的問題是.. FB傳回的對象並不總是有一個特定的條目它。對於這個例子的目的不適的言的用戶名..

繼承人返回的數據的示例使用用戶名:

facebookResponse Object 
(
    [__construct:private] => 
    [__resp] => stdClass Object 
     (
      [data] => stdClass Object 
       (
        [id] => 0000000000000 
        [name] => Random.User 
        [first_name] => Random 
        [middle_name] => ... 
        [last_name] => User 
        [link] => http://www.facebook.com/profile.php?id=000000000 
        [birthday] => 11/26/1980 
        [gender] => male 
        [timezone] => -4 
        [locale] => en_US 
        [verified] => 1 
        [updated_time] => 2011-05-30T19:24:53+0000 
       ) 

這裏是一個沒有用戶名的例子:

facebookResponse Object 
(
    [__construct:private] => 
    [__resp] => stdClass Object 
     (
      [data] => stdClass Object 
       (
        [id] => 000000000000000000000 
        [name] => Random User 
        [first_name] => Random 
        [last_name] => User 
        [link] => http://www.facebook.com/Random.User 
        [username] => Random.User 
        [birthday] => 11/10/1985 
        [hometown] => stdClass Object 
         (
          [id] => 000000000000000 
          [name] => Coventry, Connecticut 
         ) 

        [location] => stdClass Object 
         (
          [id] => 00000000000000 
          [name] => San Jose, California 
         ) 

我最後失敗的嘗試,試圖解決這個問題像這樣的事情..

 $fb_result = $this->facebook->call('get', 'me', array('metadata' => 1)); 
     $fbFirstName = $fb_result->first_name; 
     $fbLastName = $fb_result->last_name; 
     $fbUserName = $fb_result->username; 
     $fbUserId = $fb_result->id; 
     $fbHomeTown = $fb_result->hometown->name; 
     $fbLocation = $fb_result->location->name; 
     echo "<strong>First Name: </strong>"; if((isset($fbFirstName))AND(!empty($fbFirstName))AND(trim($fbFirstName) !== "")){echo $fb_result->first_name ."<br />"; }else{ echo "Not found.<br />"; } 
     echo "<strong>Last Name: </strong>"; if((isset($fbLastName))AND(!empty($fbLastName))AND(trim($fbLastName) !== "")){echo $fb_result->last_name."<br />"; }else{ echo "Not found.<br />"; } 
     echo "<strong>Username: </strong>"; if((isset($fbUserName))AND(!empty($fbUserName))AND(trim($fbUserName) !== "")){echo $fb_result->username."<br />"; }else{ echo "Not found.<br />"; } 
     echo "<strong>User FB ID: </strong>"; if((isset($fbUserId))AND(!empty($fbUserId))AND(trim($fbUserId) !== "")){echo $fb_result->id."<br />"; }else{ echo "Not found.<br />"; } 
     echo "<strong>Location hometown: </strong>"; if((isset($fbHomeTown))AND(!empty($fbHomeTown))AND(trim($fbHomeTown) !== "")){echo $fb_result->hometown->name."<br />"; }else{ echo "Not found.<br />"; } 
     echo "<strong>Location current (manual input): </strong>"; if((isset($fbLocation))AND(!empty($fbLocation))AND(trim($fbLocation) !== "")){echo $fb_result->location->name."<br />"; }else{ echo "Not found.<br />"; } 

其中在我首先將其定義爲變量的情況下,然後使用if-else檢查它現在正在工作。我現在正在「嘗試獲取非對象的屬性」以獲取錯誤。這意味着我想,因爲它不在那裏,我試圖將它設置爲一個變量,無論它爲它踢出一個錯誤。我花了一天的更多時間和昨天試圖解決這個問題,我不得不說我被卡住了。 PHP的錯誤類型不過是一個單純的「通知」,但我通常不喜歡把我的代碼保留在一個狀態中,即使是那樣的錯誤也會踢這樣的錯誤......這就是說我迷失了方向......

回答

1

你不說,但是這聽起來像是被賦予了錯誤的線條狀

$fbHomeTown = $fb_result->hometown->name; 

時如hometown屬性不存在。

,以防止這種情況的通知(和你一定要爭取完全沒有錯誤的代碼)的方式是做這樣的事情:

$fbHomeTown = isset($fb_result->hometown->name) ? trim($fb_result->hometown->name) : null; 

此功能可設置臨時變量到已知的安全值(無論是修剪值或null)。然後,您可以檢查明確的情況下,沒有做

if($fbHomeTown === null) ... // 3 equal signs 

然而,在很多情況下(包括你)的使用,開始價值,你甚至不會需要「不存在」,並區分「這是一個空字符串」,你將能夠輕鬆地完成事情的處理類似

echo "<strong>First Name: </strong>". 
    (empty($fbFirstName) ? "Not found.<br />" : $fbFirstName); 
+1

所有雖然這並沒有完全幫助它確實提高了一點。我不確定發生了什麼事情,我不得不說,它絕對是一個獨特的情況。如果我檢查是空的,它包含的東西會回來,儘管有些東西,當有些東西不合法時,它會說有。它是一個巨大的思想****,現在我有其他的魚可以炒,所以它最終會成爲其中一個把它放在bug列表概念上,我得到它只是處理一個「錯誤」 「通知」的級別。 – chris