PHP - функция экспорта CSV повторяет заголовки для каждой записи

0

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

Данные CSV (красные линии заблокированы данные, но вы можете видеть, как заголовки повторяются для каждой строки)

Вот наш код для создания экспорта:

//inserts data into import table
$sql = "INSERT into import (suid, studentName, studentEmail, studentAffiliation, studentProgram, studentEduLevel) values ('$suid', '$studentName', '$studentEmail', '$studentAffiliation', '$studentProgram', '$studentEduLevel')";
if (!$fail) {

    if (mysqli_multi_query($csvDatabase, $sql)) {
            //once imported properly, export csv

        $query = "SELECT suid, studentName, studentEmail, studentAffiliation, studentProgram, studentEduLevel from import ORDER BY id DESC LIMIT {$successCount}";  
          $result = mysqli_query($csvDatabase, $query); 
                if ($result->num_rows > 0) {
                  header('Content-Type: text/csv; charset=utf-8');  
                  header('Content-Disposition: attachment; filename=data-export.csv'); 
                    $output = fopen("php://output", "w"); 
                    $headers = array('SUID', 'Student Name', 'Student Email', 'Student Affiliation', 'studentProgram', 'Student Edu Level');
                    fputcsv($output, $headers); 
                     while($row = mysqli_fetch_assoc($result))  
                  {  
                         fputcsv($output, $row);
                  }  
                  fclose($output); 
                    //then delete records in database
                $deletesql = "DELETE FROM import ORDER BY id DESC LIMIT {$successCount}";
                    if (mysqli_query($csvDatabase, $deletesql)) {
                        //echo "Record deleted successfully";
                    } else {
                        echo "Error deleting record: " . mysqli_error($csvDatabase);
                    }

        }


    } else {
        echo "Error: " . $sql . "<br>" . mysqli_error($csvDatabase);
    }
 }

Любые идеи о том, что может происходить в коде, чтобы повторить заголовки?

РЕДАКТИРОВАТЬ: Полный код с опущенной информацией о сервере:

<?php
require_once('connection.php');

$successCount = 0;

if(isset($_POST['submit'])){

$filename = $_FILES["file"]["tmp_name"];
if($_FILES["file"]["size"] > 0) {
for($i=0; $i<count($filename); $i++) {
    $file = $filename[$i];
    //open file in read only
    $files = fopen($file, "r");
    //skips first line
    fgets($files); 
    //get data from csv & uses comma to find separate values
        while (($getData = fgetcsv($files, 0, ",")) !== FALSE)
         {
            $fail = FALSE;
            //store SUID from 2nd line in csv
            $suid = $getData[0];
            if (strlen($suid) === 9 && ctype_digit($suid) ) {
            // start ldap look up
            $server="***";
            $basedn="***";

            //Connect to server
            $ds=ldap_connect($server);

            if ($ds) {
                //bind with our special account that retrieves more attributes
                $ldaprdn  = '***';     // ldap rdn or dn
                $ldappass = '***';  // associated password
                $r=ldap_bind($ds,$ldaprdn,$ldappass);    // this is an authenticated bind
                if (substr($suid, 0, 1) === ";" || is_numeric($suid)) {
                        if ($r) {
                            //filter to all objectclasses that the SUID we are looking for
                            $filter = "(&(objectClass=*)(syrEduSUID={$suid}))";

                            //We are only interested in retrieving these attributes
                            $justthese = array("displayName", "syrEduLevel", "syrEduProgramDesc", "syrEduProgram", "mail", "eduPersonPrimaryAffiliation", "eduPersonAffiliation" );

                            // Search SUID
                            $sr=ldap_search($ds, $basedn, $filter, $justthese );
                            //Need to test if the search succeeded. FALSE value means it failed
                            //if ($sr!==FALSE) {
                                //Search found something. Now return Attributes and their values - note, there can be multiple values per attribute. We need to make sure the search only returned one result

                                $entry = ldap_get_entries($ds, $sr);
                                // if we have only one result, return the values, if not, we have a problem

                                if ($entry["count"] == 1) {
                                // get student name and email from suid

                                $studentName = mysqli_real_escape_string($csvDatabase, $entry[0]['displayname'][0]);
                                $studentEmail = mysqli_real_escape_string($csvDatabase, $entry[0]['mail'][0]);
                                $studentAffiliation = mysqli_real_escape_string($csvDatabase, $entry[0]['edupersonprimaryaffiliation'][0]);
                                $studentProgram = mysqli_real_escape_string($csvDatabase, $entry[0]['syreduprogramdesc'][0]);
                                $studentEduLevel = mysqli_real_escape_string($csvDatabase, $entry[0]['syredulevel'][0]);

                                    $successCount++;

                                // close ldap
                                ldap_close($ds);

                                } else {
                                    $msg  = "Ldap search returned 0 or more than one result";
                                    $fail = TRUE;
                                }

                        //} else {
                        //    $msg  = "Search failed";
                        //    $fail = TRUE;
                        //}
                    }
                } else {
                    $msg  = "Bind failed";
                    $fail = TRUE;
                }
            } else {
                $msg  = "LDAP connection failed";
                $fail = TRUE;
            }

                        //inserts data into import table
                        $sql = "INSERT into import (suid, studentName, studentEmail, studentAffiliation, studentProgram, studentEduLevel) values ('$suid', '$studentName', '$studentEmail', '$studentAffiliation', '$studentProgram', '$studentEduLevel')";
                        if (!$fail) {

                            if (mysqli_multi_query($csvDatabase, $sql)) {
                                    //once imported properly, export csv

                                $query = "SELECT suid, studentName, studentEmail, studentAffiliation, studentProgram, studentEduLevel from import ORDER BY id DESC LIMIT {$successCount}";  
                                  $result = mysqli_query($csvDatabase, $query); 
                                        if ($result->num_rows > 0) {
                                          header('Content-Type: text/csv; charset=utf-8');  
                                          header('Content-Disposition: attachment; filename=data-export.csv'); 
                                            $output = fopen("php://output", "w"); 
                                            $headers = array('SUID', 'Student Name', 'Student Email', 'Student Affiliation', 'studentProgram', 'Student Edu Level');
                                            fputcsv($output, $headers); 
                                             while($row = mysqli_fetch_assoc($result))  
                                          {  
                                                 fputcsv($output, $row);
                                          }  
                                          fclose($output); 
                                            //then delete records in database
                                        $deletesql = "DELETE FROM import ORDER BY id DESC LIMIT {$successCount}";
                                            if (mysqli_query($csvDatabase, $deletesql)) {
                                                //echo "Record deleted successfully";
                                            } else {
                                                echo "Error deleting record: " . mysqli_error($csvDatabase);
                                            }

                                }


                            } else {
                                echo "Error: " . $sql . "<br>" . mysqli_error($csvDatabase);
                            }
                         }
                }
        }

    //closes file    
    fclose($files); 
     }
} else {
    echo "You did not upload a CSV file or the CSV file is blank.";
}
} else {
?>
  • 0
    Этот код не похож на повторение заголовка. Что вы используете для просмотра CSV? Похоже, это в таблице или что-то. (Просто интересно, возможно ли, это то, что дублирует заголовки.)
  • 0
    ВНИМАНИЕ : При использовании mysqli вы должны использовать параметризованные запросы и bind_param для добавления пользовательских данных в ваш запрос. НЕ используйте интерполяцию или конкатенацию строк для достижения этой цели, поскольку вы создали серьезную ошибку внедрения SQL . НИКОГДА не помещайте $_POST , $_GET или любые пользовательские данные непосредственно в запрос, это может быть очень вредно, если кто-то попытается использовать вашу ошибку.
Показать ещё 5 комментариев
Теги:
csv

1 ответ

0

Как указывает IdontDownVote, код был помещен в цикл для каждого файла. После извлечения и размещения после fclose ($ files) заголовки не повторяются.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню