我有一个数组,它是从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只从中获取值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
最后,我的数据库只在用户名栏中收到User1
,在推文列中收到Text of message
。没有任何内容插入到id或year中。虽然,它确实会在第一个推文之后为每个推文创建空行。不知道我做错了什么。任何帮助将不胜感激。谢谢!
答案 0 :(得分: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();