2013-01-04 36 views
6

私はcsvファイル内の1つのテーブルにデータをエクスポートする必要があります。データを正常に取得できますが、CSVファイルがブラウザによって生成されていません。csv wordpressにエクスポート

私のコードは次のようなものです。ヘッダーの問題です。コンマで区切った値だけを出力していますが、CSVファイルを取得していません。

/* Converting data to CSV */ 

public function CSV_GENERATE($getTable) 
{ 
    ob_clean(); 
    global $wpdb; 
    $field=''; 
    $getField =''; 

    if($getTable){ 
     $result = $wpdb->get_results("SELECT * FROM $getTable"); 
     $requestedTable = mysql_query("SELECT * FROM ".$getTable); 
     // echo "hey";die;//var_dump($result);die; 

     $fieldsCount = mysql_num_fields($requestedTable); 

     for($i=0; $i<$fieldsCount; $i++){ 
      $field = mysql_fetch_field($requestedTable); 
      $field = (object) $field;   
      $getField .= $field->name.','; 
     } 

     $sub = substr_replace($getField, '', -1); 
     $fields = $sub; # GET FIELDS NAME 
     $each_field = explode(',', $sub); 
     $csv_file_name = $getTable.'_'.date('Ymd_His').'.csv'; 
     # CSV FILE NAME WILL BE table_name_yyyymmdd_hhmmss.csv 

     # GET FIELDS VALUES WITH LAST COMMA EXCLUDED 
     foreach($result as $row){ 
      for($j = 0; $j < $fieldsCount; $j++){ 
       if($j == 0) $fields .= "\n"; # FORCE NEW LINE IF LOOP COMPLETE 
       $value = str_replace(array("\n", "\n\r", "\r\n", "\r"), "\t", $row->$each_field[$j]); # REPLACE NEW LINE WITH TAB 
       $value = str_getcsv ($value , ",", "\"" , "\\"); # SEQUENCING DATA IN CSV FORMAT, REQUIRED PHP >= 5.3.0 
       $fields .= $value[0].','; # SEPARATING FIELDS WITH COMMA 
      } 
      $fields = substr_replace($fields, '', -1); # REMOVE EXTRA SPACE AT STRING END 
     } 

     header("Content-type: text/x-csv"); # DECLARING FILE TYPE 
     header("Content-Transfer-Encoding: binary"); 
     header("Content-Disposition: attachment; filename=".$csv_file_name); # EXPORT GENERATED CSV FILE 
     header("Pragma: no-cache"); 
     header("Expires: 0"); 
     header("Content-type: application/x-msdownload"); 
     //header("Content-Disposition: attachment; filename=data.csv"); 

     return $fields; 
    } 

答えて

6

これは完全に機能しています。これをプラグインとして使用することができます。私はthis投稿を修正しました。 sruthi sriに感謝します。

ホープ、これはいくつかのいずれかに役立ちます:)

<?php 

class CSVExport 
{ 
/** 
* Constructor 
*/ 
public function __construct() 
{ 
if(isset($_GET['download_report'])) 
{ 
$csv = $this->generate_csv(); 

header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: private", false); 
header("Content-Type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=\"report.csv\";"); 
header("Content-Transfer-Encoding: binary"); 

echo $csv; 
exit; 
} 

// Add extra menu items for admins 
add_action('admin_menu', array($this, 'admin_menu')); 

// Create end-points 
add_filter('query_vars', array($this, 'query_vars')); 
add_action('parse_request', array($this, 'parse_request')); 
} 

/** 
* Add extra menu items for admins 
*/ 
public function admin_menu() 
{ 
add_menu_page('Download Report', 'Download Report', 'manage_options', 'download_report', array($this, 'download_report')); 
} 

/** 
* Allow for custom query variables 
*/ 
public function query_vars($query_vars) 
{ 
$query_vars[] = 'download_report'; 
return $query_vars; 
} 

/** 
* Parse the request 
*/ 
public function parse_request(&$wp) 
{ 
if(array_key_exists('download_report', $wp->query_vars)) 
{ 
$this->download_report(); 
exit; 
} 
} 

/** 
* Download report 
*/ 
public function download_report() 
{ 
echo '<div class="wrap">'; 
echo '<div id="icon-tools" class="icon32"> 
</div>'; 
echo '<h2>Download Report</h2>'; 
//$url = site_url(); 

echo '<p>Export the Subscribers'; 
} 

/** 
* Converting data to CSV 
*/ 
public function generate_csv() 
{ 
$csv_output = ''; 
$table = 'users'; 

$result = mysql_query("SHOW COLUMNS FROM ".$table.""); 

$i = 0; 
if (mysql_num_rows($result) > 0) { 
while ($row = mysql_fetch_assoc($result)) { 
$csv_output = $csv_output . $row['Field'].","; 
$i++; 
} 
} 
$csv_output .= "\n"; 

$values = mysql_query("SELECT * FROM ".$table.""); 
while ($rowr = mysql_fetch_row($values)) { 
for ($j=0;$j<$i;$j++) { 
$csv_output .= $rowr[$j].","; 
} 
$csv_output .= "\n"; 
} 

return $csv_output; 
} 
} 

// Instantiate a singleton of this plugin 
$csvExport = new CSVExport(); 
+0

あなたのクラスのためにありがとう、しかし、私はそれを使用するとき、私のCSVは正しく形成されていません。私は列がないことを意味する –

+0

すみません。私はあなたが実際に逃しているものを得ることができませんでしたが、それは私のために完全に働いた。私はこのポストに貼り付けた同じコードです。 – Developer

+0

Microsoft Excelはうんざりしています...書式設定された文書を列で表示するには、カンマの代わりにセミコロンを付ける必要がありました。 –

2

私は確信していませんが、いくつかあります。

あなたのブレースは一致しません - あなたはどこかで閉鎖}がありません。

あなたは、呼び出したルーチンでそれをやっていない限り、実際には生成されたコンテンツをどこにでも送りませんか?たぶん、echo $fields;を意味するのではなく、return $fields;

ob_clean()を呼び出すと出力バッファリングがオンになっていますか?おそらく、ob_end_clean()を意味する - バッファを破棄し、バッファリングをオフにする?

エクスポート用にCSVを作成しています。あなたのコールとの違いに関しては

header('Content-Type: text/csv'); 
header('Content-Disposition: attachment; filename="' . $csv_file_name . '"'); 
header('Pragma: no-cache'); 
header('Expires: 0'); 

:それはちょうど次のヘッダーで働いているあなたは2つのContent-Typeヘッダ

  • を送っている

    1. 私は「私のファイル名の前後に引用符
    2. を持っていますm指定していないContent-Transfer-Encoding

    私には分かりませんオスの違いはあなたの問題に関連しています。

  • +1

    お返事ありがとうございます。そのヘッダーの友人との問題。彼らは最初に読み込まれていません。私はこのようないくつかのことを、今では一つのファイルでプラグインとして動作させようとしました。 – Developer

    +0

    私の答えで述べた出力バッファリングのように聞こえますか? – Hobo

    3

    私は大器晩成だけど、あなたたちは上の仕事をして共有したいコードに小さな「改善」を行いました。 メインプラグインの.phpファイルにコードが貼り付けられている場合は、3つのステップを実行する必要はありません。必要に応じてスクリプトの下部にある値を変更するだけです。私はそれをきちんと保つのが好きです。

    これを必要とするかもしれないし、誰もが使用するための柔軟性を追加するために初心者のための

    1. まずyour_plugin_directory/databasestuff/table_to_csv.phpの下require_once(PARTS_MY_PLUGIN_DIR . '/databasestuff/table_to_csv.php')
    2. を追加した後、グローバル変数define('MY_PLUGIN_DIR', plugin_dir_path(__FILE__));
    3. を追加する次のクラスを保存し、最後に変更必要に応じていくつかの行。
    4. 最後の数行を調整

      class export_table_to_csv{ 
      
          private $db; 
          private $table_name; 
          private $separator; 
      
      
          function __construct($table_n, $sep, $filename){ 
      
          global $wpdb;            //We gonna work with database aren't we? 
          $this->db = $wpdb;           //Can't use global on it's own within a class so lets assign it to local object. 
          $this->table_name = $table_n;        
          $this->separator = $sep; 
      
          $generatedDate = date('d-m-Y His');       //Date will be part of file name. I dont like to see ...(23).csv downloaded 
      
          $csvFile = $this->generate_csv();       //Getting the text generated to download 
          header("Pragma: public"); 
          header("Expires: 0"); 
          header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
          header("Cache-Control: private", false);     //Forces the browser to download 
          header("Content-Type: application/octet-stream"); 
          header("Content-Disposition: attachment; filename=\"" . $filename . " " . $generatedDate . ".csv\";"); 
          header("Content-Transfer-Encoding: binary"); 
      
          echo $csvFile;            //Whatever is echoed here will be in the csv file 
          exit; 
      
          } 
      
      
          function generate_csv(){ 
      
          $csv_output = '';           //Assigning the variable to store all future CSV file's data 
          $table = $this->db->prefix . $this->table_name;    //For flexibility of the plugin and convenience, lets get the prefix 
      
          $result = $this->db->get_results("SHOW COLUMNS FROM " . $table . ""); //Displays all COLUMN NAMES under 'Field' column in records returned 
      
          if (count($result) > 0) { 
      
           foreach($result as $row) { 
            $csv_output = $csv_output . $row->Field . $this->separator; 
           } 
           $csv_output = substr($csv_output, 0, -1);    //Removing the last separator, because thats how CSVs work 
      
          } 
          $csv_output .= "\n"; 
      
          $values = $this->db->get_results("SELECT * FROM " . $table . "");  //This here 
      
          foreach ($values as $rowr) { 
           $fields = array_values((array) $rowr);     //Getting rid of the keys and using numeric array to get values 
           $csv_output .= implode($this->separator, $fields);  //Generating string with field separator 
           $csv_output .= "\n"; //Yeah... 
          } 
      
          return $csv_output; //Back to constructor 
      
          } 
      } 
      
      // Also include nonce check here - https://codex.wordpress.org/WordPress_Nonces 
      if(isset($_POST['processed_values']) && $_POST['processed_values'] == 'download_csv'){ //When we must do this 
          $exportCSV = new export_table_to_csv('table_name',';','report');    //Make your changes on these lines 
      } 
      

    は覚えておいてくださいください:

    1. テーブルプレフィックスは、テーブル名に追加されます。
    2. このスクリプトでは、WordPressのコア機能を使用しています。つまり、最後の3行は、文字通り、これを機能させるために変更しなければならないすべての行です。
    2

    @Developerに少し調整を加えるだけで、管理者がかなり引き上げたり、csvをダウンロードしたりしていないためです。しかし、今、それは:)ます:

    <?php 
    
    /** 
    * CSV Exporter bootstrap file 
    * 
    * This file is read by WordPress to generate the plugin information in the plugin 
    * admin area. This file also includes all of the dependencies used by the plugin, 
    * registers the activation and deactivation functions, and defines a function 
    * that starts the plugin. 
    * 
    * @since    1.0.0 
    * @package   CSV Export 
    * 
    * @wordpress-plugin 
    * Plugin Name:  CSV Export 
    * Plugin URI:  http://example.com/plugin-name-uri/ 
    * Description:  exports csvs derrr 
    * Version:   1.0.0 
    * Author:   Your Name or Your Company 
    * Author URI:  http://example.com/ 
    * License:   GPL-2.0+ 
    * License URI:  http://www.gnu.org/licenses/gpl-2.0.txt 
    * Text Domain:  csv-export 
    * Domain Path:  /languages 
    */ 
    class CSVExport { 
    
        /** 
        * Constructor 
        */ 
        public function __construct() { 
        if (isset($_GET['report'])) { 
    
         $csv = $this->generate_csv(); 
         header("Pragma: public"); 
         header("Expires: 0"); 
         header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
         header("Cache-Control: private", false); 
         header("Content-Type: application/octet-stream"); 
         header("Content-Disposition: attachment; filename=\"report.csv\";"); 
         header("Content-Transfer-Encoding: binary"); 
    
         echo $csv; 
         exit; 
        } 
    
    // Add extra menu items for admins 
        add_action('admin_menu', array($this, 'admin_menu')); 
    
    // Create end-points 
        add_filter('query_vars', array($this, 'query_vars')); 
        add_action('parse_request', array($this, 'parse_request')); 
        } 
    
        /** 
        * Add extra menu items for admins 
        */ 
        public function admin_menu() { 
        add_menu_page('Download Report', 'Download Report', 'manage_options', 'download_report', array($this, 'download_report')); 
        } 
    
        /** 
        * Allow for custom query variables 
        */ 
        public function query_vars($query_vars) { 
        $query_vars[] = 'download_report'; 
        return $query_vars; 
        } 
    
        /** 
        * Parse the request 
        */ 
        public function parse_request(&$wp) { 
        if (array_key_exists('download_report', $wp->query_vars)) { 
         $this->download_report(); 
         exit; 
        } 
        } 
    
        /** 
        * Download report 
        */ 
        public function download_report() { 
        echo '<div class="wrap">'; 
        echo '<div id="icon-tools" class="icon32"> 
    </div>'; 
        echo '<h2>Download Report</h2>'; 
        echo '<p><a href="?page=download_report&report=users">Export the Subscribers</a></p>'; 
        } 
    
        /** 
        * Converting data to CSV 
        */ 
        public function generate_csv() { 
        $csv_output = ''; 
        $table = 'wp_users'; 
    
        $result = mysql_query("SHOW COLUMNS FROM " . $table . ""); 
    
        $i = 0; 
        if (mysql_num_rows($result) > 0) { 
         while ($row = mysql_fetch_assoc($result)) { 
         $csv_output = $csv_output . $row['Field'] . ","; 
         $i++; 
         } 
        } 
        $csv_output .= "\n"; 
    
        $values = mysql_query("SELECT * FROM " . $table . ""); 
        while ($rowr = mysql_fetch_row($values)) { 
         for ($j = 0; $j < $i; $j++) { 
         $csv_output .= $rowr[$j] . ","; 
         } 
         $csv_output .= "\n"; 
        } 
    
        return $csv_output; 
        } 
    
    } 
    
    // Instantiate a singleton of this plugin 
    $csvExport = new CSVExport(); 
    

    だけのプラグイン/ csv_exportに入れcsv_export.phpというファイルを作成/あなたはGTGです!

    関連する問題