2011-10-20 11 views
0

作成しているコミュニティのWebサイトのイベントページを作成しています。これにより、新しいイベントの新しいSQLエントリを作成できます。「ローカルイベント」ページの現在の日付以降にSQLエントリを表示させる

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

しかし、私はのようなものを追加することがあるとします:

WHERE eventdate > NOW() 

私が欲しいの表示のみが

は、現在私が持っている先に現在の日付の日付にあります

記録上の上記のdoesnt仕事↑

注:($の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); 
    } 
} 
?> 
+0

どのようにeventdateを保存していますか?それはUNIXタイムスタンプですか?日付文字列? – Crontab

+0

現在はVARCHAR 'DD/MM/YY'になっています。私はかなりSQLとPHPに新しいです – hamishl

+0

日付を文字列ではなく番号として保存する場合は、YYYYMMDDを格納することを検討してください。そうすれば、簡単な日付比較や並べ替えを行うことができます。時間情報が含まれている場合は、DATETIMEまたはTIMESTAMPデータ型を使用することができます。 – Crontab

答えて

0

は、それが最も簡単な方法のように思える:ここ

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

は手動です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']); 

に置き換えることになるデータベースを照会するには、その後、これを行うことができます実動システムの場合、I は実際にはで、管理コードi n表示コードと同じページで、isset()関数を使用して$_POST配列変数が設定されているかどうかを確認してください(Webサーバーのログにすべての種類の警告または通知が表示されないようにする必要があります)。


は、具体的には、あなたがPHP date()機能を使用したい、日付を表示するには、次の $eventdateは、データベースから取得したUNIXタイムスタンプである

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

+0

ありがとうcrontab!本当に便利な – hamishl

+0

crontab私の質問に私のコードを入れて、あなたは私にどこに: を教えてくれますか? $ eventts = strtotime($ _ POST ["eventdate"]); $ q = "UPDATE eventsDB SET eventdate ="。$イベント。 "WHERE keyfield = whatever"; $ r = mysql_query($ q); 。あなたが提案した ? – hamishl

+0

私は自分の答えを編集して、あなたが求めているものを反映させます。 – Crontab

0

データベースを使用したり、データを記憶しています。 PHP(または使用するために選択したもの)は、ユーザーと対話するために使用されます。

日付を保存する場合は、日付データ型を使用する必要があります。

どのように日付を表​​示するかは、PHPコードによって決まります。

は、おそらくあなたはそれを読むことができるので、世界のすべてをISO形式の訪問者に応じて、異なるフォーマットの日付、または可能性を示したいと思います:YYYY-MM-DD

だから、あなたのクエリはかなり正確です:

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

プロダクションコードでは「SELECT *」を使用しないことをお勧めします。必要な列のみを選択してください。これは、データベースとアプリケーションサーバー間で転送される索引の使用率を向上させ、データを少なくすることを意味します。

+0

ご協力いただきありがとうございます! :D – hamishl

0

フィールドには、UNIXのタイムスタンプとしてeventdateフィールドを格納し、照会で簡単に比較することができます。

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

、あなたは、PHP date機能でそれをフォーマットすることができます:上記の私たちの小さな議論に基づいてPHP Date Function

+0

ありがとう、そのようなクイックレスポンス:今すぐ試してみてください – hamishl

関連する問題