4

アップロードした 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 の最後の行を保存するだけです...助けてください!

どんな助けでも本当に感謝します。

ありがとうございました

4

7 に答える 7

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を確認してください。

于 2011-10-25T11:45:16.577 に答える
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);
    }

  }
于 2013-10-17T09:31:43.633 に答える
1

$_FILES は ['element_name']-array を含む配列です。あなたの場合、 $_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'] は配列です。

于 2011-10-25T11:47:07.780 に答える
1

データが正常に検証されたかどうかを確認することを忘れないでください。

このコードをあなたのものの間に挿入してください:

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

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

        $model->save();

だから、何がうまくいかないかを見ることができます。

于 2011-10-26T14:30:53.180 に答える
1

同じモデルインスタンスを何度も保存しています...そのため、最後の行のみが保存されます...行ごとに新しいモデルを作成する必要があります。つまり、whileループで、追加します $model = new Produtos;

于 2012-01-17T12:34:22.063 に答える
0

これが古い投稿であることは知っていますが、これに出くわしたばかりで、同じ問題を抱えている可能性のある人を助けたかっただけです(白黒の問題はCSVまたはファイルのアップロードではありません)

問題は、Yii が保存を処理する方法にあります

毎回新しいレコードを保存するには、保存する前に isNewRecord 属性を true に設定し、モデル オブジェクトの主キーを NULL に設定する必要があります。

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

ループで行を保存するときは常に、上記の手順を実行する必要があります。

于 2013-04-11T14:27:48.653 に答える