Я хочу добавить содержимое файла CSV в базу данных, и это не работает - PullRequest
0 голосов
/ 01 января 2019

Я хочу, чтобы администратор сайта выбирал файл 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

Эта функция предупреждает меня о временном интервале

И, наконец, часть кода вида, где администратор должен выбрать файл 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:

Я хочу посмотреть, как я могу улучшить свой код или как это сделать проще.

1 Ответ

0 голосов
/ 02 января 2019

Для меня я не использую сторонние библиотеки для работы с относительно простыми файлами, такими как 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 без проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...