Создание записей SQL появляется только после текущей даты - для страницы «локальных событий» - PullRequest
0 голосов
/ 20 октября 2011

Я делал страницу событий для сайта сообщества, который я создаю.Это позволяет им создавать новые записи SQL для новых событий.

Я хочу отображать только даты, предшествующие текущей дате

В настоящее время у меня есть:

SELECT * FROM eventsDB ORDER BY eventdate ASC LIMIT 30";

Но я полагаю, мне нужно добавить что-то вроде:

WHERE eventdate > NOW()

Для записи вышеупомянутое не работает note

note: ($ eventdate = дата события)

CRONTAB:

    <?php
class simpleCMS {

  var $host;
  var $username;
  var $password;
  var $table;

  public function display_public() {
    $q = "SELECT * 
          FROM eventsDB
          WHERE eventdate > UNIX_TIMESTAMP()
          ORDER BY eventdate ASC
          LIMIT 30";
    $r = mysql_query($q);

    if ( $r !== false && mysql_num_rows($r) > 0 ) {
      while ( $a = mysql_fetch_assoc($r) ) {
        $title = stripslashes($a['title']);
        $author = stripslashes($a['author']);
        $bodytext = stripslashes($a['bodytext']);
        $eventdate = stripslashes($a['eventdate']);
        $created = stripslashes($a['created']);


        $entry_display .= <<<ENTRY_DISPLAY

    <div class="post">
        <table class="eventstable" cellspacing="0" cellpadding="0">
  <tr>
    <td><img src="media/icons/icon_calendar.gif"/>  <b>$title </b></td>
    <td class="right">$eventdate </td>
  </tr>
  <tr>
    <td colspan="2" class="small">$bodytext <i>by $author</i></td>
  </tr>
</table>
    </div>

ENTRY_DISPLAY;
      }
    } else {
      $entry_display = <<<ENTRY_DISPLAY

    <h2> Your brand new Events Page! </h2>
    <p>
      No entries have been made yet.
      Follow my instructions to make a new event!
    </p>

ENTRY_DISPLAY;
    }
    $entry_display .= <<<ADMIN_OPTION

    <p class="admin_link">
      <a href="{$_SERVER['PHP_SELF']}?admin=97538642"></a>
    </p>

ADMIN_OPTION;

    return $entry_display;
  }

  public function display_admin() {
    return <<<ADMIN_FORM

    <form action="{$_SERVER['PHP_SELF']}" method="post">

      <label for="title">Title:</label><br />
      <input name="title" id="title" type="text" maxlength="150" />
      <div class="clear"></div>

      <label for="bodytext">Body Text:</label><br />
      <textarea name="bodytext" id="bodytext"></textarea>
      <div class="clear"></div>

      <label for="author">Author:</label><br />
      <input name="author" id="author" type="text" maxlength="100" />
      <div class="clear"></div>

      <label for="eventdate">Date (DD/MM/YY):</label><br />
      <input name="eventdate" id="eventdate" type="text" maxlength="100" />
      <div class="clear"></div>

      <input type="submit" value="Create This Event!" />
    </form>

    <br />

    <a href="../events.php">Back to Events</a>

ADMIN_FORM;
  }

  public function write($p) {
    if ( $_POST['title'] )
      $title = mysql_real_escape_string($_POST['title']);
    if ( $_POST['bodytext'])
      $bodytext = mysql_real_escape_string($_POST['bodytext']);
    if ( $_POST['author'])
      $author = mysql_real_escape_string($_POST['author']);
    if ( $_POST['eventdate'])
      $eventdate = mysql_real_escape_string($_POST['eventdate']);
    if ( $title && $bodytext && $author ) {
      $created = time();
      $sql = "INSERT INTO eventsDB VALUES('$title','$bodytext','$created','$author','$eventdate')";
      return mysql_query($sql);
    } else {
      return false;
    }
  }

  public function connect() {
    mysql_connect($this->host,$this->username,$this->password) or die("Could not connect. " . mysql_error());
    mysql_select_db($this->table) or die("Could not select database. " . mysql_error());

    return $this->buildDB();
  }

  private function buildDB() {
    $sql = <<<MySQL_QUERY
CREATE TABLE IF NOT EXISTS eventsDB (
title       VARCHAR(150),
bodytext    TEXT,
created     VARCHAR(100),
author      VARCHAR(100),  
eventdate   VARCHAR(100),
)
MySQL_QUERY;

    return mysql_query($sql);
  }
}
?>

Ответы [ 3 ]

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

Вы можете сохранить поле eventdate как метку времени UNIX, а затем легко сравнить его в своих запросах.

SELECT ... WHERE `eventdate` > NOW() ...

и отформатировать его с помощью функции php date:

date('DD/MM/YY', $eventdate);

вот руководство: PHP Date Функция

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

Исходя из нашего небольшого обсуждения выше, кажется, что проще всего сделать ваше поле eventdate типом данных INT.Таким образом, когда вы берете пользовательский ввод как строку (например, «15/03/2011»), вы можете запустить этот ввод через функцию PHP strtotime() и получить из нее временную метку UNIX.

<?php

$eventts = strtotime($_POST["eventdate"]);
$q = "UPDATE eventsDB SET eventdate = ".$eventts." WHERE keyfield = whatever";
$r = mysql_query($q);

?>

Обратите внимание, что strtotime() возвращает INT (или логическое значение FALSE), поэтому мы не настраиваем вас для атаки SQL-инъекцией выше.Чтобы запросить базу данных, вы можете сделать следующее:

<?php

$q = "SELECT *
      FROM eventsDB 
      WHERE eventdate > UNIX_TIMESTAMP() 
      ORDER BY eventdate ASC
      LIMIT 30";
$r = mysql_query($q);

?>

Чтобы ответить на ваш вопрос в комментариях к этому ответу:

if ( $_POST['eventdate'])
  $eventdate = mysql_real_escape_string($_POST['eventdate']);

будет заменен на

if ( $_POST['eventdate'])
  $eventdate = strtotime($_POST['eventdate']);

Обратите внимание, что для производственной системы я действительно не рекомендовал бы размещать код администратора на той же странице, что и код дисплея, и вам следует использовать функцию isset(), чтобы проверить,была установлена ​​переменная массива $_POST (чтобы вы не вызывали всевозможные предупреждения или уведомления в журналах веб-сервера).


Чтобы отобразить дату, вы должны использовать функцию PHP date()в частности:

$entry_display = date("d/m/Y", $eventdate);

Где $eventdate - это отметка времени UNIX, которую вы извлекли из базы данных.

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

База данных используется или хранит данные.PHP (или то, что вы выбрали) используется для взаимодействия с пользователем.

Если вы хотите сохранить дату, вы должны использовать тип данных date.

Как вы хотите отобразитьdate, соответствует вашему PHP-коду.

Возможно, вы хотите показывать дату в разных форматах, в зависимости от посетителя, или, возможно, в формате ISO, чтобы весь мир мог ее прочитать: YYYY-MM-DD

Итак, ваш запрос в значительной степени правильный:

SELECT * 
FROM eventsDB 
WHERE  eventdate > NOW()
ORDER BY eventdate ASC 
LIMIT 30

Обратите внимание, что использование 'SELECT *' не рекомендуется для производственного кода.Выбирайте только нужные вам столбцы - это может означать лучшее использование индексов и меньшее количество данных, передаваемых между вашей базой данных и сервером приложений.

...