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

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

3 голосов
/ 25 октября 2011

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

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

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

  }
1 голос
/ 17 января 2012

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

1 голос
/ 26 октября 2011

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

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

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

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

        $model->save();

, чтобы вы могли видеть, что идет не так.

1 голос
/ 25 октября 2011

$ _ 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'] - это массив.

0 голосов
/ 16 января 2015
$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);
0 голосов
/ 11 апреля 2013

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

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

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

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

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

...