0

我有一个数组,它是从 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

最后,我的数据库仅User1在用户名列和Text of message推文列中接收。没有任何东西被插入到 id 或 year 中。虽然,它确实在第一条推文之后为每条推文创建了空行。不知道我做错了什么。任何帮助将不胜感激。谢谢!

4

1 回答 1

1

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

foreach循环的第三行,您将替换其值,$tweet这就是您只能在数据库中看到第一个用户username和的原因。tweet你没有得到 'id' 和 'year' 的原因是因为 aftertweet现在变成$tweet[$num]->text了 which 是一个字符串。

另一个问题是在您的$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();
于 2013-08-25T01:40:01.850 回答