ForEach只执行一次任务


ForEach Only Performing Task Once

我有一个数组,它是从twitter API检索的一些数据的json_decode
以下是我使用的数组部分:

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只从中获取值User1Text 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列中只接收User1,在tweet列中接收Text of message。id或年份中不会插入任何内容。尽管如此,它确实为第一条推文之后的每条推文创建了空行。不确定我做错了什么。如有任何帮助,我们将不胜感激。谢谢

如果您还没有解决这个问题,下面是发生的事情:

foreach循环的第三行,您将替换$tweet的值,这就是为什么您在数据库中只看到第一个用户的usernametweet的原因。你没有得到"id"answers"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注入预防防御选项1:参数化查询"):

$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();