2016-09-10 28 views
0

以下のコードは、mysqlテーブルからデータを正しくエクスポートしますが、出力されたcsvファイルに列名が表示されません。エクスポートPHP CSVファイルの列が表示されない

if(isset($_POST["export"])){ 
    $branchcode=$_POST['branchcode']; 
    $start=$_POST['start']; 
    $end=$_POST['end']; 
    $sql=mysqli_query($conn,"select tk_file,tk_date,userid,tk_from,tk_to from rfc_timekeeping_history where branchcode='$branchcode' and (tk_date between '$start' and '$end');")or die(mysqli_error()); 
    $output = ""; 
    $columns_total = mysqli_num_fields($sql); 
    for ($i = 0; $i < $columns_total; $i++) { 
    $heading = mysqli_fetch_fields($sql, $i); 
    $output .= '"'.$heading.'",'; 
    } 
    $output .="\n"; 
    while ($row = mysqli_fetch_array($sql)) { 
    for ($i = 0; $i < $columns_total; $i++) { 
    $output .='"'.$row["$i"].'",'; 
    } 
    $output .="\n"; 
    } 
    $filename = "myFile.csv"; 
    header('Content-type: application/csv'); 
    header('Content-Disposition: attachment; filename='.$filename); 
    echo $output; 
    exit; 
} 
+0

あなたのクエリはSQLインジェクション攻撃に対して広く公開されています。準備されたステートメントとバウンドパラメーターを使用してください。ここにPDOのページがありますが、mysqliでも準備できます:https://secure.php.net/manual/en/pdo.prepare.php – jedifans

答えて

1

csvファイルへの書き込みの標準PHPのメソッドを使用して、異なるアプローチ(fputcsv)を助け、あなたはこれらの線に沿って試みることができるstdoutストリームを使用してください。実際にレコードセットデータを処理するために、レコードセットを巻き戻す前に、最初のループで列名が取得されます。

<?php 

    if(isset($_POST["export"], $_POST['branchcode'], $_POST['start'], $_POST['end'])){ 

     $filename = "myFile.csv"; 
     $branchcode=$_POST['branchcode']; 
     $start=$_POST['start']; 
     $end=$_POST['end']; 



     /* store columns names in this array */ 
     $headers=array(); 

     /* Run the query */ 
     $sql = mysqli_query($conn, "select `tk_file`,`tk_date`,`userid`,`tk_from`,`tk_to` from `rfc_timekeeping_history` where `branchcode`='{$branchcode}' and (`tk_date between` '{$start}' and '{$end}');")or die(mysqli_error()); 

     /* fetch the fields */ 
     $fields = mysqli_fetch_fields($sql); 

     /* add each column name to the array */ 
     foreach($fields as $field) { 
      $headers[]=$field->name; 
     } 


     /* establish basic csv formatting parameters */ 
     $delimiter=','; 
     $enclosure='"'; 

     /* write output to stdout */ 
     $output=fopen('php://output','w+'); 
     fputcsv($output, $headers, $delimiter, $enclosure); 

     /* rewind the recordset to begin processing data */ 
     mysqli_data_seek($sql, 0); 

     /* process each row - add to stdout */ 
     while($row = mysqli_fetch_array($sql)) { 
      fputcsv($output, $row, $delimiter, $enclosure); 
     } 

     /* close stdout stream */ 
     fclose($output); 

     /* send the data */ 
     header("Content-Type: application/csv"); 
     header("Content-Disposition: attachment; filename={$filename}"); 
     ob_flush(); 
     exit(); 
    } 

?> 
+0

しかし、@ jedifansが指摘しているように、SQLに変数を直接埋め込むことは開始していますSQLから攻撃への準備ができているステートメントはこれに対する保護を提供し、より堅牢な終了コードにします。 – RamRaider

関連する問題