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... пожалуйста, помогите!

Любая помощь будет очень признательна.

Спасибо

Author: Davidslv, 2011-10-25

7 answers

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

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

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

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

        $model->save();

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

 1
Author: Alexey Morozov, 2012-04-08 16:30:56

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

 3
Author: nimmen, 2011-10-25 11:45:16

$_FILES - это массив, который содержит ['имя_элемента']-массив. В вашем случае $_FILES - это массив $_FILES['csv_file']['имя'], $_FILES['csv_file']['тип'], $_FILES['csv_file']['ошибка'], $_FILES['csv_file']['размер'] и $_FILES['csv_file']['имя tmp_name'].

Итак, для краткости; $_FILES['csv_file'] - это массив.

 1
Author: budwiser, 2011-10-25 11:47:07

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

 1
Author: Mukesh Soni, 2012-01-17 12:34:22

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

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
Author: Anil Dhiman, 2015-02-03 02:28:39

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

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

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

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

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

 0
Author: Shahzad Malik, 2013-04-11 14:27:48
$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);
 -1
Author: Muhammad Hasnain, 2015-01-16 10:30:56