Yii - 如何上传csv以保存在数据库中?

时间:2011-10-25 11:24:55

标签: php csv yii fgetcsv

我遇到了一些麻烦,弄清楚如何阅读我上传的CSV文件,可能我在控制器代码中遗漏了一些内容。

  public function actionImport() {
    $model = new Produtos;
    $this->render('import', array('model' => $model) );

    if( isset($_FILES['csv_file']) ) {

      $handle = fopen($_FILES['csv_file']['tmp_name'], 'r');

      if ($handle) {
        while( ($line = fgetcsv($handle, 1000, ";")) != FALSE) {
            $model->codigo          = $line[0];
            $model->nome            = $line[1];
            $model->descricao       = $line[2];
            $model->stock           = $line[3];
            $model->data_reposicao  = $line[4];

            $model->save();
        }        
      }
      fclose($handle);
    }

  }

这只是保存了我在CSV中的最后一行...请一些帮助!

任何帮助都将非常感激。

谢谢

7 个答案:

答案 0 :(得分:3)

我想你错过了文件名,试试$ _FILES ['csv_file'] ['tmp_name'] http://php.net/manual/en/features.file-upload.post-method.php以供参考。 Yii也提供文件处理,请查看http://www.yiiframework.com/doc/api/1.1/CUploadedFile以供参考

答案 1 :(得分:1)

$ _ FILES是一个数组,其中包含['element_name'] - 数组。在你的情况下,$ _FILES是一个$ _FILES ['csv_file'] ['name']数组,$ _FILES ['csv_file'] ['type'],$ _FILES ['csv_file'] ['错误'],$ _FILES ['csv_file'] ['size']和$ _FILES ['csv_file'] ['tmp_name']。

简而言之; $ _FILES ['csv_file']是一个数组。

答案 2 :(得分:1)

不要忘记检查您的数据是否成功验证。

在您的代码之间插入此代码:

        $model->data_reposicao  = $line[4];

        if (!$model->validate())
            throw new Exception("Validation failed.");

        $model->save();

所以你可以看到出了什么问题。

答案 3 :(得分:1)

你一次又一次地保存同一个模型实例......这就是为什么只保存最后一行...你必须为每一行创建一个新模型,即在你的while循环中添加{{1 }}

答案 4 :(得分:1)

每次需要将行插入表格时,都需要初始化模型对象。代码应该是:

public function actionImport() {
    $model = new Produtos;
    $this->render('import', array('model' => $model) );

    if( isset($_FILES['csv_file']) ) {

      $handle = fopen($_FILES['csv_file']['tmp_name'], 'r');

      if ($handle) {
        while( ($line = fgetcsv($handle, 1000, ";")) != FALSE) {
            $modeln = new Produtos;
            $modeln->codigo          = $line[0];
            $modeln->nome            = $line[1];
            $modeln->descricao       = $line[2];
            $modeln->stock           = $line[3];
            $modeln->data_reposicao  = $line[4];

            $modeln->save();
        }        
      }
      fclose($handle);
    }

  }

答案 5 :(得分:0)

我知道这是一篇旧帖子,但我刚刚遇到过这个问题,只是想帮助那些可能遇到同样问题的人(b / w问题不是用CSV或文件上传)

问题在于Yii如何处理保存

在保存每次保存新记录之前,您需要将isNewRecord属性设置为true,将主键设置为模型对象的NULL。

$model->PRIMARYKEYCOLUMN = NULL; //Replace PRIMARYKEYCOLUMN with the name of column
$model->isNewRecord = true;
$model->save();

无论何时在循环中保存行,都需要执行上述步骤。

答案 6 :(得分:-1)

$handle = fopen($_FILES['Userimportcsv']['tmp_name']['csv_file'], 'r');
if($handle) {                        
    $row = 1;
    while( ($line = fgetcsv($handle, 1000, ",")) != FALSE) {
        if($row>1) {    
          $newModel = new Countries;
          $newModel->countryName       = $line[0];
          $newModel->status            = $line[1];
          $newModel->save();
        } 
        $row++;                     
    }                       
}
fclose($handle);