0

次の関数を使用して、Twitter API と PHP を使用して、ツイートを MySQL データベースに記録しています。

 function saveTweets($screen_name) {
global $link;

$screen_name = dbEscape(strtolower(trim($screen_name)));
if (!$screen_name) { echo "<p><strong>Error: No screen name declared.</strong></p>\n"; return false; }

$row = dbGetRow("SELECT `id` FROM `twitter` WHERE `screen_name`='$screen_name' ORDER BY `id` DESC LIMIT 1");
$last_id = $row['id'];


$url = "http://api.twitter.com/1/statuses/user_timeline.xml?screen_name=$screen_name&count=1500&include_rts=true" ;
if ($last_id) { $url .= "&since_id=$last_id" ; }
$ch = curl_init($url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, TRUE);
$xml = curl_exec ($ch);
curl_close ($ch);

$affected = 0;
$twelement = new SimpleXMLElement($xml);
foreach ($twelement->status as $status) {
    $text = dbEscape(trim($status->text));
    $time = strtotime($status->created_at);
    $id = $status->id;
    $retweet_count = $status->retweet_count;
 dbQuery("INSERT INTO `twitter`        (`id`,`screen_name`,`time`,`text`,`hidden`,`retweet_count`) VALUES     ('$id','$screen_name','$time','$text','n','$retweet_count') ON DUPLICATE KEY UPDATE $row[retweet_count] = VALUES('$retweet_count')");
    $affected = $affected + dbAffectedRows();
}

return "<p>".number_format($affected)." new tweets from $screen_name saved.</p>\n" ;
}

 echo saveTweets('Phil');
?>

これはすべて、ツイート、時間、投稿者をログに記録するために機能しますが、retweet_count は入力時にログに記録されますが、ツイートが書き込まれたときにログに記録すると、0 になる可能性があります。取得できません

 ON DUPLICATE KEY UPDATE $row[retweet_count] = VALUES('$retweet_count')"); 

後でクエリを実行すると、ツイートがリツイートされた場合に行が更新されるように機能します。

retweet_count のエントリの大部分は同じ (0 または 1) であるため、retweet_count を UNIQUE に設定することはできませんが、主キー (id) は一意である必要があり、自動インクリメント列 ID (colid) もありますが、そうではありません実際には twitter api からプルされるため、一意にすることができ、UNIQUE に設定されます。

すでにintを含む行を更新するためのより良い機能はありますか? ありがとう

4

1 に答える 1

1

構文が正しくありません。次のようにする必要があります。

ON DUPLICATE KEY UPDATE column_name = new_value, ...

あれは:

ON DUPLICATE KEY UPDATE `retweet_count` = '$retweet_count'

または、本当に関数を使用したいVALUES()場合(あなたのケースでは特に役に立たない - 実際には、単一のINSERTステートメントで複数の行を挿入する場合にのみ役に立ちます):

ON DUPLICATE KEY UPDATE `retweet_count` = VALUES(`retweet_count`)
于 2012-05-08T17:20:26.990 に答える