Yii - Как загрузить CSV для сохранения в базе данных?

У меня возникли проблемы с выяснением того, как читать загружаемый файл 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 ответов

Решение

Не забудьте проверить, успешно ли проверены ваши данные.

Вставьте этот код между вашими:

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

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

        $model->save();

Таким образом, вы можете увидеть, что происходит не так.

Я думаю, что вы пропустили имя файла, попробуйте $ _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 для справки.

$_FILES - это массив, который содержит ['element_name'] - массив. В вашем случае $_FILES - это массив $_FILES['csv_file']['name'], $_FILES['csv_file']['type'], $_FILES['csv_file']['error'], $_FILES['csv_file']['size'] и $_FILES['csv_file']['tmp_name'].

Так что для краткости; $_FILES['csv_file'] является массивом.

Вы снова и снова сохраняете один и тот же экземпляр модели... поэтому сохраняется только последняя строка... вам нужно будет создать новую модель для каждой строки, т.е. в цикле while добавьте $model = new Produtos;

Вам нужно инициализировать объект модели каждый раз, когда вам нужно вставить строку в таблицу. Код должен быть таким:

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);
    }

  }

Я знаю, что это старый пост, но я только что натолкнулся на это и просто хотел помочь кому-то, у кого может быть такая же проблема (ч / б проблема не с CSV или загрузкой файла)

Проблема в том, как Yii обрабатывает сохранение

Вам необходимо установить для атрибута isNewRecord значение true, а для первичного ключа - значение NULL объекта модели перед сохранением, чтобы каждый раз сохранять новую запись.

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

Вы должны сделать шаг выше, когда вы сохраняете строки в цикле.

$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);
Другие вопросы по тегам