Php fwrite($fp,$schema_insert)不工作
我使用这段代码从DB中获取数据并下载xls文件,但它并没有将我的实际数据写入工作表。我认为它不起作用。我应该在代码中添加更多内容吗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
<?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()而不是“自己滚动”