PHP, как я могу вставить свой файл CSV в мою базу данных - PullRequest
0 голосов
/ 30 ноября 2018

Привет. Я пытаюсь сделать так, чтобы, когда я добавляю новый csvfile в свою папку, он был вставлен в мою базу данных, но я понятия не имею, как это сделать.Вот пример моего CSV-файла https://i.gyazo.com/5f97c964c12f9f38fe4f6fbc901158a8.png

Сначала я покажу свой класс DB.php, который я буду использовать для выполнения своих данных.

Я знаю, что естьпоказано 2 таблицы в этом коде, что для тестирования я получаю правильные данные

<code><?php

class DB extends \PDO
{
    /**
     * @var
     */
    private $host;
    /**
     * @var
     */
    private $user;
    /**
     * @var
     */
    private $pass;
    /**
     * @var PDO
     */
    private $conn;
    /**
     * @var
     */
    private $query;
    /**
     * @var bool
     */
    private $debug = false;


    /**
     * @param bool $bool
     */
    public function debug($bool = true)
    {
        $this->debug = $bool;
    }

    /**
     * @param $sql
     */
    private function setQuery($sql)
    {
        $this->query = $this->prepare($sql);
    }

    /**
     * DB constructor.
     * @param $dbhost
     * @param $dbuser
     * @param $dbpass
     * @param array $options
     */
    public function __construct($dbhost, $dbuser, $dbpass, $options = [])
    {
        try {
            $this->conn = parent::__construct($dbhost, $dbuser, $dbpass, $options);
        } catch (\PDOException $e) {
            print "Fejl!: " . $e->getMessage() . "<br/>";
            die();
        }

    }


    /**
     * @param string $sql
     * @param bool $params
     * @param int|mixed|null $returnType
     * @return mixed
     */
    public function query($sql, $params = false, $returnType = \PDO::FETCH_OBJ)
    {
        $this->setQuery($sql);
        $this->execute($params);
        $this->count = $this->query->rowCount();

        return $this->query->fetchAll($returnType);
    }

    /**
     * @param $params
     */
    private function execute($params)
    {
        if($params){
            $this->query->execute($params);
        } else {
            $this->query->execute();
        }
        if($this->debug){
            echo '<pre id="debug_params">',$this->query->debugDumpParams(),'
';}} / ** * @param $ sql * @param bool $ params * @return mixed * / открытая функция single ($ sql, $ params = false) {$ data = $ this-> запрос ($ sql, $ params);if (sizeof ($ data) === 1) {return $ data [0];} else {return false;}} / ** * @param $ sql * @param bool $ params * @return mixed * / сначала открытая функция ($ sql, $ params = false) {запрос возврата $ this-> ($ sql, $ params) [0];} / ** * @param $ sql * @param bool $ params * @return mixed * / открытая функция last ($ sql, $ params = false) {вернуть запрос $ this-> ($ sql, $ params) [$ this-> количество - 1];} / ** * @param $ sql * @param bool $ params * @return mixed * / открытая функция toList ($ sql, $ params = false) {return $ this-> query ($ sql, $ params);} / ** * @param $ sql * @param bool $ params * @return mixed * / открытая функция lastId ($ sql, $ params = false) {$ this-> query ($ sql, $ params);return $ this-> lastInsertId ();}}

А это мой csvtable.php мой индексный файл, это то, что увидит пользователь.

<?php
if ($user->is_loggedin() == true) {

// File selector
    $path = "./assets/csv"; 

    $latest_ctime = 0;
    $latest_filename = '';    

    $d = dir($path);
    while (false !== ($entry = $d->read())) {
    $filepath = "{$path}/{$entry}";
    // could do also other checks than just checking whether the entry is a file
        if (is_file($filepath) && filectime($filepath) > $latest_ctime){
            $latest_ctime = filectime($filepath);
            $latest_filename = $entry;
        }
    }

// File selector end

    echo'<h1 class="text-center">CSV Table</h1>';
    echo'<h6 class="text-center">'.$latest_filename.'</h6>';
    echo '<table class=" table table-striped table-bordered table-hover" style="width:100%">';
    echo'<tbody>';

    $f = fopen("$path/$latest_filename", "r");

    while (($row = fgetcsv($f, 1000, ";")) !== false) {
        //Create table using the filename as tablename, if table already exist insert data.
        $csv->createCsvTable($row);

            echo '<tr>';
            foreach ($row as $cell) {
                echo '<td>' .htmlspecialchars($cell, ENT_COMPAT). '</td>';

            }
            echo '</tr>';
    }
    fclose($f);
    echo'</tbody>';
    echo '</table>';


//csv table end
    ?><table id="example" class="table-hover  table table-striped table-bordered" style="width:100%">
    <thead>
        <tr>
            <th scope="col">Name</th>
            <th scope="col">Datum</th>
            <th scope="col">Property</th>
            <th scope="col">Criterion</th>
            <th scope="col">Type</th>
            <th scope="col">Nominal</th>
            <th scope="col">Actual</th>            
            <th scope="col">Tol-</th>                
            <th scope="col">Tol+</th>
            <th scope="col">Dev</th>
        </tr>
    </thead>
    <tbody>
        <?php foreach($csv->getCsv() as $csv) { ?>
            <tr>
                <td><?= $csv->Name; ?></td>
                <td><?= $csv->Datum; ?></td>
                <td><?= $csv->Property; ?></td>
                <td><?= $csv->Criterion; ?></td>
                <td><?= $csv->Type; ?></td>
                <td><?= $csv->Nominal; ?></td>
                <td><?= $csv->Actual; ?></td>
                <td><?= $csv->Tolminus; ?></td>
                <td><?= $csv->Tolplus; ?></td>
                <td><?= $csv->Dev; ?></td>
            </tr>
        <?php }?>
    </tbody>

</table>
 <?php }

А вот мой класс CSV, в котором у меня нетПонять, как написать createCsvTable Что я хочу сделать, это вставить данные CSV-файлов в созданную мной таблицу.

<?php

class Csv extends \PDO {

private $db = null;



/**
 * Settings constructor.
 */
public function __construct($db)
{
    $this->db = $db;
}

/**
 * Menu & Admin Menu
 * @return mixed
 */

public function getCsv()
{
    return $this->db->toList("SELECT * FROM Test");
}

   public function createCsvTable()
    {
        return $this->db->toList("CREATE TABLE IF NOT EXISTS Test(
            id int (11),
            Name VARCHAR(30), 
            Datum VARCHAR(30), 
            Property VARCHAR(30), 
            Criterion VARCHAR(30), 
            Type VARCHAR(30), 
            Nominal DECIMAL(10,2), 
            Actual DECIMAL(10,2), 
            Tolminus DECIMAL(10,2), 
            Tolplus DECIMAL(10,2), 
            Dev DECIMAL(10,2)
          );
          /* INSERT QUERY */
          INSERT INTO Testeses(
            id, Name, Datum, Property, Criterion, Type, 
            Nominal, Actual, Tolminus, Tolplus, Dev
          ) 
          VALUES 
            (
              ?,?,?,?,?,?, 
              ?,?,?,?,?
            );");
    }
}

Я знаю, что если я заменю?с некоторыми фактическими данными он будет вставлен, но мне нужно, чтобы он был из файла CSV.это главная проблема

Так что для ясности, мой вопрос: «Как я могу вставить данные из моего CSV-файла в мою базу данных?»

также, если вызнаю, как назвать таблицу после имени файла, я был бы всегда благодарен.

Ответы [ 3 ]

0 голосов
/ 30 ноября 2018

Я выкладываю решение ниже.Возможно, прочитайте это, чтобы узнать о PDO и PreparedStatements, чтобы понять, как связать их со столбцами.Вам нужно изменить методы выполнения и подготовить для вас объект pdo, потому что я не знаю, как вам удалось там выполнить операторы.

public function createCsvTable($file_name, $lines)
    {
        $tableCreation = "CREATE TABLE IF NOT EXISTS " . $file_name . "(
            id int (11),
            Name VARCHAR(30), 
            Datum VARCHAR(30), 
            Property VARCHAR(30), 
            Criterion VARCHAR(30), 
            Type VARCHAR(30), 
            Nominal DECIMAL(10,2), 
            Actual DECIMAL(10,2), 
            Tolminus DECIMAL(10,2), 
            Tolplus DECIMAL(10,2), 
            Dev DECIMAL(10,2)
          );";
          $stmt = execute($tableCreation);

          $insertion = "INSERT INTO " . $file_name . "(
            id, Name, Datum, Property, Criterion, Type, 
            Nominal, Actual, Tolminus, Tolplus, Dev
          ) 
          VALUES 
            (
              ?,?,?,?,?,?, 
              ?,?,?,?,?
            );");
         $stmt = prepare($insertion);
         foreach ($lines as $line) {
             $stmt->bindParam(1, $line[0]);
             // do for every parameter
             $stmt->execute();
         }

    }
0 голосов
/ 11 декабря 2018

После некоторого тестирования и царапин на голове я нашел несколько хорошее решение.

  1. просматривает каталог.
  2. находит новый файл.
  3. создает копию нового файла и отправляет его в другой каталог..
  4. создает таблицу с именем нового файла с использованием файла CSV.php.
  5. затем открывает скопированный файл и получает данные.
  6. создает массив из данных(из того, что я понимаю).
  7. считает данные.
  8. объединяет элементы массива со строкой.
  9. разбивает эту строку на "ячейки / отдельные значения"
  10. А затем вставляет данные в таблицу.

Примечание для тех, кто может захотеть их использовать.знать об этом ";"Возможно, вам придется изменить это на «,» в зависимости от того, как ваш файл отделен.мой файл отделен с помощью ";"и я использую utf8_encode, чтобы я мог использовать специальные символы, такие как ÆØÅ. Изменения, которые вы должны сделать, находятся в этом времени.

while ($getdata = fgetcsv($openfile, 1000, ";")) {
$getdata = array_map("utf8_encode", $getdata);
$total = count($getdata);
//    echo "<b>Row no:-</b>$row\n";   
//    echo "<b>Total fields in this row:-</b>$total\n";
$row++;
for ($c=0; $c < $total; $c++) {
    $csvdata = implode(";", $getdata);
    $fncsvdata = explode(";", $csvdata);
}

Я также создал таблицу, чтобы показать, как я получаю выходные данные на своем сайте.

Вот ответ

Это файл, который видит пользователь.в моем случае он называется csvtable.php

<?php
    // File selector
    $path = "./assets/csv"; 
    $sourcepath = "assets/csv"; 
    $copy = "assets/proceskontrol-csv";
    $latest_ctime = 0;
    $latest_filename = '';    

    $d = dir($path);
    while (false !== ($entry = $d->read())) {
    $filepath = "{$path}/{$entry}";
    // could do also other checks than just checking whether the entry is a file
        if (is_file($filepath) && filectime($filepath) > $latest_ctime){
            $latest_ctime = filectime($filepath);
            $latest_filename = $entry;
        }
    }
    if (1+1 == 2){
        copy("$sourcepath/$latest_filename","$copy/$latest_filename");
        $csv->createCsvTable($latest_filename);
        $row = 1;
        if (($openfile = fopen("$copy/$latest_filename", "r")) !== FALSE) {
            while ($getdata = fgetcsv($openfile, 1000, ";")) {
                $getdata = array_map("utf8_encode", $getdata);
                $total = count($getdata);
                //    echo "<b>Row no:-</b>$row\n";   
                //    echo "<b>Total fields in this row:-</b>$total\n";
                $row++;
                for ($c=0; $c < $total; $c++) {
                    $csvdata = implode(";", $getdata);
                    $fncsvdata = explode(";", $csvdata);
                }
                $csv->insertCsvTable($latest_filename ,$fncsvdata);
            }
        }
    }
    echo'<h1 class="text-center">CSV Table</h1>';
    echo'<h6 class="text-center">'.$latest_filename.'</h6>';
    echo '<table class=" table table-striped table-bordered table-hover">';
    echo'<tbody>';
?>

    <table class="table-hover table table-striped table-bordered">
    <thead>
        <tr>   
            <th scope="col">id</th>
            <th scope="col">Name</th>
            <th scope="col">Datum</th>
            <th scope="col">Property</th>
            <th scope="col">Criterion</th>
            <th scope="col">Type</th>
            <th scope="col">Nominal</th>
            <th scope="col">Actual</th>            
            <th scope="col">Tol-</th>                
            <th scope="col">Tol+</th>
            <th scope="col">Dev</th>
        </tr>
    </thead>
    <tbody>
        <?php foreach($csv->getCsv($latest_filename) as $csv) { ?>
            <tr>
                <td><?= $csv->id; ?></td>
                <td><?= $csv->Name; ?></td>
                <td><?= $csv->Datum; ?></td>
                <td><?= $csv->Property; ?></td>
                <td><?= $csv->Criterion; ?></td>
                <td><?= $csv->Type; ?></td>
                <td><?= $csv->Nominal; ?></td>
                <td><?= $csv->Actual; ?></td>
                <td><?= $csv->Tolminus; ?></td>
                <td><?= $csv->Tolplus; ?></td>
                <td><?= $csv->Dev; ?></td>
            </tr>
        <?php }?>
    </tbody>
</table>

Это мой файл класса базы данных DB.php.используется много в CSV.php

<code><?php
class DB extends \PDO
{
    /**
     * @var
     */
    private $host;
    /**
     * @var
     */
    private $user;
    /**
     * @var
     */
    private $pass;
    /**
     * @var PDO
     */
    private $conn;
    /**
     * @var
     */
    private $query;
    /**
     * @var bool
     */
    private $debug = false;


    /**
     * @param bool $bool
     */
    public function debug($bool = true)
    {
        $this->debug = $bool;
    }

    /**
     * @param $sql
     */
    private function setQuery($sql)
    {
        $this->query = $this->prepare($sql);
    }

    /**
     * DB constructor.
     * @param $dbhost
     * @param $dbuser
     * @param $dbpass
     * @param array $options
     */
    public function __construct($dbhost, $dbuser, $dbpass, $options = [])
    {
        try {
            $this->conn = parent::__construct($dbhost, $dbuser, $dbpass, $options);
        } catch (\PDOException $e) {
            print "Fejl!: " . $e->getMessage() . "<br/>";
            die();
        }

    }


    /**
     * @param string $sql
     * @param bool $params
     * @param int|mixed|null $returnType
     * @return mixed
     */
    public function query($sql, $params = false, $returnType = \PDO::FETCH_OBJ)
    {
        $this->setQuery($sql);
        $this->execute($params);
        $this->count = $this->query->rowCount();

        return $this->query->fetchAll($returnType);
    }

    /**
     * @param $params
     */
    private function execute($params)
    {
        if($params){
            $this->query->execute($params);
        } else {
            $this->query->execute();
        }
        if($this->debug){
            echo '<pre id="debug_params">',$this->query->debugDumpParams(),'
';}} / ** * @param $ sql * @param bool $ params * @return mixed * / открытая функция single ($ sql, $ params = false) {$ data = $ this-> запрос ($ sql, $ params);if (sizeof ($ data) === 1) {return $ data [0];} else {return false;}} / ** * @param $ sql * @param bool $ params * @return mixed * / сначала открытая функция ($ sql, $ params = false) {запрос возврата $ this-> ($ sql, $ params) [0];} / ** * @param $ sql * @param bool $ params * @return mixed * / открытая функция last ($ sql, $ params = false) {вернуть запрос $ this-> ($ sql, $ params) [$ this-> количество - 1];} / ** * @param $ sql * @param bool $ params * @return mixed * / открытая функция toList ($ sql, $ params = false) {return $ this-> query ($ sql, $ params);} / ** * @param $ sql * @param bool $ params * @return mixed * / открытая функция lastId ($ sql, $ params = false) {$ this-> query ($ sql, $ params);return $ this-> lastInsertId ();}}

И это CSV.php, где я создаю свои таблицы и вставляю данные.(sql вызывает)

<?php
class Csv extends \PDO {

    private $db = null;



    /**
     * Settings constructor.
     */
    public function __construct($db)
    {
        $this->db = $db;
    }

    /**
     * Menu & Admin Menu
     * @return mixed
     */

    public function getCsv($latest_filename)
    {
        return $this->db->toList("SELECT * FROM `$latest_filename`");
    }

    public function createCsvTable($latest_filename)

    {
        return $this->db->toList("CREATE TABLE IF NOT EXISTS `$latest_filename`(
            id INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
            Name VARCHAR(50), 
            Datum VARCHAR(50), 
            Property VARCHAR(50), 
            Criterion VARCHAR(50), 
            Type VARCHAR(50), 
            Nominal DECIMAL(10,2), 
            Actual DECIMAL(10,2), 
            Tolminus DECIMAL(10,2), 
            Tolplus DECIMAL(10,2), 
            Dev DECIMAL(10,2))
        ");
    }
    public function insertCsvTable($latest_filename ,$fncsvdata)
    {
        return $this->db->toList("INSERT INTO `$latest_filename` (`Name`,  `Datum`, `Property`, `Criterion`, `Type`, `Nominal`, `Actual`,`Tolminus`,`Tolplus`,`Dev`)
        VALUES (:Name, :Datum, :Property, :Criterion, :Type, :Nominal, :Actual, :Tolminus, :Tolplus, :Dev)",
            [
            ':Name' => $fncsvdata[0],
            ':Datum'=> $fncsvdata[1],
            ':Property'=> $fncsvdata[2],
            ':Criterion'=> $fncsvdata[3],
            ':Type'=> $fncsvdata[4],
            ':Nominal'=> $fncsvdata[5],
            ':Actual'=> $fncsvdata[6],
            ':Tolminus'=> $fncsvdata[7],
            ':Tolplus'=> $fncsvdata[8],
            ':Dev'=> $fncsvdata[9]
            ]);
    }
}

Я действительно надеюсь, что кто-то может использовать это.

0 голосов
/ 30 ноября 2018

CSV - это формат «значение, разделенное запятыми», и в вашей базе данных есть «индексы».Таким образом, чтобы сохранить CSV-файл, вам нужно загрузить его, перебрать каждую строку и затем вставить его с запросом.Таким образом, ваш код может выглядеть следующим образом:

$stmt = $pdo->prepare('INSERT INTO Testeses(id, Name, Datum, ...)
                       VALUES (
                               :id, :name, :date, ...
                       );');
foreach($csvLines as $line) {
    $stmt->bindValue(':id', $line[0]);
    $stmt->bindValue(':name', $line[1]);
    $stmt->bindValue(':date', $line[2]);
    $stmt->execute();
}

Вам необходимо знать, в какой позиции находится конкретное значение.

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