0

ユーザーがインベントリを検索したときに生成された結果 (テーブル) のダウンロードを許可しようとしています。ボタンをクリックして、結果を CSV ファイルにダウンロードできるようにしたいと考えています。クエリを実行した直後に PHP コードを追加すると、CSV ファイルを生成できます。ただし、このボタンをページの別の場所に配置する必要があるため、検索の直後ではなく、クエリ結果を送信するこの関数を呼び出すことができるようにしたいと考えています。

これを行うと、ファイルを生成できます。

function output_csv ($data) {
  $filename = "exportfile.csv";
  $handle = fopen($filename, 'w+');
  fputcsv($handle, array('UserID','UserName'));
  foreach($row = $data->fetch(PDO::FETCH_ASSOC)) {
     fputcsv($handle, array($row['UserID'], $row['UserName'])); 
  }
  fclose($handle);
}

PHPはサーバー側であることを知っているので、ボタンと同じページにある場合、onclickでこの関数を呼び出すことはできません。したがって、この関数を onclick から呼び出すことができる別のファイルに入れる必要があると考えていました。しかし、$data (クエリ結果) を渡す方法がわかりません。変数を文字列に変換できないというメッセージが表示され続けます。

$file_array=$db->prepare("SELECT UserID, UserName FROM UserProfile");
$file_array->execute();
<button type="button" onclick="download_file.php?pass_array=<?php echo $file_array; ?>)">Click Me</button>

したがって、私の問題は、クエリの結果を自分のページまたは別のページの output_csv 関数に送信してファイルに書き込む方法がわからないことです。

ありがとう、

4

2 に答える 2

1

次の 3 つの問題があります。

  1. onclick は JavaScript を想定しており、URL を指定するだけです。小さなフォームで試してみませんか?
  2. これ$file_arrayPDOStatementであり、最初にfetchAll()またはfetch( ) によってデータを取得し、次にjson_encode()およびhtmlspecialchars( )でエンコードする必要があります。
  3. foreach形式が間違っています。

次のことを試してください。

<?php
$file_array=$db->prepare("SELECT UserID, UserName FROM UserProfile");
$file_array->execute();
?>
<form method="POST" action="download_file.php">
    <input type="hidden" name="pass_array" value="<?php
        echo htmlspecialchars(json_encode($file_array->fetchAll(PDO::FETCH_NUM));
    ?>">
    <input type="送信">
</フォーム>

でデータを取得するにはdownload_file.php:

関数 output_csv ($data) {
  $filename = "exportfile.csv";
  $handle = fopen($filename, 'w+');
  fputcsv($handle, array('UserID','UserName'));
  foreach($data as $row) {
     fputcsv($ハンドル、$行);
  }
  fclose($ハンドル);
}
$file_array = json_decode($_REQUEST['pass_array']);
output_csv($file_array);

投稿フォームのもう 1 つの利点は、データが目に見えない方法で転送されることです。そのため、ブラウザに非常に長くて奇妙な URL が表示されることはありません。また、転送できるデータ量も大幅に増加します。

于 2013-08-08T21:54:40.413 に答える
0

最初にボタンの代わりにアンカータグを配置します

$file_array=$db->prepare("SELECT UserID, UserName FROM UserProfile");
$file_array->execute();
 $result = $file_array->fetch(PDO::FETCH_ASSOC);
<a  href="download_file.php?pass_array=<?php echo urlencode(json_encode($result)); ?>">Click Me</a>

あなたのdownload_file.phpで

if(!empty($_REQUEST['pass_array'])){
 $arraydata=json_decode(urldecode($_REQUEST['pass_array']));
output_csv ($arraydata);
}
function output_csv ($data) {
  $filename = "exportfile.csv";
  $handle = fopen($filename, 'w+');
  fputcsv($handle, array('UserID','UserName'));
  foreach($data as $row) {
     fputcsv($handle, array($row['UserID'], $row['UserName'])); 
  }
  fclose($handle);
}

うまくいくことを願っています

pdostatement.fetch

于 2013-08-08T21:53:55.757 に答える