4 votes

Yii - Comment charger un csv pour le sauvegarder dans la base de données ?

Je n'arrive pas à comprendre comment lire le fichier CSV que j'ai téléchargé, il me manque probablement quelque chose dans le code de mon contrôleur.

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

  }

Cela ne me permet d'enregistrer que la dernière ligne du fichier CSV... Un peu d'aide, s'il vous plaît !

Toute aide sera très appréciée.

Merci de votre attention.

3voto

denys Points 731

Je pense que vous avez oublié le nom du fichier, essayez $_FILES['csv_file']['tmp_name']. http://php.net/manual/en/features.file-upload.post-method.php pour référence. Yii permet également de gérer les fichiers, vérifiez http://www.yiiframework.com/doc/api/1.1/CUploadedFile pour référence

1voto

budwiser Points 1455

$_FILES est un tableau qui contient ['element_name']-tableau. Dans votre cas, $_FILES est un tableau composé de $_FILES['csv_file']['name'], $_FILES['csv_file']['type'], $_FILES['csv_file']['error'], $_FILES['csv_file']['size'] et $_FILES['csv_file']['tmp_name'].

En bref, $_FILES['csv_file'] est un tableau.

1voto

Alexey Morozov Points 1069

N'oubliez pas de vérifier si vos données ont été validées avec succès ou non.

Insérez ce code entre les vôtres :

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

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

        $model->save();

Vous pouvez ainsi voir ce qui ne va pas.

1voto

Mukesh Soni Points 2747

Vous sauvegardez la même instance de modèle encore et encore... c'est pourquoi seule la dernière ligne est sauvegardée... vous devrez créer un nouveau modèle pour chaque ligne, c'est-à-dire que dans votre boucle while, ajoutez $model = new Produtos;

1voto

Anil Kumar Points 571

Vous devez initialiser votre objet modèle à chaque fois que vous devez insérer une ligne dans un tableau. Le code devrait ressembler à ceci :

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

  }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X