今天做了一個抓取一組數據,批量存入數據庫的實例。
開始的想法:
把數據抓過來,再循環存入數據庫中,但發現一個問題,有時候遠程頁面數據更新了,這樣可以要增加新的數據,也可以要刪除不要數據,還有可以只更新。
針對這三種情況分別做了下面的設計(下面只是幾個核心的對象,不是完整的代碼,如果需要完整代碼請留言)
public function save_array($array)
{
//獲取數組中數據的條數
$tmp_array = array();
$tmp_array_2 = array(); //數據存儲數組
$oj = M("oj_question");
$sql_url = $oj->getField('id,url'); //數組的鍵名是ID,值是URL,這樣下面的操作就方便了
$sql_url_num = count($sql_url);
$num = count($array);
if($sql_url_num > $num)
{
$this->delete_question($num,$sql_url_num);
foreach($sql_url as $key => $value )
{
array_push($tmp_array,$array[$key-1]); //將改變了數據存儲到過渡數組中
$this->update_question($tmp_array);
}
}
else if($sql_url_num == $num)
{
foreach($sql_url as $key => $value )
{
if( $value[$key-1] != $array[$key-1] )
{
// $value[$key] = $array[$key];
array_push($tmp_array,$array[$key-1]);
}
else
{
array_push($tmp_array,$value[$key]);
}
}
dump($tmp_array);
$this->update_question($tmp_array);
}
else{
//表示有數據要添加
$more = $num - $sql_url_num;
//更新已經有的數據
foreach($sql_url as $key => $value )
{
if( $value[$key-1] != $array[$key-1] )
{
// $value[$key] = $array[$key];
array_push($tmp_array,$array[$key-1]);
}
else
{
array_push($tmp_array,$value[$key-1]);
}
}
$this->update_question($tmp_array);
//添加新加的數據
for($i=$sql_url_num+1;$i<$num;$i++)
{
array_push($tmp_array_2,$array[$i]);
}
$this->add_question($tmp_array_2,$sql_url_num);
}
}
上面只是分類處理跟著情況,還沒有跟數據庫管理清理
下面是更新數據的代碼
//更新數據庫
public function update_question($tmp_array)
{
$url = 'http://openoj.awaysoft.com/JudgeOnline/';
$oj = M("oj_question");
foreach($tmp_array as $key => $value)
{
$data["url"] = $url.$value;
$data["time"] = time();
$oj->where("id=".$key)->data($data)->save();
}
}
刪除數據裡多余數據的代碼
//刪除多余數據並優化數據
public function delete_question($start,$end)
{
$oj = M("oj_question");
for($i=$start;$i<=$end;$i++)
{
$oj->where("id=".$i)->delete();
}
}
PS: 刪除數據後,MYSQL裡面會有殘留的字節,但是數據庫優化還不會,先留下這個問題,以後再解決。
新曾數據
//新增數據
public function add_question($array,$num=NULL)
{ //參數設計是因為項目需要,$NUM參數的默認值是空。
$oj = M("oj_question");
$url = 'http://openoj.awaysoft.com/JudgeOnline/';
foreach($array as $key => $value)
{
$num = $num + $key;
$data["url"] = $url.$value;
$data["name"] = "promble".$num;
$data["time"] = time();
$oj->add($data);
}
}
思想很簡單,實現很蛋疼。做了一天,開始就這數據批量存儲老存問題。後來發現是代碼寫的不夠細致,照成了一些不必要的BUG.
PS: 把問題都思考到位,是寫好代碼的不二法門。