2013-08-24 95 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