2013-07-03 3 views
2

나는 here 주어진 설명을 따라 파일에 쿼리 결과를 작성했습니다. 하지만이 경우에는 먼저 파일 헤더를 열고 작성해야합니다. 그런 다음 여러 쿼리에 대해 쿼리 결과를 하나씩 작성/추가하는 작업을 계속하십시오. 이 추가 부분은 필자가 함수로 쓴 것입니다. 스크립트가 헤더 (첫 번째 부분부터 만)로 파일을 쓰는 문제는 호출 될 때 함수에있는 fputcsv 명령을 따르지 않습니다. 이 문제를 해결할 때 저를 도울 수 있습니까? 그런 다음 쿼리 부분은 (내가 같은 쿼리 부품의 여러 동일한 기능을 호출 각각이) 이런 식으로 어느 정도입니다fputcsv 및 fwrite가 작동하지 않습니다.

<?php 
$fp = fopen('php://output', 'w'); 
$headers = array("Index","Gene_symbol","Gene_Name","Human_entrez","Rat_entrez","Mouse_entrez","DbTF","PMID"); 
header('Content-Type: text/csv'); 
header('Content-Disposition: attachment; filename="export.txt"'); 
fputcsv($fp, $headers,chr(9)); 
header('Pragma: no-cache'); 
header('Expires: 0'); 
?> 

:

<?php 
if (is_numeric($sterm)) 
    { 
     $query="select * from tf where entrez_id_human=$sterm || entrez_id_rat=$sterm || entrez_id_mouse=$sterm"; 
     $result=mysql_query($query) or die(mysql_error()); 
     if (mysql_num_rows($result)==0) 
      {echo "<tr><td align='center' colspan=6> $sterm not found! </td> </tr>";} 
     elseif (mysql_num_rows($result)>0) 
     {result_disp($result);} 
    } 
?> 
다음

먼저 파일을 열 수있는 내 코드입니다

<?php 
function result_disp($results) 
{ 
if($fp && $results) 
{ 
while ($rows = mysql_fetch_row($results)) 
    { 
     fputcsv($fp, array_values($rows),chr(9)); 
    } die; 
} 
} 

그리고 마지막으로 닫기 : 다음 기능을 통해 파일에 결과를 기록 은

여기 스크립트의 끝에서

fclose($fp); 
?> 

감사

파일
+0

$ fp는 (는) 귀하의 기능에서 사용할 수 없습니다. error_reporting을 현명한 디버깅 값 (E_ALL)으로 설정하면 PHP가 이와 같은 내용을 알려줍니다. 그리고 가변 범위의 기본에 대해 읽어보십시오. http://www.php.net/manual/en/language.variables.scope.php – CBroe

+0

또한 csv-headers는 HTTP 헤더 사이에 있습니다. 후자가 줄 바꿈으로 구분 된 후에 배치해야합니다. – Caramiriel

+0

고마워, 내가 코드의 시작 부분에 error_reporting (E_ALL) 시도했는데 오류를보고하지 않았다 :(. 둘째 페이지 변수 전역에 제안 된 두 번째로 filehandle $ fp 전역 선언 할 수없는 경우 찾을 수 없습니다. 전역 $ fp는 함수 내부와 외부에서 모두 가능하지만 도움이되지 못했습니다. 어떻게하면 글로벌하게 만들 수 있습니까? 감사합니다. –

답변

0

첫 번째 문제는 파일 핸들이 함수 내 범위를하지 않는다는 것입니다. 내 생각에 가장 좋은 방법은 함수에 전달하는 것입니다.

.... 
    elseif (mysql_num_rows($result)>0) 
    {result_disp($result, $fp);} 
.... 

function result_disp($results, $fp) 
{ 
if($fp && $results) 
{ 
while ($rows = mysql_fetch_row($results)) 
    { 
     fputcsv($fp, array_values($rows),chr(9)); 
    } //DO NOT PUT "die()" HERE 
} 
} 

두 번째 문제는 함수 내부의 "die()"문입니다. "die()"의 목적은 스크립트를 완전히 중지하는 것입니다. 그것은 PHP 자살입니다. 따라서 스크립트를 종료하면 result_disp의 첫 번째 호출이 끝날 때 스크립트가 중단됩니다. 즉, fclose ($ fp)에 결코 도달하지 않을뿐만 아니라 result_disp에 대한 다른 호출을 결코 얻지 못할 것입니다.

세 번째 문제는 mysql_ * 함수를 사용하고 있다는 것입니다. 이들은 몇 가지 이유로 더 이상 사용되지 않습니다 (더 이상 사용되지 않음). 개인적으로 데이터베이스 연결이 끊어지는 경험이 있습니다. mysqli 또는 PDO으로 전환해야합니다.

관련 문제