Использование php для выполнения запроса Postgres и получения результата для загрузки - PullRequest
0 голосов
/ 25 октября 2011

Я получил запрос, что в одном сценарии я выполняю запрос, и он отображает результаты в виде таблицы с данными, заголовками и т. Д. ... Второй сценарий, который я хочу создать, - это прямая ссылка для загрузки, которая выполнит запрос ипоместите результаты в файл .csv для сохранения или открытия в Excel.У меня уже есть код для дисплея, но мне интересно, как сделать так, чтобы он был загружен для пользователя.

Вот небольшой фрагмент кода для выполнения и отображения.

    <?php
    $month = $_POST['mydate'];
    $monthfrm = date("Y-m-d", strtotime($month));
    $monthhd = date("F", strtotime($month));
    $monthto = date("Y-m-d", strtotime("$monthfrm . +1 month"));
    $date = date("F j,Y");
    if ($_POST['credsubmit']) {
       print('<head>');
       print('<link href="helper.css" media="screen" rel="stylesheet" type="text/css" />');
       print('<link href="dropdown.css" media="screen" rel="stylesheet" type="text/css" />');
       print('<link href="default.css" media="screen" rel="stylesheet" type="text/css" />');
    // Connecting, selecting database
       $dbconn = pg_connect("yeah we all know what goes here");
         if (!$dbconn) {
          die('Could not connect: ' . pg_last_error());
          }// Performing SQL query
     $query = "
       SELECT cm.\"ID\",a.\"ID\" as \"DDI\",cm.\"Date\",c.\"Amount\",ct.\"Name\" as \"Name\",cm.\"Comments\" as \"Comments\"
       FROM \"BIL_CreditMemo\" cm
       LEFT JOIN \"BIL_Credit\" c ON (c.\"ID\" = cm.\"BIL_CreditID\")
       LEFT JOIN \"ACT_Account\" a ON (c.\"ACT_AccountID\" = a.\"ID\")
       LEFT JOIN \"BIL_val_CreditMemoReason\" ct ON (ct.\"ID\" = cm.\"BIL_val_CreditMemoReasonID\")
       WHERE cm.\"Date\" >= '$monthfrm' AND cm.\"Date\" < '$monthto';
       ";
       $result = pg_query($query) or die('Query failed: ' . pg_last_error());
       // Printing results in HTML
       echo "<h2 align=center style=margin-top:20>Credit Memo Report for: $monthhd</h2>";
       echo "<table align=center width=60%>\n";
       print('<tr class="trstyle"><td>ID</td><td>DDI</td><td>Date</td><td>Amount</td><td>Name</td><td>Comments</td></tr>');
       while ($line = pg_fetch_array($result, null, PGSQL_ASSOC)) {
       echo "\t<tr>\n";
         foreach ($line as $col_value) {
           echo "\t\t<td>$col_value</td>\n";
         }
       echo "\t</tr>\n";
      }
      echo "</table>\n";// Free resultset
      pg_free_result($result);// Closing connection
      pg_close($dbconn);
      }
      ?>

Так чтоэто то, что я до сих пор и хочу сделать результаты прямой загрузки в CSV-файл?Любая помощь с благодарностью.

Ответы [ 2 ]

0 голосов
/ 25 октября 2011
  1. Используйте функцию header () , чтобы сообщить браузеру, что вывод будет потоком октетов.
  2. Используйте fputcsv () для записиРезультаты запроса во временный файл в формате CSV.
  3. Отправьте содержимое файла с помощью readfile () .

Альтернативно, есть способчтобы fputcsv () записывал свои данные непосредственно в STDOUT, но это займет немного времени, но позволит вам пропустить использование временного файла.В любом случае, я бы прочитал примеры для readfile (), так как это поможет вам настроить заголовки для запуска «загрузки файла», которую вы ищете.

0 голосов
/ 25 октября 2011

Вам нужно установить несколько заголовков HTTP, а затем просто отобразить данные CSV.Например,

<?php
header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=test.csv");
header("Pragma: no-cache");
header("Expires: 0");


echo "Name,Favourite Colour\n";
echo "Phil,Blue\n";
?>

Обратите внимание, что если вы специально ориентируетесь на Excel, то есть библиотеки, которые позволят вам создавать файлы .xls;Мне очень нравится PHPExcel

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...