0

如果页面不包含任何其他内容,则此代码可以正常工作。当我添加一个 html 表单时,它只将 html 内容提供给 excel。我需要使用该表单来自定义查询。如何使此代码与 html 内容一起使用?

<?php
if (isset($_POST['excel'])){
mysql_connect("localhost", "root", "") or die(mysql_error());
mysql_select_db("dbname") or die(mysql_error());
mysql_query("SET NAMES 'LATIN5'");
mysql_query("SET character_set_connection = 'LATIN5'");
mysql_query("SET character_set_client = 'LATIN5'");
mysql_query("SET character_set_results = 'LATIN5'");

$select = "query here";

$export = mysql_query ( $select ) or die ( "Sql error : " . mysql_error( ) );


$fields = mysql_num_fields ( $export );

for ( $i = 0; $i < $fields; $i++ )
{
    $header .= mysql_field_name( $export , $i ) . "\t";
}

while( $row = mysql_fetch_row( $export ) )
{
    $line = '';
    foreach( $row as $value )
    {                                            
        if ( ( !isset( $value ) ) || ( $value == "" ) )
        {
            $value = "\t";
        }
        else
        {
            $value = str_replace( '"' , '""' , $value );
            $value = '"' . $value . '"' . "\t";
        }
        $line .= $value;
    }
    $data .= trim( $line ) . "\n";
}
$data = str_replace( "\r" , "" , $data );

if ( $data == "" )
{
    $data = "\n(0) Records Found!\n";                        
}

header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=your_desired_name.xls");
header("Pragma: no-cache");
header("Expires: 0");
print "$header\n$data"; }

?>
4

1 回答 1

2

正如评论中所提到的,将 HTML 和 CSV 结合起来是不可能的

但是,您似乎只在发布表单 ($_POST['excel']) 时才输出 CSV。您应该在输出 CSV 后“停止”PHP 脚本,如下所示:

if($_POST['excel']) {
    // query and output CSV 
    //...


    exit(); //done outputting csv
}

// regular HTML form here; will only be output if NO form is sent

使用这种方法,您的脚本将:

  • 如果在未发送表单的情况下访问,则输出 HTML 表单
  • 如果表单已提交,则输出 CSV。

但是,您可以重新考虑将这两个功能放在同一个 PHP 脚本中。在另一个脚本(例如 download_csv.php)中输出 CSV 并将表单的“操作”设置到该位置可能是一种更好的方法;

<form action='download_csv.php'>

[更新] 要根据表单输入输出 HTML 或 CSV,您可以考虑这样做:

if($_POST['excel']) {
    // query and output CSV 
    include 'csv-exporter.php';
    exit(); //done outputting csv
} else if ($_POST['html']) {
    // query and output HTML
    include 'html-exporter.php';
    exit(); //done outputting html
}

但是,这样“查询”部分将被复制。在这种情况下,最好将查询和“格式化”部分分开。您可以通过将它们放在一个函数中并使用其结果来做到这一点,例如:

if($_POST['excel']) {
    outputCSV(getResultsFromDatabase());
    exit();
} else if ($_POST['html']{
    outputHtmlList(getResultsFromDatabase());
    exit();
}

这些函数可以放在单独的文件中,并使用 PHP 的“包含”功能包含在内。

两者都只是为了说明所有目的,对于您的原始问题来说有点偏离主题。

于 2013-02-17T11:58:29.630 回答