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