fputcsv и fwrite не работают
Я следовал приведенному здесь объяснению, чтобы записать результат запроса в файл. Но в этом случае я должен сначала открыть и записать заголовки файлов. Затем продолжайте писать / добавлять результаты запроса по одному для нескольких запросов. Эту добавочную часть я написал как функцию. Проблема в том, что мой скрипт записывает файл только с заголовками (из первой части), он не следует командам fputcsv, присутствующим в функции при его вызове. Можете ли вы помочь мне в решении этого.
Вот мой код, чтобы сначала открыть файл:
<?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);
?>
Спасибо
1 ответ
Ваша первая проблема заключается в том, что ваш дескриптор файла не имеет области действия внутри функции. На мой взгляд, лучший способ - передать это в функцию:
....
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_*. Они устарели (больше не используются) по нескольким причинам. У меня есть личный опыт замораживания соединения с базой данных, вызванного этим. Вы должны переключиться на MySQL или PDO.