2017-12-11 21 views
0

PHP에서 CSV로 내보내기 작업 중입니다. 내가 원하는 ExcelSheet 출력을 내게 잘 작동하는 코드가 있습니다. 코드 스 니펫 : 당신이 코드에서 볼 수 있듯이PHP에서 CSV로 변경

public function generate_csv() { 
$data_rows = array(); 
    $table = 'ProductDetails'; 
    $data_rows = array(); 
    global $wpdb, $bp; 
    $data= $wpdb->get_results("SELECT * FROM " . $table . ""); 
    $fh = @fopen('php://output', 'w'); 

foreach ($data as $u) { 
     $row = array(); 
     $row[0] = $u->productCode; 
     $row[1] = $u->productTitle; 
     $row[2] = $u->productDescription; 
     $row[3] = $u->specification; 
     $row[4] = $u->whereToBuy;  
     $data_rows[] = $row; 
    } 

    header("Pragma: public"); 
     ... Some more header ... 
    header("Content-Transfer-Encoding: binary"); 

    fputcsv($fh, $header_row); 
    foreach ($data_rows as $data_row) { 
     fputcsv($fh, $data_row); 
    } 
    fclose($fh); 
    die(); 
} 

나는 모든 열 이름을 코딩 및 배열을 만들 하드입니다. 문제는 phpMyAdmin이 데이터베이스의 열을 추가/제거한 다음 완벽한 ExcelSheet를 얻는 데 필요한 변경 사항이이 코드에서도 필요하다는 것입니다. 어느 누구도이 코드를 동적으로 만들 수있게 도와 줄 수 있습니까? $ row [0], $ row [1], $ row [2] .... 대신에해야 할 것과 같이 ??

+0

후, 나는이 문제를 해결하는 방법과은에 연결하는 것이, 또는 사람들이 .. 이해 관계자에 변화를 의사 소통을하지 않고 당신이 당신의 열이 항상 일치하는지 확인해야합니다 테이블 스키마 변경 인 경우 데이터베이스에서 테이블의 스키마 덤프를 가져 와서 이름 변환 테이블로 저장하면 해당 배열을 사용하여 출력의 열 머리글을 자동으로 할당 할 수 있습니다. 상당히 견고한 솔루션이지만 번역 결과물을 만들기 위해 스키마 결과의 시작 부분을 정리해야합니다. – DDeMartini

+0

게시 할 수있는 모든 예 ..? 죄송합니다, 그것은 어리 석었지만 PHP에서 내 나이는 단지 1 일입니다 –

+0

물론. SQL을 사용하여 당신을 도울 수있는 질문이 더 많습니다. 나는 뭔가를 생각해 내고 대답으로 게시 할 것입니다. – DDeMartini

답변

1

더 많은 글로벌 접근 방식은 이중 foreaches

을 사용하는 것입니다
$data_rows=array(); 
    foreach ($data as $u) { 
     $row = array(); 
     foreach ($u as $field) 
      { 
      $row[] = $field; // collect dynamic row fields 

      } 
    $data_rows[] = $row; // each row will have own array of fields 
    } 

/// EDITED

public function generate_csv($table) // better to have table name here 
{ 
$data_rows = array(); 
    $data_rows = array(); 
    global $wpdb, $bp; 
    $sql = "SELECT * FROM " . $table . ""; 

    $data= $wpdb->get_results($sql);  
    $fh = @fopen('php://output', 'w'); 


    //following the example from: https://stackoverflow.com/a/31068464/1171074 
    $header_data=array(); 
    foreach ($wpdb->get_col("DESC " . $table, 0) as $column_name) { 
     $header_data[] = $column_name; 
    } 

    array_push($data_rows,$header_data); // first array will be columns names 

    foreach ($data as $u) { 
     $row = array(); 
     foreach ($u as $field) 
      { 
      $row[] = $field; // collect dynamic row fields 

      } 
    $data_rows[] = $row; // each row will have own array of fields 
    } 

    ............ // rest of the code 

    } 
+0

전설 Bro .. 당신은 내 작은 엉덩이를 저장 ... 감사합니다 –

+0

당신은 헤더 행에 대해 뭔가 제안 할 수 있습니까? –

+0

$ header_row = array (0 => 'productCode', 1 => 'productTitle', 2 => 'productDescription', 3 => '사양', 4 => 'whereToBuy'); 나에게이 옵션을 제공해 주시겠습니까? –

1

당신은 열 이름을 얻기 위해 가상 INFORMATION_SCHEMA.COLUMNS 테이블을 사용할 수 있습니다 감사합니다 , 이렇게 :

"SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = {$table}"

0

끝까지 다가 가지 않으면 꽤 가까워 야합니다. 그것은 테이블을 쿼리하고 csv에 대한 헤더 행을 작성한 다음 각 데이터 행을 어셈블합니다. 응답 행을 값으로 반복 할 경우 행 이름을 알 필요가 없습니다.

PHP 상자가 없기 때문에 약간 버그가 있으면 앞에서 사과드립니다. 정확한 구문을 확인하십시오.

public function generate_csv() { 

    global $wpdb; 
    global $bp; 
    $headers = array(); 
    $data_rows = array(); 
    $table  = 'ProductDetails'; 
    $data_rows = array(); 
    $header_row; 

    # determine table field names 
    $table_sql = sprintf("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '%s'",$table); 

    # this will run the query and stuff field names into 
    $resp = $wpdb->get_results($table_sql); 
    foreach($resp as $row){ 
     array_push($headers,$row[0]); 
    } 

    # get the records from the datbase 
    $data= $wpdb->get_results(sprintf("SELECT * FROM %s",$table)); 

    # open output handle 
    $fh = @fopen('php://output', 'w'); 

    foreach ($data as $record) { 
     $row = array(); 
     foreach($record as $value){ 
      array_push($row,$value); 
     } 
     array_push($data_rows,$row); 
    } 
    header("Pragma: public"); 
     ... Some more header ... 
    header("Content-Transfer-Encoding: binary"); 

    fputcsv($fh, $headers); 
    foreach ($data_rows as $data_row) { 
     fputcsv($fh, $data_row); 
    } 
    fclose($fh); 
    return; 
} 
+0

그것은 오류를 던진다. 경고 : 에서 foreach C : 약간의 경로 \ \ 플러그인 \ 수출 \ Export.php 라인 101
라인 (101)상의
가 의 foreach ($의 COLNAME 같은 $ wpdb-> get_results의 ($ SQL)) {이다 array_push ($ 헤더 $의 COLNAME) ; } –

+0

응답을 배열로 처리해야합니다 ... 또는 배열 메서드에 잘못된 쿼리를 가져 왔을 수 있습니다. 전체 테스트 케이스를 만들기 위해 변경 사항이있을 때 편집합니다. – DDeMartini

+0

한번 알려 주시면 감사 드리겠습니다. 감사합니다. –