2013-08-24 93 views
0

我有一個數組,它是從twitter API檢索的一些數據的json_decode。
這裏比我使用的陣列的部分:ForEach只執行一次任務

Array(
    [0]=>stdClass Object (
     [user] => stdClass Object (
      [screen_name] => User1 
     ) 
     [text] => Text of message 
     [id] => 220301332135952385 
     [created_at] => Tue Jul 03 23:41:45 +0000 2012 
    ) 

    [1]=>stdClass Object (
     [user] => stdClass Object (
      [screen_name] => User2 
     ) 
     [text] => Text of message 
     [id] => 220301332135952385 
     [created_at] => Tue Jul 03 23:41:45 +0000 2012 
    ) 
) 

我遇到的問題是,我的PHP是隻得到了價值User1並從中Text of message。我的實際數組更長,但它遵循上述模式。
這是我的PHP:

foreach($tweet as $num => $val) { 
    $username = $tweet[$num]->user->screen_name; 
    echo $num . "-USER-" . $username . "-NAME "; 
    $tweet = $tweet[$num]->text; 
    $id = $tweet[$num]->id_str; 
    $year = substr($tweet[$num]->created_at, -4); 

    $statement = $connect->prepare("INSERT INTO table (username, tweet, id, year) VALUES ('$username', '$tweet', '$id', '$year')"); 
    $statement->execute(); 
} 

$tweet是我的數組。那裏有我正在用來調試的東西echo。它輸出:

1-USER-User1-NAME 2-USER--NAME 3-USER--NAME 

我期待:

1-USER-User1-NAME 2-USER-User2-NAME 

最後,我的數據庫只有在鳴叫列接收username列User1Text of message。沒有任何內容插入到id或年份中。儘管它在第一個推文之後爲每條推文創建了空行。不知道我做錯了什麼。任何幫助將不勝感激。謝謝!

+0

試調試,刪除所有什麼是你的foreach循環,並測試print_r($鳴叫) –

+0

@FaceOfJock這foreach是另一個foreach。我在第一個foreach中有一個print_r。 – MOOcow102

+0

我之所以這麼說,是因爲你的$ tweet的大小是3,而你僅用2個對象顯示了你的數組,所以可能你在第二個foreach中有錯誤,嘗試添加另一個print_r並顯示結果 –

回答

1

如果您還沒有解決這個問題,在這裏發生的事情:

在第三行中的foreach環要更換的$tweet值這就是爲什麼你只看到第一個用戶username的原因和tweet在數據庫中。你沒有'id'和'year'的原因是因爲在tweet現在變成$tweet[$num]->text這是一個字符串。

另一個問題是在您的$id = $tweet[$num]->id_str。由於上述原因,這不起作用,但是一旦你解決了上述問題,你的$id仍然是空的。

嘗試以下操作:

foreach($tweet as $num => $val) { 
    $username = $tweet[$num]->user->screen_name; 
    echo $num . "-USER-" . $username . "-NAME "; 
    $user_tweet = $tweet[$num]->text; // Use $user_tweet = ... instead of $tweet = ... 
    $id = $tweet[$num]->id; // Replace $id_str with $id 
    $year = substr($tweet[$num]->created_at, -4); 

    $statement = $connect->prepare("INSERT INTO table (username, tweet, id, year) VALUES ('$username', '$user_tweet', '$id', '$year')"); 
    $statement->execute(); 
} 

我不知道爲什麼你選擇使用$tweet[$num],而不是$val

還利用準備好的發言是最充分的在你的代碼,建議使用準備好的參數化查詢如下(這裏是爲什麼「SQL Injection Prevention-Defense Option 1: Parameterized Queries」):

$statement = $connect->prepare("INSERT INTO table (username, tweet, id, year) VALUES (:username, :user_tweet, :id, :year)"); 
$statement->bindParam(':username', $username); 
$statement->bindParam(':user_tweet', $user_tweet); 
$statement->bindParam(':id', $id); 
$statement->bindParam(':year', $year); 
$statement->execute(); 
+0

啊,謝謝。沒有發現我使用$ tweet作爲變量兩次。 謝謝! – MOOcow102