2013-07-10 89 views
1

我想更新我的表中的值,如果這些值以前沒有插入。這裏是我的代碼 -更新如果沒有插入yii

function save_data($date, $game, $score) { 
    $criteria = new CDbCriteria; 
    $criteria->addCondition("date = '{$date}'"); 
    $data = array("date" => $date, 
     "game" => $game, 
     "score" => $score); 
    $game_report = new GameReport(); 
    $game_report->attributes = $data; 
    $game_report->save(); 
} 

但它繼續插入重複值,即使我提供了日期條件。爲什麼?我如何更新並且不插入重複值?

回答

4

爲了進行更新,您需要在已經加載的數據庫模型上進行更新。 在你的情況下,這是可以做到:

function save_data($date, $game, $score) { 
    $criteria = new CDbCriteria; 
    $criteria->addCondition("date = '{$date}'"); 

    $data = array(
     "date" => $date, 
     "game" => $game, 
     "score" => $score 
    ); 

    $game_report = GameReport::model()->findByAttributes($data); 
    if (empty($game_report)) { 
     $game_report = new GameReport(); 
    } 
    $game_report->attributes = $data; 
    $game_report->save(); 
} 

此外,爲避免SQL注入,我們應該綁定你的病情PARAMS這樣的:

$criteria->addCondition("date = :d"); 
$criteria->params[':d'] = $date; 

或者乾脆:

$criteria->compare('date', $date); 
+1

笑,毆打你10秒鐘:) –

+1

是啊,我看到剛按下提交按鈕後:D – Twisted1919

+0

嘿謝謝你的答案,這將停止插入重複值,但它不會更新值。例如,當分數的值發生變化時,它不會更新。 – user2510555

2

這是怎麼了,我一般這樣做:

$myModel = myModel::model()->findByAttributes(array('atr1'=>$atr1, 'atr2'=>$atr2)); 
if($myModel == null){ 
//create and save new reccord 
} 

我不知道這是否是做的最好的辦法,或者如果Yii有這樣做的更好的方式,但它的工作原理。