2012-05-08 7 views
0

をリツイ​​ートされた場合、私は次の関数を使用してTwitterのAPIとPHPを使用してMySQLデータベースにツイートをログに記録してきた:更新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-実際にTwitterのAPIから引き出されるわけではありませんので、ユニークでユニークに設定されています。

既にintを含む行を更新する機能がありますか?ありがとう

答えて

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`) 
+0

、私はそれはおそらく私の構文であることに同意し、かつ迅速ので、返信をお願い致しだろうが、unfo幸いにもそれらの提案はデータベースを更新しませんでした。 VALUES()関数は、私がここの別の記事で見つけた例に過ぎませんでした。 – Phil