我遇到了一些麻烦,弄清楚如何阅读我上传的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中的最后一行...请一些帮助!
任何帮助都将非常感激。
谢谢
答案 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);