Php fwrite($fp,$schema_insert)不工作

Php fwrite($fp,$schema_insert)不工作,php,mysql,Php,Mysql,我使用这段代码从DB中获取数据并下载xls文件,但它并没有将我的实际数据写入工作表。我认为它不起作用。我应该在代码中添加更多内容吗 <?php include 'functions.php'; ob_start(); ?> <?php if($_POST['types'] == 'name') { $query = "SELECT * FROM visitor_detail WHERE name='".$_POST['filter']."' ORDER B

我使用这段代码从DB中获取数据并下载xls文件,但它并没有将我的实际数据写入工作表。我认为它不起作用。我应该在代码中添加更多内容吗

 <?php 
include 'functions.php';
 ob_start();

?>
<?php
if($_POST['types'] == 'name') {  

    $query = "SELECT * FROM visitor_detail WHERE name='".$_POST['filter']."' ORDER BY id DESC ";  
}  
elseif($_POST['types'] == 'mobile') {  

    $query = "SELECT * FROM visitor_detail WHERE mobile='".$_POST['filter']."' ORDER BY id DESC ";  
} 
elseif($_POST['types'] == 'OccasionType') {  

    $query = "SELECT * FROM visitor_detail WHERE OccasionType='".$_POST['filter']."' ORDER BY id DESC ";  
} 

elseif($_POST['types'] == 'InquiryDate') {  
    $query="SELECT * FROM visitor_detail WHERE TodayDate between '".$_POST['From']."' and '".$_POST['TO']."' ORDER BY id DESC " ;  
}

 elseif($_REQUEST['types'] == 'OccasionDate') {  
    $query="SELECT * FROM visitor_detail WHERE date between '".$_POST['From']."' and '".$_POST['To']."' ORDER BY id DESC ";  
                            }
else {  
    $query = "SELECT * FROM visitor_detail ORDER BY id DESC ";  
    } 

$result = mysql_query($query); 

$sep = "\t"; //tabbed character 
$fp = fopen('database.xls', "w"); 
$schema_insert = ""; 
$schema_insert_rows = ""; 
//start of printing column names as names of MySQL fields

//start of adding column names as names of MySQL fields 
for ($i = 1; $i < mysql_num_fields($result); $i++) 
{ 
$schema_insert_rows.=mysql_field_name($result,$i) . "\t"; 
} 
$schema_insert_rows.="\n"; 
echo $schema_insert_rows; 
fwrite($fp, $schema_insert_rows); 
//end of adding column names

while($row = mysql_fetch_row($result))
{
$schema_insert = ""; 
for($j=1; $j<mysql_num_fields($result);$j++) 
{ 
if(!isset($row[$j])) 
$schema_insert .= "NULL".$sep; 
elseif ($row[$j] != "") 
$schema_insert .= strip_tags("$row[$j]").$sep;
else 
$schema_insert .= "".$sep; 
} 
$schema_insert = str_replace($sep."$", "", $schema_insert); 

//this corrects output in excel when table fields contain \n or \r 
//these two characters are now replaced with a space 

$schema_insert = preg_replace("/\r\n|\n\r|\n|\r/", " ", $schema_insert); 
$schema_insert .= "\n"; 
//$schema_insert = (trim($schema_insert)); 
//print $schema_insert .= "\n"; 
//print "\n";

fwrite($fp,$schema_insert); }

fclose($fp);

header('Content-Type: application/xls');
header('Content-Disposition: attachment; filename=my.xls');
header('Pragma: no-cache');

?>


可能服务器不允许您写入文件。您只能从数据库中查询数据并将其格式化为表,然后使用header函数下载数据。

两个误解:

  • 也许这个功能叫做“下载Excel文件”,但这并不意味着你必须创建一个真正的文件

  • PHP不会神奇地将您在服务器端创建的所有文件发送到浏览器

  • 摆脱所有与文件相关的代码,只需更改以下内容:

    fwrite($fp,$schema_insert);
    
    。。。为此:

    echo $schema_insert;
    
    另外,将这些行移到第一个回声之前:

    header('Content-Type: application/xls');
    header('Content-Disposition: attachment; filename=my.xls');
    header('Pragma: no-cache');
    

    编辑:尽管多次提到XLS格式,但所讨论的代码基本上创建了一个CSV文件,并使用假HTTP头发送该文件,以欺骗Excel打开它。正如Mark指出的那样,PHP有一个很好的解决方案,因此您不必自己编写代码。此函数需要一个文件指针,但同样:您可以使用
    php://output
    作为文件名,所有内容都将自动发送到浏览器。

    您正在写入文件,但没有对该文件执行任何操作。简单地在服务器上写入一个文件并不会自动将该文件显示给客户端browser@MarK贝克:那么,我应该怎么做才能将数据……提取到正确的格式呢???一个显而易见的答案是,在发送了头文件之后,读取file()您的“database.xls”文件;但是,如果两个客户端同时请求下载,那么这里有一个缺陷。请检查这个:或者为什么首先使用一个文件?为什么不直接将输出的每一行发送到客户端的浏览器(首先发送标题);特别是当你没有使用fputcsv()或类似的东西,这将使你的生活更容易。。。即使你是,你也可以写信给php://output 除了一个磁盘文件,你能麻烦提供下载代码和这个故事吗?你可以使用“echo”功能来形成一个表,然后使用
    code
    header('Cache-Control:无缓存,必须重新验证');标题('Content-type:application/vnd.ms-excel');标题('Content-Disposition:filename=test.xls');不,实际上它允许我写入文件…因为firsr fwrite()可以工作..这就是我得到列名的原因..但是第二个fwrite()实际上不工作..我不知道knwwhy@DeadMan谢谢你,我是一个新手。别忘了这是值得定义的php://output 作为文件名而不是database.xls,对于发出多个请求的情况concurrently@MarkBaker-我想你误读了我的答案。我基本上说的是根本不需要文件。没错,我的错误——尽管使用的文件名是php://output 可以允许OP使用fputcsv()而不是“自己滚动”