Я пытаюсь загрузить / импортировать 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






Я включил несколько 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
}
Вы также прочитали оставшуюся часть моего ответа? $expectedHeaders никогда не будет равняться $headers, как я продемонстрировал в коде, который я ввел в своем ответе. Я уже знал (по опыту и другой информации, которую вы указали в своем вопросе), что выдаст var_dump, поэтому я ввел их в код своего ответа.
Да прочтите это. внести изменения, чтобы протестировать его сейчас в соответствии с вашим предложением.
Ах так. Я имел в виду именно это больше для отладки в целом, для себя и на случай, если у вас в следующий раз возникнут проблемы;)
Обновил мой вопрос с помощью var_dump в коде и выводе.