-1

私はこのサイトを調べて、これと同じことについてたくさんのスレッドを見つけましたが、答えを適切に理解していないため、私のような完全な初心者を実際に助けるものはありません.

データベースからデータを選択し、Web ページの表に表示しました。このテーブルの下に、このデータを CSV ファイルにエクスポートするためのリンクが必要です。

このサイトで見つけた答えの 1 つは、PHP でユーザー用の CSV ファイルを作成することです。

しかし、答えは私には意味がなく、コードをどうするかわかりません。

その答えのコードは次のとおりです。

header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=file.csv");
header("Pragma: no-cache");
header("Expires: 0");

$array = array(
    array("data11", "data12", "data13"),
    array("data21", "data22", "data23"),
    array("data31", "data32", "data23"));
outputCSV($array);

function outputCSV($data) {
    $outstream = fopen("php://output", "w");
    function __outputCSV(&$vals, $key, $filehandler) {
        fputcsv($filehandler, $vals); // add parameters if you want
    }
    array_walk($data, "__outputCSV", $outstream);
    fclose($outstream);
}

最初に Excel ファイルを作成する必要がありますか? などの質問がたくさんあります。もしそうなら、空白にする必要がありますか?

これは何ですか?:

$array = array(
    array("data11", "data12", "data13"),
    array("data21", "data22", "data23"),
    array("data31", "data32", "data23"));

これは私のデータでしょうか?私が持っているデータに合わせてそれを変更するにはどうすればよいですか?

関数が定義される前に関数が呼び出されるのはなぜですか?

関数内のこれらの変数 ($vals、$key、$filehandler) は何ですか? また、それらはどこで作成されますか?

非常に多くの人が完璧だと思っているように見えるので、このコードをどのように使用すればよいでしょうか。

私は完全なPHP初心者なので、最初から最後まで助けが必要です

私は以下の答えの1つに取り組みましたが、今ではこのコードがあります

$i=0;
                        $csv="";
                        for ($a=0; $a<=$count; $a++) {
                            $i++;
                            $csv.=preg_replace("/\n/",'',preg_replace("/,/",';',$serveys[$a]['FeedbackName'])).",".
                                  preg_replace("/\n/",'',preg_replace("/,/",';',$serveys[$a]['BranchName']));
                            $csv.="\n";
                        }

                        if ($i>0) {
                            header("Pragma: public");
                            header("Expires: 0");
                            header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
                            header("Cache-Control: private",false);
                            header("Content-Type: application/octet-stream");
                            header("Content-Disposition: attachment; filename=\"table.csv\";" );
                            header("Content-Transfer-Encoding: binary");

                            echo $csv;
                        } else {
                            return "Nothing to download!";
                        }

変更はありませんがページを実行すると、データはそのままページに表示されます。ただし、csvファイルは作成されず、エラーは発生しません

4

4 に答える 4

1

このコードは、標準出力に出力する新しいファイル オブジェクトを作成し、以前にヘッダーが送信されたため、ダウンロードとしてユーザーに提供されます。

それはあなたのデータです。連想配列の配列。どのように埋めるかはあなた次第です。

PHPは最初にファイルを最上位で完全に解析するため、関数の呼び出しは定義される前です。したがって、関数は呼び出されたときに実際に定義されます。これは、if ステートメント内の関数には適用されません。

関数への値は、標準関数 fputcsv によって提供されます。

提示されたものとほぼ同じコードを使用します。

于 2013-05-14T13:43:54.297 に答える
0

このheader関数は、応答に関する追加情報をユーザー エージェントに送信するために使用されます。これらの追加情報はHTTP header-fieldsとして渡されます。ヘッダーを参照してください。

header("Content-type: text/csv");: このコードは、受信するコンテンツが CSV ファイルであることをユーザー エージェント (ブラウザー) に伝えます。コンテンツ タイプを参照してください。

header("Content-Disposition: attachment; filename=file.csv");: このコードは、ユーザー エージェント (ブラウザー) に、このコンテンツを添付ファイルとして受信すること、およびこの添付ファイルの名前が であることを伝えていますfile.csv。ブラウザーは、ブラウザーの設定に応じて、このコンテンツをダウンロード フォルダーに保存するか、そのファイルをローカルに保存するようにユーザーに要求する場合があります。Content-Dispositionを参照してください

header("Pragma: no-cache");: HTTP/1.1 に準じます。仕様では、このディレクティブは と同じ意味を持ちCache-Control: no-cacheます。このPragma: no-cacheディレクティブは、HTTP/1.0 との下位互換性のために使用されます。プラグマを参照

header("Expires: 0");このコードは、ユーザー エージェントが生成されたコンテンツをキャッシュするのを防ぎます。そのため、ブラウザは、ユーザーがコンテンツを要求するたびにサーバーにリクエストを送信します。有効期限を参照してください。

$array = array(
        array("data11", "data12", "data13"),
        array("data21", "data22", "data23"),
        array("data31", "data32", "data23"));

このコードは、3x3 の 2 次元配列、つまり 3 行 3 列を作成します。

outputCSV($array);: このコードはoutputCSV関数を呼び出し、2 次元配列をパラメーターとして渡します。

$outstream = fopen("php://output", "w");: fopen 関数は、読み取りまたは書き込み用にファイルを開くために使用されます。この関数はそのファイルのハンドラーを返すため、そのファイルで i/o 操作を実行できます。fopenを参照

を使用"php://output"すると、ファイルハンドラーでの書き込み操作が標準出力で行われることを PHP に伝えます。したがって、コマンドfwrite($fhandler, "Hello World!")の結果は同じですecho "Hello World!"php://を参照してください

"w"、ファイルが書き込み操作専用に開かれていることを意味します。

array_walk($data, "__outputCSV", $outstream)最初のパラメーターとして渡された配列のすべての要素に対して関数を実行するために使用されます。そのようにして、fputcsv を実行する __outputCSV 関数を実行します。array_walkを参照

は、配列のfputcsv内容をファイルに書き込みます。配列の各要素は区切り文字で区切られます。デフォルトの区切り文字は , (コンマ) です。fputcsvを参照

3x3 の配列があるため、 は関数を 3 回array_walk実行します。fputcsvの初回array("data11", "data12", "data13")、2 回目array("data21", "data22", "data23")、および の最終回array("data31", "data32", "data23")

次に、fputcsvは次のように出力します。

"data11","data12","data13"
"data21", "data22", "data23"
"data31", "data32", "data23"

最後に、fclose使用されます。これにより、以前に送信されたバッファリングされたデータが出力されfputcsv、ファイルが閉じられます。fcloseを参照

于 2013-05-14T16:36:16.420 に答える
0

The part you highlighted is a two-dimensional array of values, much like a spreadsheet (or a CSV file in this case). The outermost array holds together arrays that you can imagine as rows. Every value in that array is written to a column. So from this:

$array = array(
  array("data11", "data12", "data13"),
  array("data21", "data22", "data23"),
  array("data31", "data32", "data23"));

, you would get a table like this:

----------------------------
| data11 | data12 | data13 |
----------------------------
| data21 | data22 | data23 |
----------------------------
| data31 | data32 | data33 |
----------------------------

How you're changing this data depends on how you got the data from the database that you mention, but the basic principle is the same: put all the data in an array, have one array for each row, and have the values in that row inside the row array.

The variables are the parameters passed to the callback function you give to the array_walk function. array_walk takes an array, iterates over every item in it, and applies a function on the item, in this case, it walks over the array of rows, and writes every row array as CSV to the opened file. So $vals will always contain the row array, $key is ignored here but it would contain the index or key of the array item accessed, and $filehandler is the $outstream variable passed in, which is the open file handler used to write the values to a file.

Lastly, in PHP you can define functions later than they are used, as long as they are in the same scope.

于 2013-05-14T13:50:21.027 に答える
0

3 行目 - データベースへのクエリ (これは、データベースへの接続方法に依存します。私はクラスを使用しています)
4 行目 - データの取得 (これは、データベースへの接続方法に依存します)

ただし、接続を使用してデータをフェッチするだけで、データベースからデータを表示せずに変数に追加できます$csv.='some string'。すべてのデータを取得すると、headers が表示され (csv ファイルが作成されます)、すべてのデータが表示されます。

","- new cell
"\n"- new line
を使用した理由preg_replaceは、データベース内のセルが の場合,、このコンマが新しいセルを作成し、それを望まないため、 で置き換えることができるためです;

csv ファイルを作成する必要はありません。ファイルの名前はこの行にありますheader("Content-Disposition: attachment; filename=\"table.csv\";" );-table.csv

$i=0;
$csv="";
$res=$db->query('SELECT * FROM `table_name`');
while ($row=$res->fetch()) {
    $i++;
    $csv.=preg_replace("/\n/",'',preg_replace("/,/",';',$row['col1'])).",".
                preg_replace("/\n/",'',preg_replace("/,/",';',$row['col2'])).",".
                preg_replace("/\n/",'',preg_replace("/,/",';',$row['col3'])).",".
                preg_replace("/\n/",'',preg_replace("/,/",';',$row['col4'])).",".
                preg_replace("/\n/",'',preg_replace("/,/",';',$row['col5']));
    $csv.="\n";
}

if ($i>0) {
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: private",false);
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"table.csv\";" );
    header("Content-Transfer-Encoding: binary");

    echo $csv;
} else {
    return "Nothing to download!";
}
于 2013-05-14T13:45:05.717 に答える