Проблемы с чтением / загрузкой файлов .csv с php на mysql сервер - PullRequest
0 голосов
/ 19 марта 2020

Поэтому я попытался создать веб-приложение с PHP, которое импортирует банковские выписки из файла .CSV в базу данных mySQL. Но, к сожалению, в моем коде все еще есть fl aws, например, когда я запускаю этот код, все работает нормально, кроме:

  1. , если файл .CSV содержит специальные символы, такие как (š, ž, č) или " , "(для чисел с плавающей запятой), чем он читается как новый массив, но я хочу заменить", "на". " так что mySQL распознает число как число с плавающей точкой и заменяет специальные символы аналогичными символами (s, z, c).
  2. , если у меня есть заголовок в файле .csv, я буду sh, чтобы пропустить этот заголовок (первая строка), возможно, самым простым способом было бы сначала прочитать файл и сосчитать строки, чтобы я получил максимальное количество строк в файле, и чем использовать, возможно, while или для l oop? например, while (($ row> = 2)
<?php
    $conn= mysqli_connect('localhost','admin','admin','database_test');
    if (isset($_POST['submit'])){
        $createTable="CREATE TABLE Bank_statements(
        id INT(3) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        date DATE NOT NULL,
        purpose TEXT(100) NOT NULL,
        debit FLOAT(255,2) NOT NULL,
        kredit FLOAT(255,2) NOT NULL
        );";
        if (mysqli_query($conn,$createTable)){
            $file=fopen($_FILES['file_nkbm']['tmp_name'],"r");
            while($data=fgetcsv($file)){
                foreach($data as $dat){
                    $expl=explode(";",$dat);
                    $convert_date=strtotime($expl[4]);
                    $date=date('y-m-d',$convert_date);
                    $debit=doubleval($expl[5]);
                    $kredit=doubleval($expl[6]);
                    $purpose=$expl[8];
                    $addData="INSERT INTO Bank_statements(date,debit,kredit,purpose) VALUES 
                    ('$date','$debit','$kredit','$purpose');";
                    if (mysqli_query($conn,$addData)){
                        echo "success";
                    }else{
                        echo "fail".mysqli_error($conn);
                    }
                }
            }
            fclose($_FILES['file_nkbm']['tmp_name']);
            $query="SELECT * FROM Bank_statements;";
            $result=mysqli_query($conn,$query);
            while ($row=mysqli_fetch_array($result)){
                echo $row['id'].$row['date'].$row['purpose'].$row['debit'].$row['kredit']."<br>";
            }
        }else{
            echo "table already exist";
        }
    }
    mysqli_close($conn);
?>

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

1 Ответ

0 голосов
/ 21 марта 2020

Я наконец получил правильный результат, поэтому мой код в настоящее время выглядит так:

<?php
    $conn= mysqli_connect('localhost','admin','admin','database_test');
    if (isset($_POST['submit'])){
        $createTable="CREATE TABLE Bank_statements(
        id INT(3) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        date DATE NOT NULL,
        purpose TEXT(100) NOT NULL,
        debit FLOAT(255,2) NOT NULL,
        kredit FLOAT(255,2) NOT NULL
        );";
        if (mysqli_query($conn,$createTable)){
            $file=fopen($_FILES['file_nkbm']['tmp_name'],"r");
            $row=1;
            while($data=fgetcsv($file,1000,'~')){
                $repl_one=str_replace(',','.',$data);
                $repl=preg_replace('/[\x00-\x1F\x7F-\xFF]/','?',$repl_one);
                $row++;
                if ($row!=2){
                    foreach($repl as $dat){
                        $expl=explode(";",$dat);
                        $convert_date=strtotime($expl[4]);
                        $date=date('y-m-d',$convert_date);
                        $debit=doubleval($expl[5]);
                        $kredit=doubleval($expl[6]);
                        $purpose=$expl[8];
                        $addData="INSERT INTO Bank_statements(date,debit,kredit,purpose) 
                                  VALUES ('$date','$debit','$kredit','$purpose');";
                        mysqli_query($conn,$addData);
                    }
                }
            }
            fclose($_FILES['file_nkbm']['tmp_name']);
            $query="SELECT * FROM Bank_statements;";
            $result=mysqli_query($conn,$query);
            while ($row=mysqli_fetch_array($result)){
                echo $row['id'].$row['date'].$row['purpose'].$row['debit'].$row['kredit']."<br>";
            }
        }else{
            echo "table already exist";
        }
    }
    mysqli_close($conn);
?>

с переменной $row Я решил проблему пропуска первой строки и с str_replace и preg_replace i решена проблема с точкой и специальными символами в файле. Но я должен был установить fgetcsv delimiter на какой-либо символ, отличный от «,», потому что когда программа читала файл, она разбивала одну строку на новый массив при обнаружении «,».

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