PHP для Postgres, передать переменную даты из формы в PHP, чтобы оправдать запрос - PullRequest
0 голосов
/ 11 октября 2011

Хорошо, так что я поставил этот бит кодирования. Это запрос PGSQL, который я использую в PHP для отображения на странице HTML. Я использую правильный PHP, чтобы он отображался для введенной вручную даты. Что я хочу сделать, это заменить последнюю строку PGSQL:

SELECT cm."ID",a."ID" as "DSI",cm."Date",c."Amount",ct."Name" as "Name",cm."Comments" as "Comments"
FROM "Memo" cm
LEFT JOIN "Credit" c ON (c."ID" = cm."CreditID")
LEFT JOIN "Account" a ON (c."AccountID" = a."ID")
LEFT JOIN "CreditMemoReason" ct ON (ct."ID" = cm."CreditMemoReasonID")
WHERE cm."Date" >= '2011-09-01' AND cm."Date" < '2011-10-01';

Я хочу, чтобы переменная передавалась из HTML-формы в PHP, чтобы после того, как пользователь нажмет кнопку «Отправить», запрос выполняется с выбранной датой. На самом деле выше показывает полную дату. Я только хочу, чтобы выбор был месяц только из выпадающего списка выбора, и тогда введенная дата будет с 2011-09-01 по 2011-10-01 как сентябрь, или с 2011-08-01 по 2011-09- 01 за август и тд. Мне действительно нужна помощь.

Мой php выглядит так прямо сейчас, чтобы отобразить запрос:

$result = pg_query($query) or die('Query failed: ' .
pg_last_error());
// Printing results in HTML
echo "<h2 align=center>Revenue Report</h2>";
echo "<table align=center border=1 solid width=500px>\n";
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);

Ответы [ 2 ]

0 голосов
/ 05 ноября 2014

HTML:

<select name="startdate">
<option value="2014-01-01">2014-01-01</option>
</select>

PHP:

$startdate = pg_escape_string($_REQUEST['startdate']);

$query = <<<SQL
SELECT cm."ID",a."ID" as "DSI",cm."Date",c."Amount",ct."Name" as "Name",cm."Comments" as "Comments"
FROM "Memo" cm
LEFT JOIN "Credit" c ON (c."ID" = cm."CreditID")
LEFT JOIN "Account" a ON (c."AccountID" = a."ID")
LEFT JOIN "CreditMemoReason" ct ON (ct."ID" = cm."CreditMemoReasonID")
WHERE cm."Date" >= {$startdate} AND cm."Date" < ({$startdate}+ interval '1 month')::date;
SQL;
0 голосов
/ 12 октября 2011

Вы можете использовать plpgsql функцию для этого (хранимая процедура).

Редактировать: намного проще, как это:

CREATE OR REPLACE FUNCTION f_test(integer)
  RETURNS TABLE(
 "ID"       integer  -- !guessing your data types, you may have to adjust!
,"DSI"      integer
,"Date"     date
,"Amount"   integer
,"Name"     text
,"Comments" text) AS
$BODY$
DECLARE
  mydate    date := (to_char(now(), 'YYYY') || '-' || $1::text || '-1')::date;
BEGIN

RETURN QUERY
SELECT cm."ID"
      ,a."ID" -- AS "DSI"
      ,cm."Date"
      ,c."Amount"
      ,ct."Name"
      ,cm."Comments"
  FROM "Memo" cm
  LEFT JOIN "Credit" c ON (c."ID" = cm."CreditID")
  LEFT JOIN "Account" a ON (c."AccountID" = a."ID")
  LEFT JOIN "CreditMemoReason" ct ON (ct."ID" = cm."CreditMemoReasonID")
 WHERE cm."Date" >= mydate AND cm."Date" < (mydate + interval '1 month')::date;

END;
$BODY$
  LANGUAGE plpgsql;

Вызов (на ноябрь):

SELECT * FROM f_test(11);

Основные моменты:

  • I Предположим, Вы хотите текущий год.Вы не сказали.
  • Редактировать: особого случая для декабря не требуется, просто добавьте интервал.
  • Если вы введете неправильный месяц, вы получите ошибку.
  • Будьте осторожны, неиспользовать параметры OUT в качестве неквалифицированных имен столбцов.(конфликт имен!) Вот почему я прокомментировал это: - AS "DSI"
  • Некоторые псевдонимы столбцов были избыточными

Общие рекомендации по функциям PostgreSQL

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