2011-07-02 106 views
3

我正在研究激活新成員的方法。我得到以下錯誤:將數組數據分配給Yii中的模型屬性

未定義偏移:1

在其上包含了以下的線發生該錯誤:

$模型 - >用戶名= $數據[1];

有沒有Yii的方法使這項工作更好?

我是一個php,oop和Yii的新手,所以任何協助將不勝感激!

該方法基本上接受來自用戶的獲取請求。 get運行此方法幷包含用於驗證其帳戶的密鑰。驗證存儲在與密鑰名稱相同的文件中。文件內部是一個管道分隔線,其中包含日期,用戶名,電子郵件,鹽和密碼哈希。讀取文件並在管道中分解數據後,我需要將數據分配給模型,然後將其保存到數據庫。

... 

     $model=new Users; 

     $model->activation_key=$_GET['key']; 

     $path_to_validation_files = Yii::app()->basePath."/data/new_member_validations"; 
     $validation_file = $path_to_validation_files . "/".$model->activation_key.".dat"; 

     if(is_readable($validation_file) && !empty($validation_file)) 
     { 
      if($fp = fopen($validation_file, 'r')) 
      { 
       while(!feof($fp)) 
       { 
        $line = fread($fp, filesize($validation_file)); 
       } 
       fclose($fp); 
       $data = explode('|', $line); 

       if(!empty($data)){ 
        $model->username=$data[1]; 
        $model->email=$data[2]; 
        $model->salt=$data[3]; 
        $model->password=$data[4]; 
       } else { 
        throw new CHttpException(500,'Validation file contained no data.'); 
       } 

      } else { 
       throw new CHttpException(500,'Cannot open validation file.'); 
      } 
     } else { 
      throw new CHttpException(404,'Validation file not found, not readable, or empty.'); 
     } 


... 
+0

您確定您確實從$ line中的文件中獲得了該行嗎?你可以在fclose($ fp)之後用if(empty($ line))死掉('not getting line')來檢查它。這只是爲了確保,因爲$ line似乎有問題。此外,while循環是多餘的,因爲fread將讀取與指定的字節數相同的數量,即整個文件。 – Abhijit

+0

'print_r($ data)'的輸出是什麼?你確定在第二個陣列位置總是有東西嗎? – ldg

+0

@ldg - print_r是數組([0] =>),它解釋了錯誤,但爲什麼它是空白的另一個問題:) – Mark

回答

5

可以使用CActiveRecord類的attributes屬性加載關聯數組。

例如,假設你有一個特性foobar一個模型,你有一個數組data('foo'=>1, 'bar'=2)

您可以設置$myModel->attributes = data,它會通過數組循環和分配屬性模型(但只如果這些屬性有驗證規則)

+0

+1,謝謝。希望你可以做$ model = new MyModel($ dataArray); –

+0

我相信這似乎不工作,而不是一個數組,但你有一個數組數組雖然。 – MEM

+0

我只是想知道Yii如何執行此操作!特別是在Yii2中,'$ model-> attributes = $ _POST ['Formname']'會用數據填充相應的模型屬性?你知道幕後發生了什麼嗎?我的意思是如何將數組中的所有數據加載到相應的屬性中? –

0

我有一個類似的問題,尤其是當使用數組數組。這是我解決它的方式。

public function epidemicSelectInsertParticipant($class){ 
    $data= Participant::findAll(['class'=>$class]); 
    if($data){ 
     foreach ($data as $value) { 
      $model = new Epidemicparticipant; 
      foreach ($value as $key => $val) { 
       if($key=='id'){ 

       }else{ 
         $model->$key = $val; 
       } 
      } 
      $model->save(false); 
     } 
     return TRUE; 
    } else { 
     return false; 
    } 
} 

在我的情況,$data是一個多維array.They鍵$value($鍵)是一樣的$model->attributes