Импорт проверки CSV в PHP

Я пытаюсь загрузить / импортировать CSV на сервер SQL с некоторой базовой проверкой, такой как Заголовки CSV должны содержать "SecurityID", а значение "SecurityID" НЕ может быть NULL и имеет ЧИСЛЕННОЕ значение.. У меня возникла проблема с проверкой части заголовков, и я застрял. Ниже мой код от functions.php. Для ясности я удалил код вставки / обновления БД, так как я не ухожу так далеко.

    if (isset($_POST["Import"])){

            $filetempname=$_FILES['file']['tmp_name'];
            $filename=$_FILES['file']['name'];
            $filetype = $_FILES['file']['type'];

            $csv_mimetypes = array(
                            'text/csv',
                            'text/plain',
                            'application/csv',
                            'text/comma-separated-values',
                            'application/excel',
                            'application/vnd.ms-excel',
                            'application/vnd.msexcel',
                            'text/anytext',
                            'application/octet-stream',
                            'application/txt',
                        );
            $expectedHeaders = array(
                'SecurityID'
            );

            $requiredFields = array(
                'SecurityID'
            );

            $firstLine = true;

            if (in_array($_FILES['file']['type'],$csv_mimetypes)) 
            {
                if ($_FILES["file"]["size"] > 0)
                {
                $file = fopen($filetempname, "r");
                #echo $file;

                while (($getData = fgetcsv($file, 10000, ",")) !== FALSE)
                {   
                    foreach($getData as $row)
                    {
                        if ($firstLine)
                        {
var_dump($expectedHeaders);
                            //Set the headers:
                            $firstLine = false;
var_dump($getData);
                            $headers = array_flip($getData);

                            // Validate the headers:
                            if ($headers !== $expectedHeaders)
                            {
                                echo "Invalid headers. Aborting import.";
                            }
                            Continue;
                        }

                        foreach($requiredFields as $requiredKey)
                        {
                            $value = $row[$headers[$requiredKey]];
                            // '0' will also match as empty(), although it is a valid value:
                            if (empty($value) && $value != '0' && is_numeric($value))
                            {
                                echo "Row {$requiredKey} may not be empty or has to be numeric. Aborting import.";
                            }
                        }
                        fclose($file);  
                        }
                    }
                }
            }
            else
            { 
                echo "<script type=\"text/javascript\">
                alert(\"Invalid File:Please Upload CSV File.\");
                window.location = \"indexd.php\"
                </script>";
            }
        }

Пытаясь загрузить / проверить CSV, я получаю следующие ошибки. Журналы веб-сервера IIS мне ничего не дают ..:

Invalid headers. Aborting import.

var_dump ($ getData); дает мне ниже:

array(15) { 
[0]=> string(14) "DataProviderID" 
[1]=> string(8) "FamilyID" 
[2]=> string(10) "FamilyName" 
[3]=> string(10) "SecurityID" 
[4]=> string(4) "Name" 
[5]=> string(10) "PrimaryRic" 
[6]=> string(13) "Administrator" 
[7]=> string(16) "IsAdminEULocated" 
[8]=> string(21) "IsAdminOnEsmaRegister" 
[9]=> string(25) "IsBenchmarkOnEsmaRegister" 
[10]=> string(26) "IsBenchmarkOnAdminRegister" 
[11]=> string(23) "HasEUListedFundTracking" 
[12]=> string(25) "HasEUListedFutureOrOption" 
[13]=> string(20) "IsAdminPre2016Active" 
[14]=> string(24) "IsBenchmarkPre2018Active" 
}

var_dump ($ expectedHeaders); дает мне ниже:

array(1) { 
[0]=> string(10) "SecurityID" 
}

Мой CSV-файл для тестирования выглядит следующим образом:

DataProviderID,FamilyID,FamilyName,SecurityID,Name,PrimaryRic,Administrator,IsAdminEULocated,IsAdminOnEsmaRegister,IsBenchmarkOnEsmaRegister,IsBenchmarkOnAdminRegister,HasEUListedFundTracking,HasEUListedFutureOrOption,IsAdminPre2016Active,IsBenchmarkPre2018Active
2,MSCI,MSCI Main Indices - Americas,17912,NORTH AMERICA IMI-664176,.dMINA000I0PUS,MSCI Limited,1,1,0,99,99,99,99,1
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
1 229
1

Ответы 1

Я включил несколько var_dump, чтобы вы могли видеть, что делает ваш код. Когда что-то работает не так, как ожидалось, ВСЕГДА проверяйте свои переменные («Имеет ли он ожидаемое значение?»):

// [...]
$expectedHeaders = array(
    'SecurityID'
);

var_dump($expectedHeaders);
// Will print array(
//    0 => (string) 'SecurityID'
// )

// [...] while foreach etc

//Set the headers:
$firstLine = false;

var_dump($getData);
// Will print array(
//    0 => (string) 'DataProviderID'
//    1 => (string) 'FamilyID'
//    2 => (string) 'FamilyName'
//    3 => (string) 'SecurityID'
//    etc
// );

$headers = array_flip($getData);

var_dump($headers);
// Will print array(
//    (string) 'DataProviderID' => 0
//    (string) 'FamilyID'       => 1
//    (string) 'FamilyName'     => 2
//    (string) 'SecurityID'     => 3
//    etc
// )

// Validate the headers:
if ($headers !== $expectedHeaders) 
{
    // Will always get into this if, because as you can see
    // from the var_dumps, $expectedHeaders will never be 
    // equal to $headers - nor equal to $getData
    echo "Invalid headers. Aborting import.";
}

Возможное решение для вашего оператора if ниже. array_intersect даст значения, которые есть как в $getData, так и в $expectedHeaders. Если $getData содержит больше заголовков, они стираются array_intersect, что приводит к тому же количеству (при условии, что порядок не имеет значения). Если у $getData отсутствуют заголовки, количество пересечений будет меньше, чем количество $expectedHeaders.

if (
    count(array_intersect($getData, $expectedHeaders)) 
    != count($expectedHeaders)
) {
    // Wrong CSV format error
}

Обновил мой вопрос с помощью var_dump в коде и выводе.

Zulfiqar Dholkawala 21.05.2018 14:50

Вы также прочитали оставшуюся часть моего ответа? $expectedHeaders никогда не будет равняться $headers, как я продемонстрировал в коде, который я ввел в своем ответе. Я уже знал (по опыту и другой информации, которую вы указали в своем вопросе), что выдаст var_dump, поэтому я ввел их в код своего ответа.

Peter van der Wal 21.05.2018 14:55

Да прочтите это. внести изменения, чтобы протестировать его сейчас в соответствии с вашим предложением.

Zulfiqar Dholkawala 21.05.2018 14:56

Ах так. Я имел в виду именно это больше для отладки в целом, для себя и на случай, если у вас в следующий раз возникнут проблемы;)

Peter van der Wal 21.05.2018 15:06

Другие вопросы по теме