2012-05-08 76 views
0

我一直在使用Twitter的API登錄鳴叫到MySQL數據庫和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中拉出來的,所以它可以是唯一的,並且被設置爲唯一的。

是否有更好的函數來更新已經包含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