【问题标题】:I want to add a csv file content into the database and it's not working我想将 csv 文件内容添加到数据库中,但它不起作用
【发布时间】:2019-01-01 19:46:39
【问题描述】:

我希望网站管理员选择带有文件输入的 CSV 文件。包含用户的 CSV 文件,然后使用随机生成的密码插入数据库。对于插入数据库的每个用户,用户将收到一封邮件,其中包含他们的登录名(即他们的电子邮件)和密码。

我尝试使用库在数组中获取 CSV 内容,但我没有设法使其工作。

这是控制器中读取 CSV 文件的函数

public function lire_csv()
    {
         $this->load->library('Csvimport');
         $file_data = $this->Csvimport->get_array($_FILES["csv_file"]["liste_etu"]);
         foreach($file_data as $row)
         {
             $data[] = array(

                'nom' => $row["Nom"],
                'prenom' => $row["Prenom"],
                'statut'=> "Etudiant",
                'civilite' => $row["Civilite"],             
                'mail' => $row["Email"],
                'adresse' => $row["Adresse"],
                'complement' => $row["Complement"],
                'code_postal' => $row["Code_postal"],
                'ville' => $row["Ville"],
                'pays' =>$row["Pays"],
                'tel' => $row["Telephone"],
                'date_naiss' => $row["Date_de_naissance"],
                'num_secu' => $row["Numero_secu"],
                'mutuelle' => $row["Mutuelle"],
                'objectif_pro' => $row["Objectif_pro"],
                'motdepasse' => uniqid()    
             );
             $this->envoyer_mail($data['mail'],$data['motdepasse'],$data['nom'],$data['prenom']);
         }
         $this->mStages->create_utilisateur($data);

    }

这是我使用的库CSV Import

这个函数给我关于时间设置的警告

最后是管理员必须选择 CSV 文件的视图代码部分。有一个奇怪的行为,因为只有应该打开文件资源管理器的按钮周围的矩形有效,但按钮本身什么也不做。

<form action=<?php echo base_url('index.php/main_stage/lire_csv'); ?> method="post">

                 <center><input type="file" name="fichier" id="csv_file" required accept=".csv"/></center> <p>Fichier .csv uniquement</p>

                 <input type="submit" value="Envoyer la liste">

当我尝试发送 CSV 时出现以下错误:

A PHP Error was encountered

Severity: Notice

Message: Undefined property: Main_stage::$Csvimport

Filename: controllers/main_stage.php

Line Number: 507

Backtrace:

File: D:\boulot\php\UwAmp\www\Projet_PHP\CodeIgniter-3.1.9\application\controllers\main_stage.php
Line: 507
Function: _error_handler

File: D:\boulot\php\UwAmp\www\Projet_PHP\CodeIgniter-3.1.9\index.php
Line: 315
Function: require_once

( ! ) Fatal error: Call to a member function get_array() on null in      D:\boulot\php\UwAmp\www\Projet_PHP\CodeIgniter-3.1.9\application\controllers\main_stage.php on line 507
Call Stack
#   Time    Memory  Function    Location
1   0.0149  150416  {main}( )   ...\index.php:0
2   0.0281  197248  require_once( 'D:\boulot\php\UwAmp\www\Projet_PHP\CodeIgniter-3.1.9\system\core\CodeIgniter.php' )  ...\index.php:315
3   0.3565  2069632 call_user_func_array:{D:\boulot\php\UwAmp\www\Projet_PHP\CodeIgniter-3.1.9\system\core\CodeIgniter.php:532} ( ) ...\CodeIgniter.php:532
4   0.3565  2069832 Main_stage->lire_csv( ) ...\CodeIgniter.php:532
A PHP Error was encountered

Severity: Error

Message: Call to a member function get_array() on null

Filename: controllers/main_stage.php

Line Number: 507

Backtrace:

我想看看如何改进我的代码或更简单的方法来做到这一点。

【问题讨论】:

  • 文档中有一个非常重要的部分 - 加载后,您可以使用小写版本访问您的类 - 看看这里 - codeigniter.com/user_guide/general/… - 这意味着的$this-&gt;Csvimport 使用$this-&gt;csvimport

标签: php codeigniter csv


【解决方案1】:

对我来说,我不使用第三方库来处理像csv 这样相对简单的文件,因为您已经可以在一行代码中读取它并将其转换为这样的数组:

$csv = array_map('str_getcsv', file('book.csv'));

然后我们将创建一个关联数组,其中第一行列标题作为键,如下所示:

array_walk($csv, function(&$a) use ($csv) {
    $a = array_combine($csv[0], $a);
});

如果您愿意,您可以删除列标题并保留它:

$header = array_shift($csv);

然后你可以像这样为每个用户添加你的随机密码:

foreach ($csv as $key => $value) 
{
    $csv[$key]['password'] = 'random_password';
}

这将生成一个像这样的数组:

[0]=>
array(3) {
    ["username"]=>
        string(6) "sherif"
    ["email"]=>
        string(15) "sherif@code.com"
    ["password"]=>
        string(15) "random_password"
}
...

然后继续施展你的魔法,向这个数组中的每个用户发送电子邮件,使用 insert_batch 或任何你想做的事情将其保存到你的数据库中。

关于您的另一个html/css 问题,请尝试提出另一个单独的问题。


最终版本:

$csv = array_map('str_getcsv', file('book.csv'));

array_walk($csv, function(&$a) use ($csv) {
    $a = array_combine($csv[0], $a);
});

$header = array_shift($csv);

foreach ($csv as $key => $value) 
{
    $csv[$key]['password'] = 'random_password';
}

编辑:如果你想读取上传的文件,你有两个选择,第一个是直接从 tmp 读取它,如下所示:

$csv = array_map('str_getcsv', file($_FILES['uploadedfile']['tmp_name']));

或者你可以先保存文件,然后读取前面提到的路径。

关于它是否适用于任何 csv 文件,是的,它应该适用于任何有效的 csv 文件而不会出现问题。

【讨论】:

  • 感谢您给我一个解决方案我试试这个,但我在函数文件('book.csv')中有一个问题,你输入了 csv 文件的路径?因为我想放管理员选择的文件的路径
  • 另外,如果我理解得很好,我得到的数组对应于 csv 文件行,所以它适用于任何 csv 文件?
  • @Misteronsépatro .. 别担心,我自己测试过它会起作用。
  • 我尝试使用该文件,但出现错误未定义索引:上传文件
  • 我想像你说的那样直接读取文件,但我不明白那些错误
猜你喜欢
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
  • 2023-01-23
  • 2020-10-30
  • 2018-01-17
  • 1970-01-01
  • 2022-06-26
  • 1970-01-01
相关资源
最近更新 更多