【问题标题】:export a csv file from the mysql database using php使用 php 从 mysql 数据库中导出 csv 文件
【发布时间】:2014-08-26 16:33:42
【问题描述】:
<?php
    include("includes/config.php"); 
    if ($_POST['frmCsv']) {
        $strSelect = doSelectCsv();
        header( 'Content-Type: text/csv' );
        header( 'Content-Disposition: attachment;filename=export.csv' );
        $strRow = mysql_fetch_assoc( $strSelect );
        printArray($strRow);
        if ( $strRow ) {
            outputcsv( array_keys( $strRow ) );
        }
        while ( $strRow ) {
            outputcsv( $strRow ); 
        }
    }

    function doSelectCsv()
    {
        $strSql = "SELECT * FROM tbl_member";
        $strResult = SelectQry($strSql);
    }

    function outputcsv( $fields )
    {
        $separator = '';
        foreach ( $fields as $field ) {
            echo $separator . $field;
            $separator = ',';     
        }
    }
?>

这是我从数据库中导出 csv 文件的代码。但它无法选择数据。选择查询无法正常工作。请帮帮我。

【问题讨论】:

  • SelectQry() 是做什么的?在 doSelectCsv() 上写 return 并检查 fputcsv
  • 与其编写自己的CSV writer,不如使用PHP内置的fputcsv() function
  • Read the red box 在每个 mysql_* 页面上:扩展程序已弃用。不要再使用它了。使用替换:PDOmysqli_*(其中i 代表改进
  • 我使用选择查询来选择数据库中的数据。我把 return 放在函数上,但它不能工作,先生。

标签: php html mysql css


【解决方案1】:

一个问题是doSelectCsv() 没有返回任何东西,但是你有以下代码:

$strSelect = doSelectCsv();

然后在下面:

$strRow = mysql_fetch_assoc( $strSelect );

如果不知道SelectQry() 是什么,很难真正提出解决方案,但doSelectCsv() 必须返回一个值以供以后使用。也许以下就足够了:

function doSelectCsv()
{
    $strSql = "SELECT * FROM tbl_member";
    $strResult = SelectQry($strSql);
    return $strResult; // added this line
}

注意:PHP 的 MySQL 系列已被弃用,其支持将消失。请查看PDOMysqli

但是,如果我们查看 MySQL 代码,就会发现以下问题:

    $strRow = mysql_fetch_assoc( $strSelect );
    printArray($strRow);
    if ( $strRow ) {
        outputcsv( array_keys( $strRow ) );
    }
    while ( $strRow ) {
        outputcsv( $strRow ); 
    }

您使用mysql_fetch_assoc() 将第一行分配给$strRow,但是您永远不会获取其他行。我相信上面的内容应该是这样的:

    $strRow = mysql_fetch_assoc( $strSelect );
    printArray($strRow);
    if ( $strRow ) {
        outputcsv( array_keys( $strRow ) );
        while ($strRow = mysql_fetch_assoc($strSelect)) {
            outputcsv( $strRow ); 
        }
    }

这会将第一行的数组键发送到outputcsv(),然后我们遍历该if 块内的所有其他行以将其余数据发送到outputCsv。但同样,对于一个严肃的应用程序,请查看 PHP 提供的较新的扩展,因为 mysql_* 函数最终会消失。

另外,正如 cmets 中有人暗示的那样,PHP 有一个写入 CSV 数据的函数,即fputcsv()。这将处理任何特殊情况(如果数据项中有逗号怎么办?)。

【讨论】:

  • 选择查询正常工作。但不会在 mysql_fetch_assoc( $strSelect ) 函数上获取数据。
  • @harikrishnan 我已添加到我的答案中以解决 MySQL 问题。
  • 它在文件中选择我的整个编码。但它无法选择数据库中的数据
  • 请在编码中进行一些更改以导出文件。
  • 如何在此编码中使用 fputcsv()?...请帮助我。
【解决方案2】:

就用吧兄弟:)

<?php

if($_POST["download"]){ 
        $output="";
        $line_termineted="\n";

        if( $_POST["download"] =="CSV") $field_termineted=","; else $field_termineted="\t"; 
            $enclosed='"';
            $escaped="\\";

            $export_schema="SR No".$field_termineted."Student ID".$field_termineted."First Name".$field_termineted."Middle Name".$field_termineted."Last Name";
            $dataQuery=mysql_query("select * from sof_student ");
            $output.=$export_schema;
            $p=0;
            while($data=mysql_fetch_array($dataQuery)) {
             $p++;
                $output.= $line_termineted.$p.$field_termineted;
                $output.=$enclosed.$data["id"].$enclosed.$field_termineted;
                $output.=$enclosed.$data["first_name"].$enclosed.$field_termineted;
                $output.=$enclosed.$data["middle_name"].$enclosed.$field_termineted;
                $output.=$enclosed.$data["last_name"].$enclosed.$field_termineted;
              }

    header("Content-Description: File Transfer");
   if( $_POST["download"] =="CSV"){
        header("Content-Type: application/csv");
        header("Content-Disposition: attachment; filename=report".date("d_m_Y_H_i_s").".csv");
    } else {
        header("Content-Type: application/vnd.ms-excel");
        header("Content-disposition: attachment; filename=report".date("d_m_Y_H_i_s").".xls");
    }

    header("Content-Transfer-Encoding: binary");
    header("Expires: 0");
    header("Cache-Control: must-revalidate");
    header("Pragma: public");
    header("Content-Length: ".strlen($output));
    ob_clean();
    flush();
    echo $output;
    exit;
}
 ?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 2011-04-16
    • 2017-01-21
    • 1970-01-01
    相关资源
    最近更新 更多