2011-07-02 73 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