-2

このコードを使用して 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');

?>
4

2 に答える 2

1

2 つの誤解:

  1. おそらく、この機能は「Excel ファイルのダウンロード」と呼ばれていますが、それは実際のファイルを作成する必要があることを意味するものではありません。

  2. PHP は、サーバー側で作成したすべてのファイルを魔法のようにブラウザーに送信するわけではありません。

ファイル関連のコードをすべて取り除き、これを変更するだけです。

fwrite($fp,$schema_insert);

...これに:

echo $schema_insert;

また、次の行を最初の の前に移動しますecho

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

編集: XLS 形式についていくつか言及されていますが、問題のコードは基本的に CSV ファイルを作成し、それを偽の HTTP ヘッダーで送信して、Excel をだましてそれを開かせます。Mark が指摘するように、PHP にはCSV ファイルを作成する組み込み関数があるため、自分でコードを記述する必要はありません。この関数はファイル ポインターを想定していますが、実際にファイルを作成する必要はありません。ファイル名としてfopen()を呼び出すphp://outputと、すべてが自動的にブラウザーに送信されます。

于 2013-03-15T10:25:55.927 に答える
0

サーバーがファイルの書き込みを許可していない可能性があります。データベースからデータをクエリしてテーブルにフォーマットし、ヘッダー関数を使用してダウンロードすることしかできません。

于 2013-03-15T10:17:54.603 に答える