导出到PHP中的CSV更改
我正在用PHP进行导出到CSV的工作。我有工作正常的代码,它可以根据我的需要在ExcelSheet中输出。 代码段:导出到PHP中的CSV更改,php,phpmyadmin,export-to-csv,Php,Phpmyadmin,Export To Csv,我正在用PHP进行导出到CSV的工作。我有工作正常的代码,它可以根据我的需要在ExcelSheet中输出。 代码段: public function generate_csv() { $data_rows = array(); $table = 'ProductDetails'; $data_rows = array(); global $wpdb, $bp; $data= $wpdb->get_results("SELECT * FROM " . $tab
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]
谢谢你更全面的方法是使用双前肢
$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
}
///编辑
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
}
更全局的方法是使用双前额
$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
}
///编辑
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
}
可以使用虚拟信息_SCHEMA.COLUMNS表获取列名,如下所示:
“从INFORMATION\u SCHEMA.COLUMNS中选择COLUMN\u NAME,其中table\u NAME={$table}”
您可以使用virtual INFORMATION\u SCHEMA.COLUMNS表获取列名,如下所示:
“从INFORMATION\u SCHEMA.COLUMNS WHERE table\u NAME={$table}中选择COLUMN\u NAME”
这应该可以让您非常接近,如果不是全部的话。它将查询该表,为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;
}
这应该会让你非常接近,如果不是一直到那里的话。它将查询该表,为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;
}
如果您的表架构经常更改,或者人们没有将更改传达给涉众。。您需要确保列始终匹配,然后我解决这个问题的方法是连接到数据库,获取表的模式转储并将其保存为名称转换表,然后您可以使用该数组自动分配输出中的列标题。这是一个相当健壮的解决方案,但是为了构建翻译数组,您必须从模式结果的开始处修剪一些积垢。。?抱歉,这很愚蠢,但我在PHP的年龄只有一天。更多的问题是如何使用SQL来帮助您。。我会想出一些东西,并在稍后将其作为一个答案发布。如果您的表架构经常更改,或者人们没有将更改传达给利益相关者。。您需要确保列始终匹配,然后我解决这个问题的方法是连接到数据库,获取表的模式转储并将其保存为名称转换表,然后您可以使用该数组自动分配输出中的列标题。这是一个相当健壮的解决方案,但是为了构建翻译数组,您必须从模式结果的开始处修剪一些积垢。。?抱歉,这很愚蠢,但我在PHP的年龄只有一天。更多的问题是如何使用SQL来帮助您。。我会想出一个办法,并把它作为一个答案在一点点后发布。传奇兄弟。。你救了我的小屁股。。感谢您为标题行提供建议?$Header\u row=array(0=>'productCode',1=>'productTitle',2=>'productDescription',3=>'specification',4=>'whereToBuy');你能给我一个选项吗?请看更新后的答案:)在那之前我得到了解决方案,但我还是用你的答案测试了一下,它不起作用..Legend Bro。。你救了我的小屁股。。感谢您为标题行提供建议?$Header\u row=array(0=>'productCode',1=>'productTitle',2=>'productDescription',3=>'specification',4=>'whereToBuy');你能给我一个选项吗?请看更新后的答案:)在那之前我得到了解决方案,但我还是用你的答案进行了测试,它不起作用。它抛出一个错误警告:为C:\some path\plugins\Export\Export.php中的foreach()提供的参数无效,第101行是foreach($wpdb->get\u results($sql)as$colname){array_push($headers,$colname);}它应该将响应视为一个数组…或者我可能将错误的查询拉到了数组方法..我会在有更改时对其进行编辑,以便为其生成完整的测试用例。一旦您提出op,请告诉我们。谢谢thoughOK,我明白了,wpdb是一个特定于WordPress的模块,它似乎与我最常用的模块不同。我正在编辑e立即回答。致命错误:无法在C:\somePath\plugins\Export\Export.php的第102行使用stdClass类型的对象作为数组。它抛出一个错误警告:为C:\somePath\plugins\Export\Export.php的第101行的foreach()提供的参数无效
并且第101行是foreach($wpdb->get\u results($sql)as$colname){array\u push($headers,$colname);}它应该将响应视为一个数组…或者我可能将错误的查询拉到了数组方法..我会在有更改时对其进行编辑,以便为其生成完整的测试用例。一旦您提出op,请告诉我们。谢谢thoughOK,我明白了,wpdb是一个特定于WordPress的模块,它似乎与我最常用的模块不同。我正在编辑e立即回答。致命错误:无法在第102行的C:\somePath\plugins\Export\Export.php中将stdClass类型的对象用作数组