在PHP中导入CSV验证

在PHP中导入CSV验证,php,csv,fgetcsv,Php,Csv,Fgetcsv,我正在尝试通过一些基本验证将CSV上载/导入SQL server,例如CSV头应包含“SecurityID”,并且“SecurityID”值不能为NULL,并且具有数值。我在验证我的部件时遇到了一些问题,并且卡住了。下面是我在functions.php中的代码。为了清楚起见,我已经删除了DB insert/update代码,因为我还没有做到这一点 if(isset($_POST["Import"])){ $filetempname=$_FILES['file']

我正在尝试通过一些基本验证将CSV上载/导入SQL server,例如CSV头应包含“SecurityID”,并且“SecurityID”值不能为NULL,并且具有数值。我在验证我的部件时遇到了一些问题,并且卡住了。下面是我在functions.php中的代码。为了清楚起见,我已经删除了DB insert/update代码,因为我还没有做到这一点

    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>";
            }
        }
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" 
}
array(1) { 
[0]=> string(10) "SecurityID" 
}
变量转储($expectedHeaders);给我以下信息:

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" 
}
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

我包括了一些
var\u dump
,这样您就可以看到您的代码的功能了。当某些东西不能按预期工作时,请始终验证您的变量(“它是否具有我预期的值?”):

下面是if语句的可能解决方案。将给出
$getData
中与
$expectedHeaders
中相同的值。如果
$getData
包含更多的头,则这些头将被
数组_intersect
清除,从而产生相同的计数(假设顺序无关紧要)。如果
$getData
缺少标题,则该交叉点的计数将小于
$expectedHeaders
的计数

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

在代码和输出中用var_dump更新了我的问题。你也阅读了我的其余答案吗<代码>$expectedHeaders永远不会等于
$headers
,正如我在答案中键入的代码中所演示的那样。我已经知道(根据您在问题中提供的经验和其他信息)输出
var\u dump
会给出什么,所以我在答案的代码中键入了这些内容。是的,请阅读。根据你的建议,现在就做些改变来测试它。啊,那么。我的意思是,一般来说,为了调试,为了你自己,为了下次遇到问题时;)